SQL PL / SQL ORA-02287:此处不允许使用序列号

时间:2018-04-18 13:08:45

标签: oracle stored-procedures plsql cursor

我在使用CURSOR的Oracle PROCEDURE中的insert语句中收到错误。

整个代码有效,但我收到插入语句的错误。我试图在每次循环时从双重中选择NEXTVAL

CREATE OR REPLACE PROCEDURE AUTO AS 
BEGIN

DEClARE
    request_seq number;
    V_ID_NO schema.table_name.ID_NO%type;
    v_accno schema.table_name.accno%type;
    v_USER_NAME schema.table_name.USER_NAME%type;

    CURSOR c1 IS    
        SELECT ID_NO,accno,USER_NAME from table_name
        where DEV_TYPE = 'CUSTOMER'
    BEGIN   
        OPEN c1;
        LOOP
            FETCH c1 INTO V_ID_NO,v_accno,v_USER_NAME;  
            EXIT WHEN c1%NOTFOUND;
      INSERT INTO TEMP_TABLE(REQUEST_ID,POINT_ID,ACCNO,FAQ_ID,REQ_TIMESTAMP,ID_NO,TYPE,REST_TIMESTAMP,REV_NO,MSG_ID,DIST,REQUEST_TYPE,CLIENT_ID) VALUES((select arequest_seq.nextval from dual),v_accno,v_accno,v_USER_NAME,sysdate,null,null,null,null,null,null,'PEP','NONE');
            DBMS_OUTPUT.PUT_LINE(TO_CHAR(V_ID_NO)  ||'--- '|| v_accno  ||' --- '|| v_USER_NAME);
        END LOOP;
        CLOSE c1;
  END;
END;

1 个答案:

答案 0 :(得分:1)

试试这个:

create or replace procedure auto
as 
begin   
    for r in (
        select id_no, accno, user_name
        from   table_name
        where  dev_type = 'CUSTOMER'
    )
    loop
        insert into temp_table
             ( request_id
             , point_id
             , accno
             , faq_id
             , req_timestamp
             , id_no, type, rest_timestamp, rev_no, msg_id, dist
             , request_type
             , client_id )
        values
             ( arequest_seq.nextval
             , r.accno
             , r.accno
             , r.user_name
             , sysdate
             , null, null, null, null, null, null
             , 'PEP'
             , 'NONE' )
        returning request_id into r.id_no;

        dbms_output.put_line(to_char(r.id_no) ||' --- '|| r.accno ||' --- '|| r.user_name);
    end loop;
end;

请注意arequest_seq.nextval直接在insert语句中使用,并使用rturning into捕获到变量中。或者,您可以在insert之前将其指定为

r.id_no := arequest_seq.nextval;

使用这样的游标循环记录可以避免变量将值从一个循环迭代保留到下一个循环迭代的风险(虽然它们不会在您的示例中),也意味着您不必声明它们在顶部。

如果它确实需要声明变量,它将介于asbegin之间 - 您不需要嵌套另一个整个declare-begin-end子块。

在Oracle 12c中,您可以考虑使用标识列,例如:

create table temp_table
( request_id integer generated always as identity

然后序列是隐式的,你可以在insert语句中跳过它(你仍然可以用returning into来捕获它。)