2017-06-19 1 views
0

Ich versuche, alle Tabellen zu erhalten, wo bank_id 01. ist ich geschrieben habe den folgenden BlockWhere-Klausel in dynamischem SQL

DECLARE 

cursor cBankId is 
    select owner||'.'||table_name from all_tab_columns where column_name = 'BANK_ID'; 
     v_table  all_tab_columns.table_name%TYPE; 
     vcount varchar2(50); 

BEGIN 

    open cBankId; 
    loop 
     fetch cBankId into v_table; 
     exit when cBankId%notfound; 

execute immediate 'select count(*) from ' || v_table into vcount || ' where bank_id = 01'; 


IF vcount > 0 THEN 
    DBMS_OUTPUT.PUT_LINE (v_table); 
END IF; 

end loop; 
    close cBankId; 

END; 

Ich möchte wissen, wie zu setzen, wo Klausel in der unmittelbaren Anweisung auszuführen. Ich erhalte den Fehler ORA-06550: Zeile 15, Spalte 67: PLS-00103: Das Symbol "|" wenn einer der folgenden Werte erwartet wird:

. (,%; Rückkehr Rückkehr

Antwort

-1

Verwendung Sie können nicht dynamisch eine Variable für den Tabellennamen verwenden, statt:

DECLARE 

cursor cBankId is 
select owner||'.'||table_name from all_tab_columns where column_name = 'BANK_ID'; 
    v_table  all_tab_columns.table_name%TYPE; 
    vcount varchar2(50); 
    v_sql varchar2(1000); 


BEGIN 

open cBankId; 
loop 
    fetch cBankId into v_table; 
    exit when cBankId%notfound; 

v_sql := 'select count(*) from ' || v_table || ' into vcount where bank_id = 01'; 

execute immediate v_sql; 

IF vcount > 0 THEN 
    DBMS_OUTPUT.PUT_LINE (v_table); 
END IF; 

end loop; 
    close cBankId; 

END; 
+0

Sie eine Variable für den Tabellennamen verwenden können, auch tut dies Vorspiel rk? – Aleksej

0

Sie müssen nur die Reihenfolge ändern Sie die Teile Ihrer Abfrage zu schreiben sind . Wenn die dynamische SQL verwenden, müssen Sie etwas wie folgt aus:

SQL> declare 
    2  v_table varchar2(30); 
    3  vCount number; 
    4 begin 
    5  v_table := 'dual'; 
    6  execute immediate 'select count(*) from ' || v_table || ' where 1=1' into vcount; 
    7  -- 
    8  dbms_output.put_line('vCount: ' || vCount); 
    9 end; 
10 
11/
vCount: 1 

PL/SQL procedure successfully completed. 

das heißt:. execute immediate 'select ... from ... where ...' INTO ...;

Verwandte Themen