插入到不在oracle中使用plsql

插入到不在oracle中使用plsql,oracle,plsql,oracle11g,Oracle,Plsql,Oracle11g,select*from temp_name的输出为: declare vquery long; cursor c1 is select * from temp_name; begin for i in c1 loop vquery :='INSERT INTO ot.temp_new(id) select '''||i.id||''' from ot.customers'; dbms_output.put_line(i.id); end loop; end; / 我有一个customer

select*from temp_name
的输出为:

declare
vquery long;
cursor c1 is
select * from temp_name;

begin

for i in c1
loop
vquery :='INSERT INTO ot.temp_new(id)
select '''||i.id||''' from ot.customers';
dbms_output.put_line(i.id);
end loop;

end;
/
我有一个customers表,该表有customer\u id列。我想将所有customer\u id插入temp\u new表,但没有插入。PLSQL块成功执行,但temp_新表为空。
dbms\u output.put\u行的输出(i.id)

ID                                                                              
--------------------------------------------------------------------------------
customer_id                                                                     
1 row selected.

有什么问题吗?

主要问题是您生成了一个从未执行过的动态语句;在某些情况下,您需要执行以下操作:

customer_id
但还有其他问题。如果输出生成的
vquery
字符串,您将看到它包含:

execute immediate vquery;
这意味着对于
customers
中的每一行,您将在
temp\u new
中得到一行,ID设置为相同的固定文本
“customer\u ID”
。这不太可能是你想要的;如果
customer\u id
customers
中的一个列名,那么它不应该在单引号中

正如@mathguy所建议的,
long
不是一种合理的数据类型;您可以使用CLOB,但这里只需要
varchar2
。更像这样,我也切换到使用隐式光标:

INSERT INTO ot.temp_new(id)
select 'customer_id' from ot.customers

不过,这个循环并没有真正意义;如果您的
temp_name
表中有多个具有不同列名的行,您应该尝试将
customers
表中这些列的相应值插入
temp_new
中的多个行中,所有这些行都位于相同的
id
列中,如图所示


我想这是更复杂的事情的起点,但仍然有点奇怪。

我只阅读了前两行代码,我已经看到了一个问题。不要将字符串变量声明为
long
-改用
clob
。仍然不工作@mathguy这只是一个示例,我需要在我的项目中使用它,所以@AlexPooleI并不建议我发现你代码中的所有错误-我只是指出了我注意到的第一件事。我正在处理一个很难在这里发布的大型项目。因此,我在这里发布了一个简单的例子。从一个表到另一个表的insert语句在这里并不好。但是感谢您的努力
declare
  l_stmt varchar2(4000);
begin
  for i in (select id from temp_name) 
  loop
    l_stmt := 'INSERT INTO temp_new(id) select '||i.id||' from customers';
    dbms_output.put_line(i.id);
    dbms_output.put_line(l_stmt);
    execute immediate l_stmt;
  end loop;
end;
/