Oracle存储过程inout参数问题 - 获得解决方案 - Typo错误

时间:2013-12-20 22:24:11

标签: sql oracle stored-procedures

我已成功创建以下存储过程:

CREATE OR REPLACE PROCEDURE FIRSTPROC (ID1 IN VARHAR2, ID2 IN NUMBER )
AS 
CURSOR FIRST_CUR AS
 SELECT id2val
 FROM 
 WHERE id1val = ID1;

BEGIN
  DBMS_OUTPUT.PUT_LINE(ID1);
  OPEN FIRST_CUR;
  FETCH FIRST_CUR INTO ID2;
  IF FIRST_CUR%NOTFOUND THEN
     ID2 := 0;   
  END IF;

END

执行时,我在ID1变量中将值传递为23,并且该值显示在DBMS_OUTPUT.PUT_LINE语句中。并且值存在于表中,但我没有得到结果

但是如果我在存储过程中对23进行硬编码,我就会得到这个值。很困惑。我上面遗漏的东西。

CREATE OR REPLACE PROCEDURE FIRSTPROC (ID1 IN VARHAR2, ID2 IN NUMBER )
AS 
CURSOR FIRST_CUR AS
 SELECT id2val
 FROM 
 WHERE id1val = 23;

BEGIN
  DBMS_OUTPUT.PUT_LINE(ID1);
  OPEN FIRST_CUR;
  FETCH FIRST_CUR INTO ID2;
  IF FIRST_CUR%NOTFOUND THEN
     ID2 := 0;   
  END IF;

END

2 个答案:

答案 0 :(得分:1)

一些问题:

  1. VARHAR2我们输了一个错字,应该是VARCHAR2
    • 您可以使用table_name.column_name%TYPE指定数据类型以引用相应的表列。
  2. 该过程不会输出任何内容 - 您需要将其中一个IN参数更改为OUT(或IN OUT参数。)
  3. 您的查询未指定表名。
  4. 您可以使用SELECT ... INTO ...而不是CURSOR
  5. 这样的事情:

    CREATE OR REPLACE PROCEDURE FIRSTPROC (
      ID1 IN  table_name.id1val%TYPE,
      ID2 OUT table_name.id2val%TYPE
    )
    AS
    BEGIN
      DBMS_OUTPUT.PUT_LINE(ID1);
      SELECT id2val
      INTO   ID2
      FROM   table_name
      WHERE  id1val = ID1;
    EXCEPTION
      WHEN NO_DATA_FOUND THEN
        ID2 := 0; -- Or you could use NULL
      WHEN TOO_MANY_ROWS THEN
        ID2 := 0; -- Or you could use NULL
    END;
    /
    

答案 1 :(得分:0)

首先,您已将ID2声明为IN参数,因此不会返回结果。您需要将ID2声明为IN OUT或OUT参数。 (顺便说一句,你提供的代码甚至不会编译,因为“VARHAR2”是一个错字)。第二个程序也是这样,所以我不明白这是怎么回事,所以你必须要有其他的东西。