Oracle 批量收集到对象表中
尝试使用Oracle 批量收集到对象表中,oracle,plsql,oracle11g,bulkinsert,usertype,Oracle,Plsql,Oracle11g,Bulkinsert,Usertype,尝试使用批量收集语句时,我收到错误ORA-00947:值不足 示例脚本: CREATE OR REPLACE TYPE company_t AS OBJECT ( Company VARCHAR2(30), ClientCnt INTEGER ); / CREATE OR REPLACE TYPE company_set AS TABLE OF company_t; / CREATE OR REPLACE FUNCTIO
批量收集
语句时,我收到错误ORA-00947:值不足
示例脚本:
CREATE OR REPLACE
TYPE company_t AS OBJECT (
Company VARCHAR2(30),
ClientCnt INTEGER );
/
CREATE OR REPLACE
TYPE company_set AS TABLE OF company_t;
/
CREATE OR REPLACE
FUNCTION piped_set (
v_DateBegin IN DATE,
v_DateEnd IN DATE
)
return NUMBER /*company_set pipelined*/ as
v_buf company_t := company_t( NULL, NULL);
atReport company_set;
sql_stmt VARCHAR2(500) := '';
begin
select * BULK COLLECT INTO atReport
from (
SELECT 'Descr1', 1 from dual
UNION
SELECT 'Descr2', 2 from dual ) ;
return 1;
end;
错误发生在行选择*批量收集到一个报告中处
顺便说一句,Straight PL/SQL可以很好地工作(因此不需要将其作为解决方案提及)。将批量收集
用于用户表类型是一个问题。您的公司集
是一个对象表,您选择的是值,而不是由这些值组成的对象。这将汇编:
select * BULK COLLECT INTO atReport
from (
SELECT company_t('Descr1', 1) from dual
UNION
SELECT company_t('Descr2', 2) from dual ) ;
。。。但是当运行时将抛出ORA-22950:无法在没有MAP或ORDER方法的情况下对对象进行排序
,因为union
执行隐式排序以识别和删除重复项,因此请改用union all
:
select * BULK COLLECT INTO atReport
from (
SELECT company_t('Descr1', 1) from dual
UNION ALL
SELECT company_t('Descr2', 2) from dual ) ;
谢谢,@Alex,代码真的很有用!作为问题的继续,是否可以将批量插入的结果作为流水线函数结果传递?目前,我将结果放入AtReportAnt,然后执行“FOR..LOOP(pipe_row(atReportRow))END LOOP;”。也许这部分也可以简化?@xacinay-不使用批量收集;您可以将其作为游标循环来执行(用于rec in(选择company_t()作为comp…)循环管道行rec.comp;end loop;
或类似的操作。我认为性能会类似。如果您尝试这样做但无法使其工作,您可能应该问一个新问题。这正是它的工作方式:用于x in(选择…)管道行(company_t(x.Company,x.ClientCnt))
。我只是想知道,它可以更简单。无论如何,目前的结果很好,谢谢!