oracle批量收集和读取数据

时间:2016-08-18 04:43:08

标签: oracle plsql bulk-collect

我创建了以下proc来读取一个表中的所有数据,并将其填入.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;

要测试proc是否正常运行,我尝试使用以下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;
 /

但是从这个过程中我只得到了最后一行。 我想打印表中的所有记录。 任何人都可以帮我弄清楚上面代码中的错误。

1 个答案:

答案 0 :(得分:0)

错误消息非常明显。您通过以下方式致电您的程序:

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

    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;
    /
    

    此外,这种方式只返回最后一行。所以你可能想改变它。

    如果要打印表格中的所有记录,则需要在循环中添加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。或者你需要额外的处理