插入带有光标值的选择查询
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 更新查询作为带有一些空值的选择查询