【问题标题】:How to insert dynamically through a variable in PL/SQL?如何通过 PL/SQL 中的变量动态插入?
【发布时间】:2010-10-16 08:18:49
【问题描述】:

让我们先创建一个表

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;

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

【问题讨论】:

  • 尝试通过执行字符串操作来创建 :dynstmt 字符串,包括 srting 值的引号,然后使用 EXEC SQL EXECUTE IMMEDIATE :dynstmt。请注意,这不是一个好的做法,因为它很容易发生 SQL 注入。

标签: sql database insert dynamic


【解决方案1】:

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

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】:

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

INSERT INTO test (name) VALUES (data)

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

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

或者简单地说:

INSERT INTO test VALUES (1, data)

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

【讨论】:

    【解决方案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;
    

    每个值需要一个变量。

    【讨论】:

    • :b1 为我替换为字符串“v_id”
    • @Eildosa 你把using 'v_id', 'v_name'了吗?
    • 所以你没有按照我回答的方法,得到不同的结果?很有趣,但不确定我能提供什么帮助?
    • 不,抱歉,它含糊不清,我的意思是因为它不起作用,所以我改用了其他方法。当我使用您的方法时,它会将变量的名称放在语句中,而不是变量的内容。 ||但是把变量的内容放
    • 不,它没有。如果发生这种情况,我可以向你保证,你没有使用我的代码。
    【解决方案4】:

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

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

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

    【讨论】:

    • thanx buddy...但它仍然显示错误 - ORA-00984: column not allowed here
    • 应该推荐绑定变量,但是对于偶尔的插入可能不会有性能损失,尽管这是一个 sql 注入攻击的机会。
    • 那是因为数据需要是:'1,''sunny''' 才能工作。无论如何,最好避免这种方法,就像 Martlark 时代一样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-11
    • 2015-07-29
    • 2019-01-24
    • 2011-04-06
    • 1970-01-01
    • 2018-04-12
    • 2021-09-16
    相关资源
    最近更新 更多