oracle批量收集和读取数据

oracle bulk collect and reading the data

我创建了下面的 proc 以从一个 table 读取所有数据并以 .net 形式将其填充到网格中。

CREATE OR REPLACE PROCEDURE EVMPDADM.GETALLBATCHES_ARTICLE_57(p_batchstatus OUT XEVMPD_SUBMITTEDBATCH%ROWTYPE )
IS

 TYPE batch_status IS TABLE OF XEVMPD_SUBMITTEDBATCH%ROWTYPE  INDEX BY PLS_INTEGER;
 l_batchstatus batch_status;

BEGIN

SELECT *  BULK COLLECT INTO l_batchstatus FROM XEVMPD_SUBMITTEDBATCH ;

   FOR i IN 1..l_batchstatus.count LOOP 

    p_batchstatus:= l_batchstatus(i);

   END LOOP;

END GETALLBATCHES_ARTICLE_57;

为了测试过程是否 运行 正常,我尝试使用下面的 Pl-sql 块打印数据:

DECLARE
    v_batchstatus XEVMPD_SUBMITTEDBATCH%ROWTYPE;
    BEGIN

    EVMPDADM.GETALLBATCHES_ARTICLE_57(v_batchstatus);
    DBMS_OUTPUT.PUT_LINE( v_batchstatus.Batch_id || ' ' || v_batchstatus.BATCH_DESCRIPTION || ' ' || v_batchstatus.STATUS || ' ' ||v_batchstatus.RECORD_STATUS || ' ' ||v_batchstatus.NUMBER_OF_RECORDS);

   END;
 /

但是在这个过程中我只得到最后一行。 我想打印 table 中存在的所有记录。 谁能帮我找出上面代码中的错误。

错误信息非常明显。您正在调用您的程序:

  1. EVMPDADM.GETALLBATCHES_ARTICLE_57 的参数数量错误:它有一个 OUT 参数。所以你需要传递那个参数。
  2. DBMS_OUTPUT.PUT_LINE 的参数类型错误:它有一个 IN VARCHAR2 参数,而不是 XEVMPD_SUBMITTEDBATCH%ROWTYPE。阅读 here

所以,应该是这样的:

DECLARE
    v_batchstatus XEVMPD_SUBMITTEDBATCH%ROWTYPE;
    BEGIN

    v_batchstatus:= EVMPDADM.GETALLBATCHES_ARTICLE_57(v_batchstatus);
    --use DBMS_OUTPUT.PUT_LINE for every column of XEVMPD_SUBMITTEDBATCH separately after you convert them to varchar2 if they are not.

END;
/

另外,这种方式的程序只会return最后一行。所以你可能想改变它。

如果要打印table开始的所有记录,需要在循环里面加上DBMS_OUTPUT.PUT_LINE,就会变成这样:

FOR i IN 1..l_batchstatus.count LOOP  

p_batchstatus:= l_batchstatus(i);

dbms_output.put_line( p_batchstatus.col1 || ' ' || p_batchstatus.col2 || ... );

END LOOP;

其中 col1, col2, ...XEVMPD_SUBMITTEDBATCH 的列名,因为它们是 VARCHAR2 类型。或者你需要额外的处理