Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 批量收集到对象表中_Oracle_Plsql_Oracle11g_Bulkinsert_Usertype - Fatal编程技术网

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))
。我只是想知道,它可以更简单。无论如何,目前的结果很好,谢谢!