2

私が直面している以下の問題を解決するのを手伝ってください.FORALL内のテーブル(変数値を使用して生成されたテーブル名とテーブルは既に作成されています)にデータを挿入する必要があります..

Declare
TYPE dept_data_rec IS RECORD
(
  Dept_no number,
  Dept_name varchar2(100),
  Dept_loc  Varchar2(20)
 );

TYPE nt_dept_data IS TABLE OF dept_data_rec ;

l_dept_data_nt nt_dept_data;

BEGIN

FORALL j IN 1..l_dept_data_nt.COUNT SAVE EXCEPTIONS
EXECUTE IMMEDIATE 'INSERT INTO '||l_get_dept_rec.dept_seq_no||'_Dept_Data  VALUES '||
l_dept_data_nt(j);
COMMIT;

このコードをコンパイルしているときに、次のエラーが発生します: PLS-00306: '||' の呼び出しで引数の数またはタイプが間違っています

ただし、実際のテーブル名を使用するコードでは機能します

FORALL j IN 1..l_dept_data_nt.COUNT SAVE EXCEPTIONS
INSERT INTO A1_dept_data VALUES
l_dept_data_nt(j);
COMMIT;
4

1 に答える 1

2

オラクル 10g -

11g より前のバージョンの Oracleでは、 with をFORALL使用することはできません。EXECUTE IMMEDIATEINSERTUPDATEDELETE

http://docs.oracle.com/cd/B13789_01/appdev.101/b10807/13_elems021.htmを参照してください。

特殊な構文です

  1. FOR ループのように読めますが、そうではありません。
  2. PL/SQL で一括 DML 操作を実行するために使用され、動的 SQL やその他のコードではなく、exact キーワードのみを使用します。

オラクル 11g +

11gでは使用制限EXECUTE IMMEDIATEが解除されました。http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/forall_statement.htmを参照してください。

ただし、文字列で使用できる変数は、USING句内の 1 つの配列の添字付き要素のみです。

FORALL構文を使用して行ごとにテーブルを動的に「変更」できるかどうかは、ドキュメントでは不明です。はPL/SQLで一括DMLFORALL操作を実行するために使用され、パフォーマンス上の利点を得るには、これを1つの表に移動する必要があることに注意してください。

上記の問題に対する最適なパフォーマンス ソリューション

2 つのレベルの配列を作成する必要があります。1 つ目はテーブルを定義し、2 つ目はそのテーブルのデータを定義します。

テーブル配列に対して通常のFORループを使用し、そのループ内で特別なFORALL構文を使用して、1 つのテーブルのすべての DML を実行します。

于 2013-10-14T08:09:57.247 に答える