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

在Oracle PL/SQL中的一个变量中存储具有多列的减号查询结果,sql,oracle,plsql,sql-insert,Sql,Oracle,Plsql,Sql Insert,我使用下面的代码获取表1中与表2(源代码)相比的额外项目ID 现在我想将相应的项目名称也添加到第二个表中。与表2相比,表1中存在的任何额外项目ID都应与相应的项目名称一起插入表2中。怎么做?请注意,我需要将减号查询结果存储在一个变量中,因为我将对结果执行多个步骤。SYS.ODCINUMBERLIST只是一个列表,其中每个记录都有一个数字。您需要使用新的记录类型来存储每行中的多个字段 您可以定义一个记录类型来代替SYS.ODCINUMBERLIST。但是我倾向于将SELECT语句移动为显式游标,这

我使用下面的代码获取表1中与表2(源代码)相比的额外项目ID


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

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

您可以定义一个记录类型来代替
SYS.ODCINUMBERLIST
。但是我倾向于将
SELECT
语句移动为显式游标,这样您就可以将一个新类型定义为cursor
%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;

关于
批量收集的一个注意事项
(在这里和您的原始帖子中)——批量收集的数据存储在PGA内存中。因此,不要使用此代码,因为如果发生更改,新记录的数量将不合理(可能超过几千条)。

为什么要使用PL/SQL?您可以编写一个查询立即完成任务。@GMB如果与表2相比,表1中存在额外的项目ID,我需要执行2个步骤:1。发送一封电子邮件,列出额外的项目标识和相应的项目名称,格式为表2和表2。将这些额外的项目标识和相应的项目名称插入表2中(问题:)
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;