Как вставить динамически через переменную в PL / SQL? - PullRequest
1 голос
/ 30 марта 2009

Сначала создадим таблицу

create table test
(
  id number,
  name varchar2(20)
);

Теперь во время вставки я хочу сначала сохранить данные в переменную, а затем динамически передать переменную в предложение VALUES следующим образом:

declare
  v_data varchar2(50);
begin
  v_data:='1,sunny';
  execute immediate 'insert into test values(v_data)';
  commit;
end;

Но он показывает некоторые ошибки (недостаточно значений) ...... PLZ, помогите, как этого добиться ??

Ответы [ 4 ]

4 голосов
/ 30 марта 2009

Таблица теста имеет две колонки. Вы только вставляете один, а не называете, в каком столбце он, следовательно, «недостаточно значений». Итак, вам нужно:

INSERT INTO test (name) VALUES (data)

или, возможно, лучше ввести ID:

INSERT INTO test (id, name) VALUES (1, data)

или просто:

INSERT INTO test VALUES (1, data)

Для такого рода вещей я бы использовал курсор, а не динамический SQL (или даже встроенный SQL).

2 голосов
/ 30 марта 2009

Обычный способ передачи значений в динамические операторы SQL - с помощью переменных связывания, таких как:

declare 
   v_id integer;
   v_name varchar2(50);
begin
   v_id := 1;
   v_name := 'sunny';
   execute immediate
      'insert into test (id, name) values(:b1, :b2)'
      using v_id, v_name; 
   commit; 
end;

Для этого требуется одна переменная на значение.

2 голосов
/ 30 марта 2009

Вам нужно использовать разные переменные для каждого значения

declare 
  v_data1 number
  v_data2 varchar2(50);
begin 
  v_data1 :=1
  v_data2 = 'sunny'; 

  insert into test values(v_data1,v_data2);
  -- Alternatively insert into test (Name) values (v_data2);
commit; 
end;
0 голосов
/ 30 марта 2009

Ваш подход работает, но вам нужно немного скорректировать ваш запрос:

execute immediate 'insert into test values(' || v_data|| ')';

чтобы содержимое вашей переменной v_data фактически вставлялось в строку, а не само значение v_data.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...