我创建了以下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;
/
但是从这个过程中我只得到了最后一行。 我想打印表中的所有记录。 任何人都可以帮我弄清楚上面代码中的错误。
答案 0 :(得分:0)
错误消息非常明显。您通过以下方式致电您的程序:
EVMPDADM.GETALLBATCHES_ARTICLE_57
的参数数量错误:它有一个OUT参数。所以你需要传递那个参数。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。或者你需要额外的处理