0

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

但从这个过程中,我只得到最后一行。我想打印表中存在的所有记录。谁能帮我弄清楚上面的代码有什么问题。

4

1 回答 1

0

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

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

所以,应该是这样的:

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 类型。否则您将需要额外的处理

于 2016-08-18T05:03:11.243 回答