如何通过PL / SQL中的变量动态插入?

时间:2009-03-30 09:44:03

标签: sql database insert dynamic

让我们先创建一个表

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 个答案:

答案 0 :(得分:4)

表测试有两列。你只是插入一个而不是命名它是哪个列,因此“没有足够的值”。所以你需要:

INSERT INTO test (name) VALUES (data)

或者可能更好的是输入ID:

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

或简单地说:

INSERT INTO test VALUES (1, data)

虽然我会使用游标而不是动态SQL(甚至是内联SQL)。

答案 1 :(得分:2)

您需要为每个值使用不同的变量

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;

答案 2 :(得分:2)

将值传递给动态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;

每个值需要一个变量。

答案 3 :(得分:0)

您的方法有效,但您需要稍微调整一下您的查询:

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

以便v_data变量的内容实际插入到字符串中,而不是值“v_data”本身。