我在实现 pl/sql 过程时遇到了一个奇怪的问题。
我的过程有四个 varchar 输入参数,并从表中提取一个 id 值,查询如下:
SELECT ID INTO idvar FROM TABLE T WHERE T.NAME = pn AND T.SUR = ln;
在此表中,name 和 sur 是唯一键。所以对于几个输入参数(pn,ln),我希望只获得一行,但事实并非如此。确实,似乎只处理了第一个条件,而第二个条件没有。
在我的表中,这个测试行:
ID | NAME | SUR
1 | JO | SOME THING
2 | JO | OTHER ONE
3 | BO | SOME THING
如果在我的程序中我通过
('JO', 'SOME THING')
我获得 ID:1 和 2。
但是如果我传递值
('BO', 'SOME THING')
我只获得 ID 3。
显然,在前面的查询中,我得到了错误 ORA-01422,所以我先用游标定义替换它,然后用“for row in (query)”替换它:
CURSOR C IS
SELECT ID FROM TABLE T WHERE T.NAME = pn AND T.SUR = ln;
这种行为对我来说很奇怪,事实上,如果我只执行来自 sqlplus 或 toad 的查询,我会得到正确的结果。
Oracle 版本是 8.1。
提前致谢
#这是我的程序(我希望你没有发现不匹配,因为我更改了对象的名称):
CREATE OR REPLACE PROCEDURE myproc (
pn in VARCHAR2,
ln in VARCHAR2,
other in VARCHAR2,
datarif in VARCHAR2
)
AS
idT NUMBER;
idST NUMBER;
idSE NUMBER;
CURSOR C IS
SELECT ID
FROM TABLE T
WHERE
T.NAME = pn AND T.SUR = ln;
BEGIN
for x in ( SELECT ID
FROM TABLE T
WHERE
T.NAME = pn AND T.SUR = ln )
loop
DBMS_OUTPUT.put_line('INFOR:' || x.ID);
end loop;
open C;
loop
fetch C into idT;
exit when C%NOTFOUND;
DBMS_OUTPUT.put_line('INLOOP:ID='||idT);
end loop;
close C;
DBMS_OUTPUT.put_line ( 'OUTLOOP: ID='||idT );
EXCEPTION
WHEN NO_DATA_FOUND THEN
NULL;
WHEN TOO_MANY_ROWS THEN
RAISE_APPLICATION_ERROR(-20001, 'Exact Fetch Returned many Rows');
WHEN OTHERS THEN
DBMS_OUTPUT.put_line('ERROR');
ROLLBACK;
RAISE;
END myproc;
/
谢谢