【问题标题】:How to insert a NULL value in PL/SQL Procedure?如何在 PL/SQL 过程中插入 NULL 值?
【发布时间】:2021-11-08 09:33:18
【问题描述】:

例如表 Foobars,

CREATE TABLE Foobars(
   foo NUMBER,
   bar NUMBER
);

如何在动态 PL/SQL 过程中插入 变量 中的NULL 值?

DECLARE
   var_foo  NUMBER := 69;
   var_bar  NUMBER := NULL;
   l_insert_statement VARCHAR2(128);
BEGIN
   -- Assembles insert statement
   l_insert_statement :=
      'INSERT INTO Foobars VALUES (' ||
         var_foo || ', ' ||
         var_bar ||
      ');';
   -- Executes insert statement
   EXECUTE immediate (l_insert_statement);
END;
/

查询在“EXECUTE immediate...”行返回 ORA-00936:缺少表达式

【问题讨论】:

    标签: oracle plsql


    【解决方案1】:

    不要在动态 SQL 中使用字符串连接传递变量,将它们作为绑定变量传递(并删除动态 SQL 字符串中的 ; 语句终止符):

    DECLARE
       var_foo  NUMBER := 69;
       var_bar  NUMBER := NULL;
       l_insert_statement VARCHAR2(128);
    BEGIN
       -- Assembles insert statement
       l_insert_statement := 'INSERT INTO Foobars VALUES (:1, :2)';
       -- Executes insert statement
       EXECUTE immediate l_insert_statement USING var_foo, var_bar;
    END;
    /
    

    或者,在这种情况下,您不需要动态 SQL:

    DECLARE
       var_foo  NUMBER := 69;
       var_bar  NUMBER := NULL;
    BEGIN
       INSERT INTO Foobars VALUES (var_foo, var_bar);
    END;
    /
    

    并且不需要PL/SQL,只需使用简单的SQL语句即可:

    INSERT INTO Foobars VALUES (69, NULL);
    

    db小提琴here

    【讨论】:

      【解决方案2】:

      问题是在l_insert_statement 中以分号结尾;删除它

      No : ');';
      Yes: ')';
      

      但是,您使用的代码中没有任何动态,所以我建议您简单地使用

      begin
        insert into foobars values (var_foo, var_bar);
      end;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-13
        • 2017-10-18
        • 2018-05-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多