2016-05-09 8 views
0

私はその配列をループし、それを私のクエリのNOT IN部分で使用したいと思います。 問題は3つのレコードを返します。それは2を返す必要があります。 私の問題はどのように私はpl/sqlで配列を処理しているpl/sqlで文字列を構成するf

答えて

0

まず、javaで構築する文字列の最後に余分なカンマがあります。フラグを使用して削除することができます。

String separator = ""; 
for(String s : tableNamesToExclude){ 
     sb.append(separator).append("'").append(s.replace("'", "''")).append("',"); 
     separator = ","; 
} 

このように、最初の要素を除くすべての要素の前にセパレータ '、'が追加されます。

第2に、tablenames変数で終わる文字列は、javaで構築した文字列とまったく同じです(dbms_output.put_line関数を使用して検証できます)。したがって、 "not in"演算子は、この文字列と同じ名前のテーブルが存在するかどうかをチェックしますが、これは失敗します。

私はあなたの問題の厳密解がここで説明されていることを考える:https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:110612348061

+0

私はその例を使ってそれを理解できません。申し訳ありません。 – icelated

+0

オクラホマ、私は理解していると思う...あなたはoracleでjava stringbuilderの結果を使わないで... – Igor

+0

ループの後にtablenamesの値を表示できますか? – Igor

0

あなたは私はあなたが必要な出力を実現することが可能な技術のいくつかを説明しようとしていPLSQLをタグ付けしたよう。スニペットの下の希望が役立ちます。

var p_ref refcursor; 
SET serveroutput ON; 
DECLARE 
TYPE lv_var 
IS 
    TABLE OF VARCHAR2(100); 
    lv_tab lv_var; 
    lv_str VARCHAR2(100); 

    --Schema level object 
    lv_num NUMBER_NTT; 
    --Schema level object 
BEGIN 
    SELECT LEVEL ||'AV' BULK COLLECT INTO lv_tab FROM DUAL CONNECT BY LEVEL < 10; 
    --There are two ways in whcih you can loop 
    -- 1 Just try to make a string whcih can be used in IN clause 
    FOR I IN lv_tab.FIRST..lv_tab.LAST 
    LOOP 
    lv_str:=lv_str||','''||lv_tab(i)||''''; 
    END LOOP; 
    dbms_output.put_line(SUBSTR(lv_str,2,LENGTH(lv_str))); 
    --This lv_str can be used in any NOT IN condition 
    --2 WAY is bit more efficient but here in this case you wont bwe able to do it via PLSQL object. We need 
    -- to create a schema level nested table object then then use it in NOT IN clause 
    SELECT LEVEL BULK COLLECT 
    INTO lv_num 
    FROM DUAL 
    CONNECT BY LEVEL < 2; 
    OPEN :p_ref FOR SELECT * FROM 
    (SELECT 1 NM FROM DUAL 
    UNION 
    SELECT 2 NM FROM DUAL 
    UNION 
    SELECT 3 NM FROM DUAL 
)A WHERE A.NM NOT IN 
    (SELECT COLUMN_VALUE FROM TABLE(lv_num) 
); 
END; 
print p_ref; 
+0

私はそれを理解しました。私がする必要があったのは:tc.table_name NOT IN(SELECT * FROM table(names)); – icelated

+0

Ohkだから、もしそれが助けてくれれば答えを受け入れることができれば、他の人にも役立つでしょう。 –

関連する問題