首页 > 解决方案 > 如何使用循环将数据记录插入表中?

问题描述

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

标签: oracleplsqlsql-insert

解决方案


我无法重现您的错误,但一个问题是它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 或更高版本,我更愿意使用标识列并停止微管理序列。你也不需要自己管理循环索引,因为 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;
/

推荐阅读