存储过程使用WHERE子句

时间:2015-12-01 16:55:56

标签: stored-procedures oracle10g where sql-insert execute-immediate

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

如果没有我的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)

1 个答案:

答案 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;
/

在您执行此程序后别忘了承诺!