Arrays Oracle:使用DBMS_SQL定义的数组进行批量收集

Arrays Oracle:使用DBMS_SQL定义的数组进行批量收集,arrays,oracle,plsql,forall,Arrays,Oracle,Plsql,Forall,它不能编译。怎么了 TYPE recEniFlussiHub IS RECORD ( FLVO_ID dbms_sql.varchar2_table, flh_id_messaggio dbms_sql.varchar2_table, flh_integrazione_id dbms_sql.varchar2_table ); TYPE taof_Ro

它不能编译。怎么了

TYPE recEniFlussiHub IS RECORD
      (
         FLVO_ID                 dbms_sql.varchar2_table,
         flh_id_messaggio        dbms_sql.varchar2_table,
         flh_integrazione_id     dbms_sql.varchar2_table
      );

      TYPE taof_RowCurEniFlussiHub IS TABLE OF recEniFlussiHub;

      curEniFlussiHub        taof_RowCurEniFlussiHub;


      SELECT null FLVO_ID, 
             c.flh_id_messaggio,
             c.flh_integrazione_id,        
        BULK COLLECT INTO curEniFlussiHub
        FROM ENI_FLUSSI_HUB c
       WHERE     c.flh_fornitura = P_FLH_FORNITURA

您错误地声明了记录类型,我假设您的flh_id_messaggio列和flh_Integratione_id列本身不是嵌套表

如果要创建关联数组来保存选定的值,则每个字段本身不必是集合,并且在c.flh_integrazione_id之后的select语句中有一个额外的逗号:

我假设您的flvo_id是一个VARCHAR2,因为您试图将其声明为VARCHAR2_表,如果它是一个数字,则在您的记录声明中声明它

TYPE receniflussihub IS RECORD(
     flvo_id                 VARCHAR2,
     flh_id_messaggio        eni_flussi_hub.flh_id_messaggio%TYPE,
     flh_integrazione_id     eni_flussi_hub.flh_integrazione_id%TYPE
);

TYPE taof_rowcureniflussihub IS TABLE OF receniflussihub;


cureniflussihub  taof_rowcureniflussihub;

SELECT NULL flvo_id,
       c.flh_id_messaggio,
       c.flh_integrazione_id
  BULK COLLECT INTO cureniflussihub
  FROM eni_flussi_hub C
 WHERE c.flh_fornitura = p_flh_fornitura;

希望对你有帮助

编辑:

根据您的注释,如果您需要选择到集合的记录中,而不是记录的集合中,那么您不需要声明表类型,只需声明贴花记录类型的记录并选择到其中。不要忘记,在代码中,select语句中c.flh_integrazione_id之后还有额外的逗号:

试试这个:

TYPE receniflussihub IS RECORD(
     flvo_id                 dbms_sql.varchar2_table,
     flh_id_messaggio        dbms_sql.varchar2_table,
     flh_integrazione_id     dbms_sql.varchar2_table
);

receniflussihub_rec receniflussihub;

SELECT NULL flvo_id,
       c.flh_id_messaggio,
       c.flh_integrazione_id
  BULK COLLECT INTO receniflussihub_rec.flvo_id,
                    receniflussihub_rec.flh_id_messaggio,
                    receniflussihub_rec.flh_integrazione_id
  FROM eni_flussi_hub C
 WHERE c.flh_fornitura = p_flh_fornitura;

如果要在记录中使用嵌套表,则需要在BULK COLLECT子句中引用它们的元素。大概是这样的:

  SELECT null FLVO_ID,   
         c.flh_id_messaggio,  
         c.flh_integrazione_id        
    BULK COLLECT INTO curEniFlussiHub.FLVO_ID
              ,   curEniFlussiHub.flh_id_messaggio        
              ,   curEniFlussiHub.flh_integrazione_id
    FROM ENI_FLUSSI_HUB c  
   WHERE     c.flh_fornitura = P_FLH_FORNITURA  
另外,您只需要将变量定义为记录的一个实例:您不需要有额外的表类型,即

declare
    recEniFlussiHub IS RECORD 
      ( 
         FLVO_ID                 dbms_sql.varchar2_table, 
         flh_id_messaggio        dbms_sql.varchar2_table, 
         flh_integrazione_id     dbms_sql.varchar2_table 
     ); 

  curEniFlussiHub        recEniFlussiHub;    

这是您的完整代码示例吗?我想不是因为你缺少了几个元素,比如BEGIN关键字。如果你想让我们发现一个语法错误,你需要发布一个连贯的代码示例,演示你不理解的错误。并发布编译错误堆栈!您正在运行什么版本的Oracle?谢谢,但我需要将其与FORALL insert一起使用,并且表中没有最后一个字段flh_IntegrationOne_id,因此我想我无法以这样的方式进行管理:FORALL I in 1。。curEniFlussiHub.COUNT\n插入ENI\u FLUSSI\u VAR\u OPZTAR\n curEniFlussiHubi\n我遵循以下示例:快速方式3获取DBMS\u SQL定义的数组->您运行的Oracle版本是什么?