使用序列在LOOP内的IF语句中的UPDATE / INSERT语句

时间:2016-06-10 14:20:58

标签: sql oracle loops if-statement plsql

CURSOR text IS
SELECT *
FROM DATA

CURSOR MATCHES IS
SELECT NAME
FROM DATA
INTERSECT
SELECT DESCRIPTION
FROM my_table



BEGIN
FOR i IN text

OPEN MATCHES
FETCH MATCHES INTO MATCH
CLOSE MATCH

IF i IN MATCH
THEN
UPDATE my_table
SET col1 = correlating_new_column1, col2 = correlating_new_column2, col3 = correlating_new_column3
WHERE table_im_trying_to_populate.code = my_seq.curval
ELSE
INSERT INTO TABLE_IM_TRYING_TO_POPULATE(CODE, NAME, DESCRIPTION, col1, col2, col3)
VALUES(my_seq.nextval, other_name, other_description, correlating_new_column1, correlating_new_column2, correlating_new_column3)
END IF;
END LOOP;

基本上我正在尝试使用一个显式游标,我做了一个表的select语句,然后逐行执行并将其放入我的其他现有表中。如果它在我的另一个现有表中遇到一个名称,它将更新一些列。否则它会将整个记录插入该表中。我正在尝试使用序列来更新“代码”列,以便更新其他现有表中的代码= my_seq.curval。然后对于插图,它只是进入下一个val。我知道这很复杂,但我真的只是想看看我的设置是否正确。刚开始使用sql developer for oracle很久以前。

1 个答案:

答案 0 :(得分:0)

您的代码存在大量问题。但是,您可以使用单个MERGE语句来实现您尝试做的事情,其中​​包括:

merge into table_im_trying_to_populate tgt
using data_table src
  on (tgt.name = src.other_name
      and tgt.description = src.other_description)
when matched then
  update set tgt.col1 = src.correlating_new_column1,
             tgt.col2 = src.correlating_new_column2,
             tgt.col3 = src.correlating_new_column3
when not matched then
  insert (tgt.code, tgt.name, tgt.description, tgt.col1, tgt.col2, tgt.col3)
  values (my_seq.nextval, src.other_name, src.other_description, src.correlating_new_column1, src.correlating_new_column2, src.correlating_new_column3);

这假定数据表中的other_name和other_description列是唯一的。我还必须猜测连接条件应该是什么,因为您在示例更新语句(table_im_trying_to_populate.code = my_seq.currval)中的连接条件没有任何意义 - 您不会使用currval作为一般规则加入,因为它不会被填充,除非您之前从同一会话中的序列中提取了一个值。

如果这与您尝试做的事情不符,请使用表格中的一些示例数据和预期输出更新您的问题,我们应该能够为您提供进一步的帮助。