0

我正在尝试将存档表中的一行复制到原始表中。

如果没有 myWHERE子句,table2 的整个表将被复制到 table1。我当然不想要这个。因此,根据列出的 gridview 的 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": 无效标识符

表 2 和表 1 具有相同的列;所以他们都有名为V_ID. 我不确定为什么Val_ID要标记错误。

VB.net 代码行:

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

所以我试图参考:EXECUTE IMMEDIATE with USING 子句给出错误

像这样修复 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 CompanyName FirstName LastName ....(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 回答