2017-11-18 1 views
0

Der folgende Code gibt Fehler ORA-00942: table or view does not exist zurück, ich denke, weil PL/SQL-Laufzeit-Engine (oder etwas, was ich nicht weiß) versucht, table_in als eine Tabelle behandeln warum sollte es so sein, ich habe bereits table_in als Variable deklariert.Variable wird nicht ersetzt (lernen Dynamic PL/SQL)

Die Tabelle ex26011601 existiert mit Werten im selben Schema.

set serveroutput on 

declare 
    function tabcount (table_in in varchar2) 
     return pls_integer 
    is 
     l_return pls_integer; 
    begin 
     select count(*) into l_return from table_in; 
     return l_return; 
    end; 
begin 
    dbms_output.put_line(tabcount('ex26011601')); 
end; 

Ich verstehe EXECUTE IMMEDIATE würde den Zweck lösen. Was ich versuche zu erhalten, ist, warum es notwendig ist und was mit der aktuellen Aussage falsch ist, dass 'table_in' nicht als Variable behandelt werden kann, selbst nachdem sie im Bereich deklariert wurde. Oder warum wird dort keine Variable erwartet?

+0

Es ist wegen Ihrer select-Anweisung –

+0

PL/SQL nur wahllos keine beliebigen Text ersetzen, die übereinstimmen passiert Parametername. Im Kontext parametrisierter Cursor wertet es nur Bind-Variablen aus. –

Antwort

2

Ich verstehe IMMEDIATE EXECUTE würde dem Zweck lösen. Was ich bin versuchen zu bekommen ist, warum ist es notwendig und was ist falsch mit aktuellen Anweisung, die 'table_in' nicht als Variable behandelt werden konnte, auch nachdem im Geltungsbereich deklariert wird.

Wie pro Oracle Dokumentation: Static SQL

A PL/SQL statischen SQL-Anweisung kann eine PL/SQL-Kennung hat, wo ihr SQL Gegenstück einen Platzhalter für eine Bindevariable haben kann. Die PL/SQL-Kennung muss entweder eine Variable oder eine formale parameter.To Verwendung PL/SQL-Bezeichner für Tabellennamen, Spaltennamen identifizieren und so weiter, verwenden Sie die EXECUTE IMMEDIATE-Anweisung

In PL/SQL, Sie müssen dynamische SQL ausgeführt werden, wenn:

  • SQL, dessen Text bei der Kompilierung

    zum Beispiel nicht bekannt ist, eine SELECT-Anweisung, die eine Kennung, die zum Zeitpunkt der Kompilierung (wie ein Tabellenname) ist nicht bekannt, enthält oder eine WHERE-Klausel in , die die Anzahl der Unterklauseln ist zur Kompilierzeit unbekannt.

  • SQL, die nicht als statische SQL unterstützt wird

Dynamic SQL

+0

_SQL, deren Text zur Kompilierzeit unbekannt ist ._ geholfen –

-1

Ja, wie Sie sagten, Orakel pl/SQL-Syntax erlaubt dies nicht, übergeben Sie Tabellenname durch Variable. Wie Sie sagten auch nur Sie tun können, es durch dynamische SQL und führen Sie sofort:

execute immediate 'select count(*) from ' || table_in 
into l_return; 
+0

'table_in' ist eine Variable, die den Namen der Tabelle speichert. Ich versuche, die Gesamtzahl der Zeilen in der Tabelle zu zählen. –