【问题标题】:Insert into not working on plsql in oracle在 oracle 中插入不工作的 plsql
【发布时间】:2020-03-03 23:03:23
【问题描述】:
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;
/

select * from temp_name 的输出是:

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

我有一个包含 customer_id 列的客户表。我想将所有 customer_id 插入 temp_new 表,但它没有被插入。 PLSQL 块成功执行,但 temp_new 表为空。 dbms_output.put_line(i.id); 的输出是

customer_id

那里有什么问题?

【问题讨论】:

  • 我只看了前两行代码,就已经看出问题了。不要将您的字符串变量声明为 long - 请改用 clob
  • 仍然无法工作@mathguy
  • 它只是一个示例,我需要在我的项目中所以@AlexPoole
  • 我并不是说我发现了您代码中的所有错误 - 我只是指出了我注意到的第一件事。

标签: oracle plsql oracle11g


【解决方案1】:

主要问题是你生成了一个你从不执行的动态语句;在某些时候你需要做:

execute immediate vquery;

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

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

这意味着对于customers 中的每一行,您将在temp_new 中获得一行,其ID 设置为相同的固定文字'customer_id'。这不太可能是您想要的。如果customer_id 是来自customers 的列名,那么它不应使用单引号。

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

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

db<>fiddle

这个循环实际上并没有什么意义;如果您的temp_name 表有多个具有不同列名的行,您将尝试将customers 表中这些列的相应值插入temp_new 的多行中,所有行都在同一个id 列中,如显示in this db<>fiddle

我想这是更复杂的事情的起点,但似乎还是有点奇怪。

【讨论】:

  • 我正在做一个很难在这里发布的大型项目。所以,我在这里发布了一个简单的例子。从一个表到另一个表的插入语句在这里不好。但是感谢您的努力
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-03
  • 2012-09-23
  • 2019-01-06
  • 1970-01-01
  • 2022-08-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多