插入带有光标值的选择查询

Posted

技术标签:

【中文标题】插入带有光标值的选择查询【英文标题】:Insert into select query with cursor value 【发布时间】:2014-11-03 18:57:15 【问题描述】:

我想在 Oracle 中编写一个带有插入查询的 SQK 脚本,其中一个值将从游标中获取,其余值将从表中检索。

例如,考虑 Employee 表:

Emp_No | Emp_Name

  1    |  AAA
  ...........

我正在将表格读入光标。

Cursor c1 is select emp_no, emp_name from employee;

我正在迭代光标并添加到一个表以及来自另一个表的信息。

for empCur in c1
loop

insert into employee_info(emp_no, emp_name, address, age, ... ) values (empCur.emp_no, empCur.emp_name, select t.address, t.age, ... from employee_temp_table t where t.emp_no=empCur.emp_no)

end loop;

我的脚本有效吗?如果没有,还有其他方法可以实现吗?由于光标中的值很少,而另一个表中的值很少,我不确定如何处理。

【问题讨论】:

【参考方案1】:

你的脚本不正确,因为这个

select t.address, t.age, ... from employee_temp_table t where t.emp_no=empCur.emp_no

不是有效的表达式。您只能使用标量子查询(单行一列子查询),如下所示:

insert into t1(col1, col2, col3) values (1, (select col1 from t2), (select col2 from t2));

或者您可以尝试从选择中插入:

for empCur in c1 loop
  insert into employee_info(emp_no, emp_name, address, age, ... ) 
  select empCur.emp_no, empCur.emp_name, t.address, t.age, ... from employee_temp_table t where t.emp_no=empCur.emp_no;
end loop;

【讨论】:

【参考方案2】:

如果你想使用游标,为什么不直接连接游标内的表格呢?

for empCur in ( select e.emp_no, e.emp_name, t.address, t.age ...
from employee e join employee_temp_table t on ( t.emp_no = e.emp_no )
) loop
insert into employee_info(...) values ( empCur.emp_no, ...);
end loop;

或者使用 sql 插入:(如果您可以选择 sql 而不是 pl/sql - T Kyte 说这样做)

insert into employee_info
select e.emp_no, e.emp_name, t.address, t.age ...
from employee e join employee_temp_table t on ( t.emp_no = e.emp_no );

【讨论】:

以上是关于插入带有光标值的选择查询的主要内容,如果未能解决你的问题,请参考以下文章

带有 where 条件的 PL/SQL 更新查询作为带有一些空值的选择查询

用于从 DAL 选择中排除某些值的查询或表达式

如何在文本区域标签中的特定光标位置插入选择标签下拉值作为文本片段?

识别不同文本区域中的光标位置并在列表框中选择项目时插入文本

如何使用存储过程在mysql中选择和插入值

Flutter - 选择带有显示和返回值的列表