我有一个奇怪的问题,实现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;
/
谢谢
答案 0 :(得分:3)
您的参数和表格字段之间可能存在冲突吗?
通过添加过程名称作为参数范围来更改它:
T.NAME = myproc.pn AND T.SUR = myproc.ln
答案 1 :(得分:2)
我用你的示例表测试了你的第一个语句!在我的机器上它可以工作。但这是一个Oracle 10g数据库。
修改强>: 我重新编写了你的程序,在我的机器上,该版本运行良好!
create or replace
PROCEDURE myproc (
pn in VARCHAR2,
ln in VARCHAR2,
other in VARCHAR2,
datarif in VARCHAR2
)
AS
idvar NUMBER;
BEGIN
SELECT ID INTO idvar FROM TEST T WHERE T.NAME = pn AND T.SUR = ln;
DBMS_OUTPUT.put_line ( 'OUTLOOP: ID='||idvar );
END myproc;
答案 2 :(得分:2)
“......因为我更改了对象的名称”
也许您的某些参数与某些列具有相同的名称。
例如,如果您的程序如下所示:
CREATE OR REPLACE PROCEDURE myproc (
pn in VARCHAR2,
sur in VARCHAR2,
other in VARCHAR2,
datarif in VARCHAR2
)
...
SELECT ID INTO idvar FROM TABLE T WHERE T.NAME = pn AND T.SUR = sur;
...
您会收到TOO_MANY_ROWS错误,因为条件“T.SUR = sur”与“T.SUR = T.SUR”具有相同的效果。