【问题标题】:Record type, Collection and Bulk collect at the same time in oracle plsqloracle plsql中同时记录类型、Collection和Bulk collect
【发布时间】:2026-01-20 15:10:02
【问题描述】:

我在用代码实现场景时面临挑战。 我正在尝试在概念验证期间同时使用记录类型、集合和批量收集。但我做不到,而且我遇到了错误。 我不知道如何将批量收集参数作为输入参数传递给我在下面的包中创建的 proc...

CREATE OR REPLACE PACKAGE poc1
AS
   TYPE poc_rectype IS RECORD
   (
      id     VARCHAR2 (20),
      name   VARCHAR2 (20)
   );
   PROCEDURE poc1_prc (poc_rec1 IN poc_rectype);
END poc1;

CREATE OR REPLACE PACKAGE BODY poc1
AS
   PROCEDURE poc1_prc (poc_rec1 IN poc_rectype)
   IS
   BEGIN
      FOR i IN 1 .. poc_rec1.COUNT
      LOOP
         DBMS_OUTPUT.PUT_LINE ('poc_rec1' || poc_rec1.COUNT);
      END LOOP;

*-- i want to print the records passed from the execution script here 
-- later i want to do some insertion in some table..*

      DBMS_OUTPUT.PUT_LINE ('executed');
   END poc1_prc;
END poc1;

在这里,我现在只尝试通过一项记录.. 但是,我希望传递一组记录并将其打印出来或在包含上述过程的包中插入一些内容。

/* execution script for the above package*/
DECLARE
   l_rec_type   poc1.poc_rectype;
BEGIN
   SELECT (SELECT 100, 'Jack' FROM DUAL)
     BULK COLLECT INTO l_rec_type
     FROM DUAL;
   poc1.poc1_prc (l_rec_type);
END;

请有人帮助我实施此 POC。 我什么都试过了。但我感到无助

【问题讨论】:

    标签: oracle plsql


    【解决方案1】:

    您已经很接近了,但是您缺少一个用于保存值的嵌套表。您有一个记录类型和一个记录变量。但是一个记录变量只能保存一行数据。要保存多行数据,您需要一个记录类型、一个嵌套表和一个嵌套表变量。

    这是包含类型和处理数据的包:

    CREATE OR REPLACE PACKAGE poc1
    AS
       TYPE poc_rectype IS RECORD
       (
          id     VARCHAR2 (20),
          name   VARCHAR2 (20)
       );
       TYPE poc_tab is table of poc_rectype;
       PROCEDURE poc1_prc (poc_recs IN poc_tab);
    END poc1;
    /
    
    
    CREATE OR REPLACE PACKAGE BODY poc1
    AS
       PROCEDURE poc1_prc (poc_recs IN poc_tab)
       IS
       BEGIN
          FOR i IN 1 .. poc_recs.COUNT
          LOOP
             DBMS_OUTPUT.PUT_LINE ('poc_recs.id: ' || poc_recs(i).id);
          END LOOP;
       END poc1_prc;
    END poc1;
    /
    

    这是一个匿名块,它填充嵌套表变量并将其传递给集合进行处理:

    DECLARE
       l_pocs   poc1.poc_tab;
    BEGIN
       SELECT id, name
       BULK COLLECT INTO l_pocs
       FROM
       (
          SELECT 100 id, 'Jack' name FROM DUAL UNION ALL
          SELECT 101 id, 'Jill' name FROM DUAL
       );
    
       poc1.poc1_prc(l_pocs);
    END;
    /
    Output:
    -------
    poc_recs.id: 100
    poc_recs.id: 101
    

    由于您使用 10g 标记了问题,您可能需要添加一个额外的步骤,并将记录类型和嵌套表创建为单独的变量。旧版本的 Oracle 无法始终从 SQL 转换为 PL/SQL 类型。

    【讨论】:

    • 谢谢@Jon Heller。感谢您的帮助...请继续努力
    • 要打印输出...我们应该在执行脚本中使用 set serveroutput 还是应该将输出作为 out 参数 从包中存储到执行脚本..
    • 我建议传递输出或从函数返回。让流程的最后一步处理输出。将处理与显示分开可能会有所帮助。例如,如果您遇到某些环境无法处理大量 DBMS_OUTPUT 的问题,您可能需要重新考虑如何显示数据。
    • 超级...乔恩...谢谢... :)
    • 嗨乔恩。希望你做得很好......我试图使用 DML 'UPDATE' 而不是打印。但是我这样做时遇到了问题.. 我们不能使用以下语法进行 DML ..... *** 创建或替换包体 poc1 作为过程 poc1_prc (poc_recs IN poc_tab) IS BEGIN FOR i IN 1 .. poc_recs .COUNT LOOP 更新临时设置 temp_name= poc_recs(i).name 其中 temp_id = temp_id= poc_recs(i).id END LOOP;结束 poc1_prc;结束 poc1; / ***