我已成功创建以下存储过程:
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
答案 0 :(得分:1)
一些问题:
VARHAR2
我们输了一个错字,应该是VARCHAR2
。
table_name.column_name%TYPE
指定数据类型以引用相应的表列。IN
参数更改为OUT
(或IN OUT
参数。)SELECT ... INTO ...
而不是CURSOR
。这样的事情:
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”是一个错字)。第二个程序也是这样,所以我不明白这是怎么回事,所以你必须要有其他的东西。