0


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

ありがとうございました

4

3 に答える 3

4

たぶん、あなたのパラメータとテーブルのフィールドの間に衝突がありますか?

パラメータのスコープとしてプロシージャの名前を追加して変更します。

 T.NAME = myproc.pn AND T.SUR = myproc.ln
于 2011-01-13T10:20:45.183 に答える
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;
...

条件「T.SUR=sur」は「T.SUR=T.SUR」と同じ効果があるため、TOO_MANY_ROWSエラーが発生します。

于 2011-01-13T14:40:44.967 に答える
2

サンプルテーブルを使用して最初のステートメントをテストしました。そして私のマシンではそれは動作します。しかし、それはOracle10gデータベースです。

編集:私はあなたの手順を書き直しました、そして私のマシンではそのバージョンはうまくいきます!

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;
于 2011-01-13T10:24:27.097 に答える