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

Sql Oracle存储过程inout参数问题-获得解决方案-键入错误,sql,oracle,stored-procedures,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%N

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

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

首先,您已将ID2声明为IN参数,因此不会返回结果。您需要将ID2声明为IN OUT或OUT参数。(顺便说一句,您提供的代码甚至不会编译,因为“VARHAR2”是一个输入错误)。第二个过程也是这样,所以我不明白这是怎么可能的,所以你肯定还有别的事情要做

一些问题:

  • VARHAR2
    我们输入了一个拼写错误,应该是
    VARCHAR2
    • 您可以使用
      table\u name.column\u name%TYPE
      指定引用相应表列的数据类型
  • 该过程不输出任何内容-您需要将
    IN
    参数之一更改为
    OUT
    (或
    IN-OUT
    参数)
  • 查询未指定表名
  • 您可以使用
    选择。。。进入…
    而不是
    光标
  • 大概是这样的:

    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;
    /
    

    表中是否有列
    ID1
    ?只是为了确定一下。另一方面,你的程序很好。