Frage

Wenn ich die folgenden in einer Oracle-Shell starten, es funktioniert

truncate table table_name

Aber wenn ich versuche, es in einer gespeicherten Prozedur zu setzen

CREATE OR REPLACE PROCEDURE test IS
BEGIN
    truncate table table_name;
END test;
/

es nicht mit

ERROR line 3, col 14, ending_line 3, ending_col 18, Found 'table', Expecting:  @   ROW  or   (   or   .   or   ;   :=

Warum?

War es hilfreich?

Lösung

Alle Aussagen DDL in Oracle PL / SQL sollte vor der Anweisung Immediate Execute verwenden. Daher sollten Sie verwenden:

execute immediate 'truncate table schema.tablename';

Andere Tipps

Neben ausführen sofort können Sie auch verwenden

DBMS_UTILITY.EXEC_DDL_STATEMENT('TRUNCATE TABLE tablename;');

Die Anweisung schlägt fehl, da die gespeicherte Prozedur DDL ausgeführt wird und einige Fälle von DDL könnte die gespeicherte Prozedur ungültig machen. Durch die Verwendung der ausführen sofort oder exec_ddl nähert sich die DDL durch unparsed Code implementiert wird.

Wenn diese Sie neeed tun für die Tatsache zu suchen, dass DDL gibt eine implizite begehen sowohl vor als auch nach der Ausführung.

versuchen, den Code unten

execute immediate 'truncate table tablename' ;

Sie sollten wissen, dass es nicht möglich ist, direkt eine DDL-Anweisung auszuführen, wie Sie von einem PL / SQL-Block für DML tun, weil PL / SQL nicht die späten Bindung nicht unterstützt direkt nur IT-Unterstützung kompiliert Zeit binden, die für DML in Ordnung ist. folglich zu überwinden diese Art von Problem Oracle hat einen dynamischen SQL-Ansatz versehen ist, die verwendet werden können, der DDL statements.The dynamischen SQL-Ansatz ist, über das Parsen und Bindung von SQL-Zeichenfolge in der Laufzeit auszuführen. Auch sollten Sie rememder dass DDL-Anweisungen standardmäßig auto sind begehen daher sollen Sie über eine der DDL-Anweisung vorsichtig sein, den dynamischen SQL-Ansatz einhüllen, wenn Sie einige DML (die verpflichtet werden muss ausdrücklich TCL verwenden), bevor die DDL in der Ausführung gespeicherte Prozedur / Funktion.

Sie können eine der folgenden dynamischen SQL-Ansatz verwenden, um eine DDL-Anweisung aus einem PL / SQL-Block auszuführen.

1) Führen Sie sofort

2) DBMS_SQL Paket

3) DBMS_UTILITY.EXEC_DDL_STATEMENT (parse_string IN VARCHAR2);

Hope this beantwortet Ihre Frage mit Erklärung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top