【发布时间】:2014-01-20 16:05:12
【问题描述】:
我在 Oracle SQL 中遇到了以下问题。 gt_general2 是一个全局临时表。
INSERT INTO gt_general2 (n_1, n_2, n_3)
select p.x_id, a.y_id, a.dollar_amt
from table_P p, table_A a
where p.x_id = a.x_id
and a.h_date = i_date
and a.dollar_amt > 0
for update of p.x_id, a.dollar_amt nowait; --this is the problem statement
Oracle 不喜欢我尝试将 INSERT...SELECT 语法与 SELECT...FOR 语法一起使用。 我想在执行此插入时锁定行,因为真正的查询实际上相当复杂(并且对其他视图进行一些检查以确保父记录存在等),这样我可以在执行时插入临时表一次通过行锁定。
还有其他一些我缺少的语法可以让我这样做吗?在概念层面上,我看不出 Oracle 不允许我从表 P 和 A 中选择行、将它们锁定在进程中并将值插入另一个表 Z 的任何原因。毕竟我已经可以做到这一点:
select p.x_id, a.y_id
BULK COLLECT into x_id_list, y_id_list
from table_P, table_A
where ...
for update nowait;
当然可以通过执行此查询两次来锁定行——一次锁定,一次插入。以前,我这样做并使用锁定查询来检索数组中的“x_id”值以帮助执行 INSERT INTO 查询。但我遇到的问题是 x_id 值不足以正确识别我想要的行;我需要这对 (x_id, y_id) 并且无法创建新的嵌套表类型来存储它。
【问题讨论】:
-
“无法创建新的嵌套表类型来存储它”……因为技术限制或特权?