Oracle传递表变量

时间:2013-12-20 19:41:13

标签: sql oracle stored-procedures

我是Oracle存储过程的新手。我写了下面的存储过程并给出结果。

我相信表变量和参数变量或同名。如何在不更改变量名的情况下处理这种情况.O

CREATE OR REPLACE PROCEDURE procedval (Code IN varchar(50),Id1 OUT INTE)
AS
BEGIN

 Id1 := 0;

SELECT Id1 INTO id1
FROM tabl1
WHERE Code = Code;

END;

4 个答案:

答案 0 :(得分:1)

尝试SELECT tabl1.Id1 INTO Id1...

答案 1 :(得分:0)

试试这个:

with t as 
   (SELECT Id1 as New_Id1, Code as New_code) 
   FROM tabl1)
select New_Id1 into Id1 
from t
WHERE New_code = Code;

另一个解决方案就是这个:

execute immediate 'select Id1 from tabl1 where Code = :b' into Id1 using Code;

答案 2 :(得分:0)

你无法做任何事情,这就是为什么要制定标准的变量声明。 其中之一是,PL/SQL变量应以l_(本地)或g_(全局)为前缀

数据库在判断哪个操作数(左或右)是db列或变量时最终会出现歧义。

另外,为了添加更多亮点,查询中使用的任何变量都将被视为bind variable implicitly.

答案 3 :(得分:0)

一些问题:

  1. 应使用VARCHAR datatype should not be usedVARCHAR2 - VARCHAR当前与VARCHAR2同义,但VARCHAR数据类型计划重新定义为单独的数据用于可变长度字符串的类型与不同的比较语义相比(即对于VARCHAR2,空字符串等同于NULL值,但是当重新定义VARCHAR时,空VARCHAR }将不等同于NULL)。
  2. 您没有在过程的标题中指定数据类型的大小 - 因此,如果您要将输入声明为命名数据类型,则只需使用VARCHAR2而不是VARCHAR(50)
    • 您可以改为引用表格列的%TYPE - tabl1.code%TYPEtabl1.id1%TYPE
  3. 您不需要初始化Id1 - 这将由SELECT语句完成(如果您需要异常处理程序,那么您可以根据需要在那里定义它。)
  4. 你应该有一个异常处理程序。
  5. 类似的东西:

    SQL Fiddle

    Oracle 11g R2架构设置

    CREATE TYPE INTE IS OBJECT( x NUMBER(3), y NUMBER(3) )
    /
    
    CREATE TABLE tabl1 (
      code VARCHAR2(50),
      id1  INTE
    )
    /
    
    INSERT INTO tabl1 VALUES ( 'a', INTE( 3, 4 ) )
    /
    
    CREATE OR REPLACE PROCEDURE procedval (
      code IN  tabl1.code%TYPE,
      Id1  OUT tabl1.id1%TYPE
    )
    AS
    BEGIN
      SELECT t.Id1
      INTO   Id1
      FROM   tabl1 t
      WHERE  t.Code = code;
    EXCEPTION
      WHEN NO_DATA_FOUND THEN
        Id1 := NULL;
    END;
    /