で値を返さないカーソルます文字列パラメータを渡しているので、文字列のリストではなく文字列として使用されます。ですから、カーソルは次のようなものになります
SELECT name
FROM S_US
WHERE US_ID IN ('EBN,BGE')
これはもちろん、必要なことはしません。 プロシージャとパラメータを渡す方法を変更する必要がある場合があります。あなたは文字列パラメータを保持したい場合は、一つの方法は次のようになります。
セットアップ:
SQL> CREATE TABLE S_US
2 (
3 US_ID,
4 NAME
5 ) AS
6 SELECT 'EBN', 'EBN name' FROM DUAL
7 UNION ALL
8 SELECT 'BGE', 'BGE name' FROM DUAL;
Table created.
手順:あなたは、文字列でそれを呼び出す必要があり
SQL> CREATE OR REPLACE PROCEDURE TEXT_MD_2(AS_IDS VARCHAR2) IS
2 vSQL varchar2(1000);
3 c sys_refcursor;
4 vName varchar2(16);
5 BEGIN
6 vSQL := 'SELECT name
7 FROM S_US
8 WHERE US_ID IN (' || AS_IDS || ')';
9 open c for vSQL;
10 loop
11 fetch c into vName;
12 if c%NOTFOUND then
13 exit;
14 end if;
15 DBMS_OUTPUT.PUT_LINE(vName);
16 END LOOP;
17 END;
18/
Procedure created.
既にIN
のパラメータリストにフォーマットされています。
SQL> EXEC TEXT_MD_2('''EBN'',''BGE''');
EBN name
BGE name
PL/SQL procedure successfully completed.
これは可能な方法の一例に過ぎず、これを行う方法ではありません。 この種のアプローチを使用する理由の1つとして、Justin Caveの言葉を考えてみてください。 "SQLインジェクションのためにセキュリティ上のリスクがあり、一定のハード解析による潜在的に大きなパフォーマンス上のペナルティがあります。
文字列を使って文字列を表現するのではなく、値リストを手続きに渡す方法をよく調べるべきだと思います。そうでインデックス化の有無、および、ストアドプロシージャ内かどうか、さまざまな方法でコレクションを定義することができ、ここでも
SQL> CREATE OR REPLACE TYPE tabVarchar2 AS TABLE OF VARCHAR2(16)
2/
Type created.
SQL>
SQL> CREATE OR REPLACE PROCEDURE TEXT_MD_3(AS_IDS tabVarchar2) IS
2 vSQL VARCHAR2(1000);
3 c SYS_REFCURSOR;
4 vName VARCHAR2(16);
5 BEGIN
6 FOR i IN (SELECT name
7 FROM S_US INNER JOIN TABLE(AS_IDS) tab ON (tab.COLUMN_VALUE = US_ID))
8 LOOP
9 DBMS_OUTPUT.PUT_LINE(i.name);
10 END LOOP;
11 END;
12/
Procedure created.
SQL>
SQL> DECLARE
2 vList tabVarchar2 := NEW tabVarchar2();
3 BEGIN
4 vList.EXTEND(2);
5 vList(1) := 'BGE';
6 vList(2) := 'EBN';
7 TEXT_MD_3(vList);
8 END;
9/
BGE name
EBN name
PL/SQL procedure successfully completed.
SQL>
;:ここ は、コレクションと同じことを行うことが可能な方法でありますこれは可能な方法のうちの1つに過ぎず、環境やニーズに応じて、必ずしも最適ではありません。
申し訳ありません。私は間違っています。 –
@FrancescoSerra申し訳ありませんが、私はあなたを理解していません – Moudiz
プロシージャに、コレクションではなくカンマを持つ単一の文字列を渡しています。 'us_id = 'EBN''または' us_id =' BGE''がある行ではなく、 'us_id = 'EBN、BGE''の行ではなく、コレクションを渡す必要がある行を見つけることが目標ですまたは入力パラメータを解析してコレクションにします。コレクションを受け入れるためにプロシージャのシグネチャを変更できますか(コールするアプリケーションはコレクション内を渡すことができますか)これは簡単なオプションです。 –