在Oracle PL / SQL的变量中存储带有多列的减号查询结果

问题描述

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

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都应与相应的项目名称一起插入TABLE_TWO中。怎么做?请注意,我需要将减号查询结果存储在变量中,因为我将对结果执行多个步骤。

解决方法

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内存中。因此,请勿按原样使用此代码,如果有更改,新记录的数量将是不合理的(可能超过几千个)。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...