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 中存在的所有记录。
谁能帮我找出上面代码中的错误。
错误信息非常明显。您正在调用您的程序:
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;
/
另外,这种方式的程序只会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 类型。或者你需要额外的处理
我创建了下面的 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 中存在的所有记录。 谁能帮我找出上面代码中的错误。
错误信息非常明显。您正在调用您的程序:
EVMPDADM.GETALLBATCHES_ARTICLE_57
的参数数量错误:它有一个 OUT 参数。所以你需要传递那个参数。DBMS_OUTPUT.PUT_LINE
的参数类型错误:它有一个 INVARCHAR2
参数,而不是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 类型。或者你需要额外的处理