Как использовать цикл для вставки записей данных в таблицу? - PullRequest
0 голосов
/ 23 декабря 2018

Я хотел бы вставить пару записей, используя циклы 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 голосов
/ 24 декабря 2018

Большое спасибо за ваши ответы, наконец-то я решил свою проблему, как показано ниже:

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; 
0 голосов
/ 23 декабря 2018

Этого можно добиться без динамического SQL:

INSERT INTO CM.CUSTOMER (FIRST_NAME, LAST_NAME, STATUS)
SELECT 'Jhon', 'Jhon', '10'
FROM dual
CONNECT BY rownum <= 10;

В этом ответе предполагается, что столбец ID имеет автоматическое приращение, что, вероятно, и должно быть.

0 голосов
/ 23 декабря 2018

Я не смог воспроизвести вашу ошибку, но одна проблема состоит в том, что 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;
/
0 голосов
/ 23 декабря 2018

Удалите последние ненужные запятые и выберите последовательность из двойного:

  INSERT INTO CM.CUSTOMER (ID, FIRST_NAME, LAST_NAME, STATUS)
  select ln.SQ_CUSTOMER, 'Jhon', 'Jhon', 10 from dual;

обновить до последовательности ln.SQ_CUSTOMER

...