2017-08-09 15 views
0

これはPL/SQLを知っている人にとってはおそらく簡単な質問です。 私が入力中varchar型の配列を受け取り、ストアドプロシージャがあります。ループ内で選択を実行するPL/SQLと戻りカーソル?

TYPE MULTI is table of VARCHAR(15) index by BINARY_INTEGER; 


PROCEDURE MYPROC(
    SINGLE        IN  MULTI, 
    P_RESULT        OUT MY_PCK.MYCURSOR, 
    P_SOMETHING       OUT VARCHAR2, 
); 

を私は他のケースでそれをテストしているので、カーソルは動作しますが、これは、配列パラメータを持つ最初のです。

私は体に問題があります。私はどのように私はカーソルから選択から得る各値を割り当てることができますか?

BEGIN 
    FOR i IN SINGLE.first .. SINGLE.last 
    LOOP 
    --BEGIN OPEN P_RESULT FOR this --this on left gives me error 
           SELECT MT.DESCR INTO P_SOMETHING 
           FROM MYTABLE1 MT 
           WHERE MT.IDS = SINGLE(i) 
           AND and rownum < 2; 
--dbms_output.put_line(SINGLE(i)); --if i use this instead of select i get the values i send to this procedure. 
    END LOOP; 

私も試してみました:

SELECT MT.DESCR INTO P_RESULT but gives error 

を私が間違ってやっていますか? アドバイスありがとうございます。

+0

あなたにはどんなエラーがありますか? – I3rutt

+0

PLS-00428:このSELECT文ではINTO句が必要です。もし私が次のようなinto句を使用していれば:MT_DESCR INTO P_SOMETHINGここでP_SOMETHINGはvarchar2の出力です。ORA-01422:exact fetchは要求された行数以上を返します。私は本当にこれを解決する方法がわかりません... –

+0

すぐに解決するには、WHERE句でこれを追加してみてください:rownum <2 – I3rutt

答えて

0

11gのSQL文でPL/SQLコレクション型を使用することはできません。 SQLコレクション型を作成したり、すでにアクセス権を持っているもの(適切な文字列長を持つもの)を見つけ出し、少なくともメカニズムを検証するために使うことができます。

たとえば、table of varchar2(30)と定義されているタイプSYS.HSBLKNAMLSTのローカル変数が使用されます。これは、独自のPL/SQLタイプの文字列の長さに十分一致します。この変数は、あなたの渡されたPL/SQLタイプから移入され、そしてそれは、カーソルを開くために、クエリで使用されます。

PROCEDURE MYPROC(
    SINGLE        IN  MULTI, 
    P_RESULT        OUT MY_PCK.MYCURSOR 
) IS 
    LOCAL_COLL SYS.HSBLKNAMLST := SYS.HSBLKNAMLST(); 
BEGIN 
    FOR i IN SINGLE.first .. SINGLE.last 
    LOOP 
    LOCAL_COLL.extend(); 
    LOCAL_COLL(LOCAL_COLL.last) := SINGLE(i); 
    END LOOP; 

    OPEN P_RESULT FOR 
    SELECT MT.DESCR 
    FROM MYTABLE1 MT 
    LEFT JOIN TABLE(LOCAL_COLL) LC 
    ON LC.COLUMN_VALUE = MT.IDS 
    WHERE LC.COLUMN_VALUE IS NULL; 

END; 

私はあなたががあなたのループの中で示したクエリについて少し困惑しています。配列の各要素のカーソルを再度開こうとしているようですが、各要素のクエリの結果を同じカーソルに追加しようとしていたかもしれません - !=はすべての行がいくつかのポイント。私はIDSの値が配列にないすべてのレコードを取得しようとしていると思います。あなたが実際にそれからあるものすべてをしたい場合、それは次のようになります。あなたは、組み込みのどの種類の参照データ辞書を照会することにより、あなたに利用できる可能

OPEN P_RESULT FOR 
    SELECT MT.DESCR 
    FROM TABLE(LOCAL_COLL) LC 
    JOIN MYTABLE1 MT 
    ON MT.IDS = LC.COLUMN_VALUE; 

例:

select owner, type_name, coll_type, elem_type_name, length 
from all_coll_types 
where elem_type_name = 'VARCHAR2' 
and coll_type = 'TABLE' 
and owner = 'SYS' 
order by length; 

それを可能ならば独自のSQL型を作成することをお勧めします。

+0

!=は間違いでした(テスト中...)、申し訳ありません。あなたが書いたことを試してみるよ。 –

関連する問題