我在使用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;
答案 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;
使用这样的游标循环记录可以避免变量将值从一个循环迭代保留到下一个循环迭代的风险(虽然它们不会在您的示例中),也意味着您不必声明它们在顶部。
如果它确实需要声明变量,它将介于as
和begin
之间 - 您不需要嵌套另一个整个declare-begin-end
子块。
在Oracle 12c中,您可以考虑使用标识列,例如:
create table temp_table
( request_id integer generated always as identity
然后序列是隐式的,你可以在insert
语句中跳过它(你仍然可以用returning into
来捕获它。)