3

pl/sql コードのブロックを動作させるのに問題があります。手順の冒頭で、どのチェックボックスがチェックされているかについて、oracle apex アプリケーションからいくつかのデータを取得します。チェックボックスを含むレポートは動的に生成されるため、ループする必要があります

APEX_APPLICATION.G_F01 

次のようなカンマ区切りの文字列をリストして生成します

v_list VARCHAR2(255) := (1,3,5,9,10);

後でそのリストを照会し、 v_list を IN 句に配置したい

SELECT * FROM users 
WHERE user_id IN (v_list);

もちろん、これはエラーをスローします。私の質問は、v_list を pl/sql プロシージャ内のクエリの IN 句に挿入できるようにするには、何に変換できますか?

4

4 に答える 4

5

usersが小さく、カンマが含まれていない場合はuser_id、次を使用できます。

SELECT * FROM users WHERE ',' || v_list || ',' LIKE '%,'||user_id||',%'

でインデックスを使用できないため、このクエリは最適ではありませんuser_id

NUMBER直接クエリできるテーブルを返すパイプライン関数を使用することをお勧めします。例えば:

CREATE TYPE tab_number IS TABLE OF NUMBER;
/
CREATE OR REPLACE FUNCTION string_to_table_num(p VARCHAR2)
   RETURN tab_number
   PIPELINED IS
BEGIN
   FOR cc IN (SELECT rtrim(regexp_substr(str, '[^,]*,', 1, level), ',') res
                FROM (SELECT p || ',' str FROM dual)
              CONNECT BY level <= length(str) 
                                  - length(replace(str, ',', ''))) LOOP
      PIPE ROW(cc.res);
   END LOOP;
END;
/

次に、次のようなクエリを作成できます。

SELECT * 
  FROM users 
 WHERE user_id IN (SELECT *
                     FROM TABLE(string_to_table_num('1,2,3,4,5'));
于 2012-10-09T13:03:44.697 に答える
4

XMLTABLE次のように使用できます

SELECT * FROM users 
WHERE user_id IN (SELECT to_number(column_value) FROM XMLTABLE(v_list));
于 2014-12-31T12:04:38.617 に答える
0

個人的に、私はこのアプローチが好きです:

with t as (select 'a,b,c,d,e' str from dual)
--
select val
from t, xmltable('/root/e/text()'
                 passing xmltype('<root><e>' || replace(t.str,',','</e><e>')|| '</e></root>')
                 columns val varchar2(10) path '/'
                )

Thread: Split Comma Delimited String Oracleの他の例の中で見つけることができます。

さらに多くのオプションが必要な場合は、OTN plsql フォーラムにアクセスしてください。

于 2012-10-09T13:37:18.173 に答える
0

私もその解決策を見つけようとしましたが、成功しませんでした。クエリを文字列として作成し、EXECUTE IMMEDIATE を実行できます。 http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/dynamic.htm#i14500を参照してください。

そうは言っても、IN 句の引数が副選択になる可能性があることに気付きました。

SELECT * FROM users 
WHERE user_id IN (SELECT something FROM somewhere)

チェックボックスの値をストアドファンクションとして公開することは可能ですか? 次に、次のようなことができるかもしれません

SELECT * FROM users
WHERE user_id IN (SELECT my_package.checkbox_func FROM dual)
于 2012-10-09T13:03:25.947 に答える