pl/sqlプロシージャの実装に奇妙な問題があります。
私のプロシージャには4つのvarchar入力パラメータがあり、次のようなクエリを使用してテーブルからid値を抽出します。
SELECT ID INTO idvar FROM TABLE T WHERE T.NAME = pn AND T.SUR = ln;
この表では、nameとsurは一意のキーです。したがって、いくつかの入力パラメーター(pn、ln)については、1つの行のみを取得することを期待していますが、そうではありません。実際、最初の条件のみが処理され、2番目の条件は処理されないようです。
私が持っている私のテーブルでは、このテスト行は次のとおりです。
ID | NAME | SUR
1 | JO | SOME THING
2 | JO | OTHER ONE
3 | BO | SOME THING
私の手順で合格した場合
('JO', 'SOME THING')
ID:1と2を取得します。
ただし、値を渡すと
('BO', 'SOME THING')
ID3のみを取得します。
明らかに、前のクエリでエラー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;
/
ありがとうございました