2

让我们先创建一个表

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;

但是它显示了一些错误(没有足够的值)......请帮助如何实现这一点?

4

4 回答 4

5

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

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;
于 2009-03-30T09:48:29.047 回答
4

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

INSERT INTO test (name) VALUES (data)

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

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

或者简单地说:

INSERT INTO test VALUES (1, data)

对于这种事情,虽然我会使用游标而不是动态 SQL(甚至是内联 SQL)。

于 2009-03-30T09:47:19.080 回答
3

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

每个值需要一个变量。

于 2009-03-30T11:02:14.390 回答
0

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

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

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

于 2009-03-30T10:05:09.223 回答