【问题标题】:UPDATE/INSERT statement within an IF statement within a LOOP using sequence使用序列的 LOOP 中的 IF 语句中的 UPDATE/INSERT 语句
【发布时间】:2016-06-10 14:20:57
【问题描述】:
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;

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

【问题讨论】:

  • 您正在尝试根据来自不同表的行插入/更新同一个表?您忘记在示例代码中包含光标声明;如果您可以更新您的问题以包含它,这将有所帮助。
  • 是更新/插入到同一个已经存在的表中。如果名称匹配一行,我会更新一些列。如果没有匹配意味着该名称没有记录,那么我将一条全新的记录插入到具有新代码号的表中。

标签: sql oracle loops if-statement plsql


【解决方案1】:

您的代码存在大量问题。但是,看起来您想要做的事情可以通过单个 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 来连接规则,因为除非您之前在同一会话中从序列中提取了一个值,否则它不会被填充。

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

【讨论】:

  • 如果我使用这种合并方法,我会使用我的光标来合并我要合并的东西,还是只为它们创建我的选择语句?讲这部分merge into table_im_trying_to_populate tgt using data_table src
  • 您是说您的源表中只有一部分数据要合并到目标表中吗?如果是这样,你可以这样做... using (select ... from ... where ...) src
  • 如果我要将它封装到一个过程中,除了创建过程、开始和结束语句之外,我还需要其他什么吗?
  • 不!一旦您确认合并按预期工作,您就可以将其放入 proc 中。
  • 非常感谢您的帮助!新手来了哈哈
猜你喜欢
  • 2016-06-12
  • 2023-03-31
  • 1970-01-01
  • 2014-06-12
  • 2012-07-26
  • 2019-09-14
  • 1970-01-01
  • 1970-01-01
  • 2015-04-30
相关资源
最近更新 更多