我正在尝试将我的存档表中的一行复制到原始表中。
如果没有我的WHERE
子句,则table2的整个表将被复制到table1。
我当然不想要这个。因此,根据列出的gridview的ID值,该表将仅复制ID相同的行。
当我调试行时,我会为DisplaySup.Rows(0).Cells(2).Text
列出正确的ID。
(
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 clause giving errors
像这样修复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
表示选择语句后的col72
MY TABLES的例子(两者都相同)table2的目的是当table1中删除一行时,table2可以重新创建被删除的用户
表1
ID CompanyName FirstName LastName ....(72 cols)
表2
ID CompanyName FirstName LastName ...(72 cols)
答案 0 :(得分:1)
您最好在insert语句中使用绑定变量。此外,您需要列出您要插入的列以及您要插入的列,以避免过多的值"错误。
例如:
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;
/
在您执行此程序后别忘了承诺!