显式游标中不允许使用序列号

时间:2013-11-20 08:01:43

标签: oracle plsql

我不能在Explicit Cursors中使用序列。

错误:PL / SQL:ORA-02287:此处不允许序列号

代码:

CURSOR c_service_consumer IS
  select  ops$KLI.SVC_SEQ.Nextval,
          adr_cli_id_s,         
          null,
          svc_srv_id_s

...

我试着这样使用:

CURSOR c_service_consumer IS
  select  SELECT ops$KLI.SVC_SEQ.Nextval FROM DUAL,
          adr_cli_id_s,         
          null,
          svc_srv_id_s

也是同样的错误。

这是Cursor:

TYPE l_service_consumer_row IS TABLE OF TA_MAIN.SERVICE_CONSUMER%ROWTYPE;
l_service_consumer     l_service_consumer_row;

CURSOR c_service_consumer IS
  select  ops$KLI.SVC_SEQ.Nextval,
          a.adr_cli_id_s,         
          svc_prp_id_s,
          svc_srv_id_s
  from ops$luan.be_1304_grain_adr a
  left outer join ta_main.clients c on (a.adr_cli_id_s = c.cli_id_s);

BEGIN

OPEN c_service_consumer;
FETCH c_service_consumer BULK COLLECT INTO l_service_consumer;
CLOSE c_service_consumer;

/*Insert the collection of values*/
FORALL i IN INDICES OF l_service_consumer SAVE EXCEPTIONS
       INSERT INTO TA_MAIN.SERVICE_CONSUMER
       VALUES l_service_consumer(i);  

1 个答案:

答案 0 :(得分:1)

希望这有助于(未经测试)

TYPE l_service_consumer_row  IS TABLE OF TA_MAIN.SERVICE_CONSUMER%ROWTYPE 
INDEX BY BINARY_INTEGER;
l_service_consumer     l_service_consumer_row;
fetch_size   NUMBER := 5000; -- scale the value

CURSOR c_service_consumer IS
  select  -1 id,
          a.adr_cli_id_s,         
          svc_prp_id_s,
          svc_srv_id_s
  from ops$luan.be_1304_grain_adr a
  left outer join ta_main.clients c on (a.adr_cli_id_s = c.cli_id_s);

BEGIN

OPEN c_service_consumer;
loop
   FETCH c_service_consumer BULK COLLECT INTO l_service_consumer LIMIT fetch_size;        
   FOR i IN 1 .. l_service_consumer.COUNT  LOOP
     l_service_consumer(i).id = ops$KLI.SVC_SEQ.Nextval;    
   END LOOP;    

  /*Insert the collection of values*/
   FORALL i IN INDICES OF l_service_consumer SAVE EXCEPTIONS
       INSERT INTO TA_MAIN.SERVICE_CONSUMER
       VALUES l_service_consumer(i);  

   EXIT WHEN c_service_consumer%NOTFOUND;
END LOOP;
CLOSE c_service_consumer;
End;