如何使用循环将数据记录插入表中?

时间:2018-12-23 08:21:33

标签: oracle plsql sql-insert

我想使用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

4 个答案:

答案 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;