58

Oracleシェルで以下を実行すると、正常に動作します

truncate table table_name

しかし、ストアドプロシージャに入れようとすると

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

それは失敗します

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

なんで?

4

4 に答える 4

113

Oracle PL / SQLのすべてのDDL文は、文の前にExecuteImmediateを使用する必要があります。したがって、以下を使用する必要があります。

execute immediate 'truncate table schema.tablename';
于 2009-03-09T11:00:38.377 に答える
18

すぐに実行するだけでなく、使用することもできます

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

ストアド プロシージャが DDL を実行しており、DDL の一部のインスタンスがストアド プロシージャを無効にする可能性があるため、ステートメントは失敗します。execute immediate または exec_ddl アプローチを使用することにより、DDL は解析されていないコードを通じて実装されます。

これを行うときは、DDL が実行前と実行後の両方で暗黙的なコミットを発行するという事実に注意する必要があります。

于 2009-03-09T12:07:00.103 に答える
12

以下のコードを試してください

execute immediate 'truncate table tablename' ;
于 2009-03-09T10:38:44.013 に答える
10

PL/SQL は遅延バインディングを直接サポートしておらず、DML に適したコンパイル時バインディングのみをサポートしているため、PL/SQL ブロックから DML の場合のように DDL ステートメントを直接実行することはできないことを知っておく必要があります。したがって、このタイプの問題を克服するために、オラクルは DDL ステートメントの実行に使用できる動的 SQL アプローチを提供しています。動的 SQL アプローチは、実行時の SQL 文字列の解析とバインドに関するものです。また、DDL ステートメントはデフォルトで自動コミットであることを思い出してください。そのため、DDL をストアド プロシージャ/関数。

次の動的 SQL アプローチのいずれかを使用して、pl/sql ブロッ​​クから DDL ステートメントを実行できます。

1) 即時実行

2) DBMS_SQL パッケージ

3) DBMS_UTILITY.EXEC_DDL_STATEMENT (parse_string IN VARCHAR2);

これがあなたの質問に説明付きで答えてくれることを願っています。

于 2013-02-15T18:46:20.587 に答える