【问题标题】:Store result of minus query with multiple columns in a variable in Oracle PL/SQL在 Oracle PL/SQL 中的变量中存储多列减查询的结果
【发布时间】:2020-08-18 19:17:55
【问题描述】:

我使用下面的代码来获取 TABLE_ONE 与 TABLE_TWO 相比存在的额外项目 ID(来源 Store result of minus query ( list of varchars) in a variable in Oracle PL/SQL)

DECLARE 
  l_missing_id_list SYS.ODCINUMBERLIST;
BEGIN
  SELECT project_id
  BULK COLLECT INTO l_missing_id_list
  FROM 
    (
    SELECT t1.project_id FROM table_one t1
    MINUS
    SELECT t2.project_id FROM table_two t2 );
    
  FORALL i IN l_missing_id_list.FIRST..l_missing_id_list.LAST
    INSERT INTO table_two VALUES ( l_missing_id_list(i) );
    
  COMMIT;
  
  -- Values are now inserted and you have the list of IDs in l_missing_id_list to add to your email.
END;

现在我想将相应的项目名称也添加到第二个表中。与 TABLE_TWO 相比, TABLE_ONE 中存在的任何额外 project_id 都应与相应的 Project Names 一起插入 TABLE_TWO 中。怎么做?请注意,我需要将减号查询结果存储在一个变量中,因为我将对结果执行多个步骤。

【问题讨论】:

  • 为什么要使用 PL/SQL?您可以编写一个查询来立即完成工作。
  • @GMB 如果与 TABLE_TWO 相比,TABLE_ONE 中存在额外的 Project_Ids,我需要执行 2 个步骤:1. 发送一封电子邮件,其中包含额外的 Project_Ids 列表和表格格式的相应 project_names,以及 2. 插入这些额外的 Project_ids 和相应的 project_names 到 TABLE_TWO 中(问题:stackoverflow.com/questions/63341473/…)

标签: sql oracle plsql sql-insert


【解决方案1】:

SYS.ODCINUMBERLIST 只是一个列表,其中每条记录都有一个数字。您需要使用新的记录类型来存储每一行​​中的多个字段。

您可以定义一个记录类型来代替SYS.ODCINUMBERLIST。但我倾向于将SELECT 语句移动为显式游标,以便您可以将新类型定义为游标%ROWTYPE。这样,您的记录类型和 select 语句始终保持一致,但它会稍微改变您的代码结构。

方法如下:

DECLARE 

  CURSOR c_select IS
      SELECT project_id, project_name
      FROM 
        (
          SELECT t1.project_id, t1.project_name FROM table_one t1
          MINUS
          SELECT t2.project_id, t2.project_name FROM table_two t2 );

  TYPE l_missing_row_list_typ IS TABLE OF c_select%ROWTYPE;
  l_missing_row_list l_missing_row_list_typ;
  
BEGIN
  OPEN c_select;
  FETCH c_select BULK COLLECT INTO l_missing_row_list;
  CLOSE c_select;
  
  FORALL i IN l_missing_row_list.FIRST..l_missing_row_list.LAST
    INSERT INTO table_two VALUES ( l_missing_row_list(i).project_id, l_missing_row_list(i).project_name );
    
  COMMIT;
  
  -- Values are now inserted and you have the list of IDs in l_missing_row_list to add to your email.
END;

关于BULK COLLECT 的一个注释(在此处和您的原始帖子中)- 您批量收集的数据存储在 PGA 内存中。所以不要按原样使用这段代码,如果有变化,新记录的数量将不合理(可能超过几千)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-01
    • 2021-01-25
    • 2011-02-02
    • 2014-04-24
    • 1970-01-01
    • 1970-01-01
    • 2017-03-24
    • 2012-03-13
    相关资源
    最近更新 更多