2016-06-16 5 views
0

以下のクエリを実行しようとしていますが、結果が得られません。oracleのIN関数へのカンマ区切り値

私は何をしているのか分かりますか?

DECLARE 
    object_types VARCHAR2(200); 
    v_object_types VARCHAR2(200); 
    l_count number; 
BEGIN 
    object_types :='TABLE,VIEW'; 
    select ''''||regexp_replace(object_types, '()*(,)()*',''',''')||'''' 
     into v_object_types from dual; 
    dbms_output.put_line(to_char(v_object_types)); 
    SELECT count(*) into l_count 
    FROM all_objects o where o.object_type IN ('||v_object_types||'); 
    dbms_output.put_line(l_count); 

END; 
+0

あなたはどのような結果を期待していますか? [** How-to-Ask **](http://stackoverflow.com/help/how-to-ask) \t \t [** START **](http ://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/)質問品質を向上させ、より良い回答を得る方法を学ぼう。 –

+0

すべてのテーブルとビューの数ではなく、カウントを0に戻します。 –

+0

'' || v_object_types || ''のリテラル文字列を探していますが、どうしますか? – sstan

答えて

0
WHERE variable IN (1,2,3) 

はあなたが動的SQLを構築しようとしているが、代わりにあなたがIN句で単一の文字列リテラル'||v_object_types||'を使用している今

WHERE variable IN ('1,2,3') or 
WHERE variable IN ('||v_object_types||') 
+0

IN(v_object_types)でも失敗しています。 –

+0

それは文字列であるからです。このようなものが必要です。https://blogs.oracle.com/aramamoo/entry/how_to_split_comma_separated_string_and_pass_to_in_clause_of_select_statement –

0

を送信しているものとは異なっています。

あなたはそれコレクションを使用して行うことができます

Oracleのセットアップ

CREATE TYPE stringlist IS TABLE OF VARCHAR2(200); 
/

PL/SQL

DECLARE 
    object_types VARCHAR2(200) := 'TABLE,VIEW'; 
    v_object_types stringlist; 
BEGIN 
    SELECT TRIM(BOTH FROM REGEXP_SUBSTR(object_types, '[^,]+', 1, LEVEL)) 
    BULK COLLECT INTO v_object_types 
    FROM DUAL 
    CONNECT BY LEVEL <= REGEXP_COUNT(object_types, '[^,]+'); 

    FOR i IN 1 .. v_object_types.COUNT LOOP 
    dbms_output.put_line(v_object_types(i)); 
    END LOOP; 

    SELECT count(*) 
    INTO l_count 
    FROM all_objects 
    WHERE object_type MEMBER OF v_object_types; 

    dbms_output.put_line(l_count); 
END; 
/

または動的SQLを使用して:

DECLARE 
    object_types VARCHAR2(200) := 'TABLE,VIEW'; 
    v_sql   VARCHAR2(200); 
    l_count  INTEGER; 
BEGIN 
    v_sql := 'SELECT count(*) FROM all_objects WHERE object_type IN (' 
      || REGEXP_REPLACE(object_types, ' *(.+?) *(,|$)', '''\1''\2') 
      || ')'; 

    EXECUTE IMMEDIATE v_sql INTO l_count; 

    dbms_output.put_line(l_count); 
END; 
/
関連する問題