0

アーカイブ テーブルから元のテーブルに 1 行をコピーしようとしています。

この句がないと、WHEREtable2 のテーブル全体が table1 にコピーされます。もちろん、これはしたくありません。したがって、リストされているグリッドビューの ID 値に基づいて、テーブルは ID が同じ行のみをコピーします。

行をデバッグすると、正しい ID が表示されDisplaySup.Rows(0).Cells(2).Textます。

(     
val_ID table2.V_ID%type
) 

is 
begin 

execute immediate 'insert into table1 (select * from table2 where V_ID = val_ID)'; 
end; 

それでもエラーが発生します

ORA-00904: "VAL_ID": 識別子が無効です

Table2 と Table1 の列は同じです。そのため、どちらにも というタイトルの列がありますV_ID。なぜVal_IDエラーにフラグを立てているのかわかりません。

VB.net のコーディング行:

SupArchive.Parameters.Add("val_ID", OleDbType.VarChar).Value = DisplaySup.Rows(0).Cells(2).Text

だから私は参照しようとしました:エラーを与える USING 節を持つ EXECUTE IMMEDIATE

WHERE を修正するには、次のようにします。

(     
val_ID table2.V_ID%type
) 

is 
begin 

execute immediate 'insert into table1 (select * from table2 where V_ID = '||val_ID||')'; 
end; 

しかし、私はエラーが発生します:

ORA-00904: "val_ID": 識別子が無効です

ストアド プロシージャを修正する方法について何か提案はありますか?

アップデート:

提案されたことをしようとしました:

(
val_ID table2.V_ID%type
)
AS
BEGIN

execute immediate 'insert into table1 (col1, col2, col3...)(select col1, col2, col3... from table2 where V_ID = :val_ID)' using val_ID;

end;

しかし、エラーが発生します:

ORA-00904: "col72": invalid identifier

Select ステートメントの後の col72 の場合

私のテーブルの例 (どちらも同じです) table2 の目的は、table1 で行が削除されたときに、table2 が削除されたユーザーを再作成できることです。

表1

ID 会社名 名 姓 ....(72 列)

表2

ID CompanyName FirstName LastName... (72 列)

4

1 に答える 1

1

挿入ステートメントでバインド変数を使用することをお勧めします。また、「値が多すぎます」というエラーを回避するために、挿入する列と挿入する列をリストする必要があります。

例えば:

declare
  val_ID table2.V_ID%type := 1;
begin 
  execute immediate 'insert into table1 (col1, col2, ...) (select col1, col2, ... from table2 where V_ID = :val_ID)' using val_id;
end;
/

この場合、動的SQLを使用する必要はまったくないため、次のようにすることができます:

declare
  val_id table2.v_id%type := 1;
begin 
  insert into table1 (col1, col2, ...)
  select col1, col2, ...
  from   table2
  where  v_id = val_id;
end;
/

手順を実行した後は、コミットすることを忘れないでください!

于 2015-12-01T17:19:40.543 に答える