我想使用PL / SQL循环插入几条记录,但是当我在SQL Developer中执行以下代码块时,出现以下错误:
declare
loop_size number;
begin
loop_size := 10;
while loop_size > 0
loop
INSERT INTO CM.CUSTOMER (ID, FIRST_NAME, LAST_NAME, STATUS )
VALUES (CM.SQ_CUSTOMER.nextval, 'Jhon', 'Jhon',10);
loop_size := loop_size -1;
end loop;
end;
错误
PLS-00225: subprogram or cursor 'CM' reference is out of scope
答案 0 :(得分:2)
我无法重现您的错误,但是一个问题是CM.CUSTOMER
既不能是表又不能是序列。
通常,除非确实需要,否则最好不要对模式名称进行硬编码。我希望这里省略模式名称,而仅从CM
帐户运行它。
我创建了一个名为customer_seq
的序列,并且以下运行均无错误:
create table customer
( id number primary key
, first_name varchar2(20)
, last_name varchar2(20)
, status number );
create sequence customer_seq;
declare
status varchar(10) := '10';
loop_size number := 10;
begin
while loop_size > 0
loop
insert into customer (id, first_name, last_name, status)
values (customer_seq.nextval, 'Jhon', 'Jhon', status);
loop_size := loop_size -1;
end loop;
end;
/
如果使用Oracle 12.1或更高版本,则我希望使用Identity列并停止微管理序列。您也不需要自己管理循环索引,因为PL / SQL具有便捷的for
循环构造:
create table customer
( id number generated always as identity primary key
, first_name varchar2(20)
, last_name varchar2(20)
, status number );
declare
status varchar(10) := '10';
loop_size number := 10;
begin
for i in 1..loop_size loop
insert into customer (first_name, last_name, status )
values ('Jhon', 'Jhon', status);
end loop;
end;
/
答案 1 :(得分:1)
您可以在没有动态SQL的情况下实现此目标:
INSERT INTO CM.CUSTOMER (FIRST_NAME, LAST_NAME, STATUS)
SELECT 'Jhon', 'Jhon', '10'
FROM dual
CONNECT BY rownum <= 10;
此答案假设ID
列应该是自动递增的。
答案 2 :(得分:0)
删除最后一个不必要的逗号,然后从对偶中选择顺序:
INSERT INTO CM.CUSTOMER (ID, FIRST_NAME, LAST_NAME, STATUS)
select ln.SQ_CUSTOMER, 'Jhon', 'Jhon', 10 from dual;
更新以排序至ln.SQ_CUSTOMER
答案 3 :(得分:0)
非常感谢您的答复,终于如图所示,我解决了我的问题:
declare
loop_size number;
rec_id NUMBER;
begin
loop_size := 10;
while loop_size > 0
loop
execute immediate 'select cm.SQ_CUSTOMER.nextval from dual' into rec_id;
INSERT INTO CM.CUSTOMER (ID, FIRST_NAME, LAST_NAME, STATUS )
VALUES (rec_id, 'Jhon', 'Jhon',10);
loop_size := loop_size -1;
end loop;
end;