2016-08-18 86 views
0

我已经创建了如下proc从一个表中读取所有数据并以.net形式将其填充到网格中。oracle批量收集和读取数据

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

但是从这个过程中,我只得到了最后一排。 我想打印表中的所有记录。 任何人都可以帮助我找出上述代码中的错误。

+0

首先,您的程序将只返回您提取的任意最后一行的数据。您似乎不太可能想要生成结果集并获取数据仅用于丢弃除一行之外的所有数据,并且您不关心保留哪一行。其次,你不能将'%rowtype'变量传递给'dbms_output.put_line'。您可以传递特定的标量属性,即'dbms_output.put_line(v_batchstatus.col1 ||''|| v_batchstatus.col2 || ...);'但您必须枚举您想要查看的属性。 –

回答

0

错误消息非常明显。您打电话给您的程序:

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

此外,程序这样只会返回最后一行。所以你可能想改变它。

如果你想从表打印所有的记录,你需要添加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。或者您将需要额外的处理

+0

我已更正pl-sql块。这是我的错误,我忘了正确处理输出参数,并且在打印时没有使用属性名称。 – Jig232

+0

我已经更新了这个问题。你能告诉我如何打印表格中的所有记录吗? – Jig232

+0

谢谢鹰:) 其实问题是我想所有的数据作为一个输出参数,因为我们想以一个.NET形式在网格视图中显示这个数据 我不知道.NET,我不知道如何我的队友会将这些数据显示为网格。他只是要求我编写proc来读取数据并将其作为输出参数发送。 – Jig232