为什么“不可能简单地使用本机动态SQL传递NULL值”?

时间:2013-08-26 18:29:33

标签: oracle plsql

我对书中Oracle PL/SQL Recipes所读到的内容的含义感到困惑。

在食谱8-12中,它指出:

  

无法使用本机动态简单地传递NULL值   SQL。至少,您无法将NULL作为文字传递。

这对我来说意味着类似以下(A)

DECLARE
  v_string varchar2(255);
  v_count natural;
BEGIN
  v_string := 'SELECT count(*) INTO :count FROM item WHERE color IS NOT NULL';


  EXECUTE IMMEDIATE v_string INTO v_count;

  dbms_output.put_line('Count: ' || v_count);
END;

无法正常工作。它建议(B)

  

通过EXECUTE IMMEDIATE语句传递未初始化的变量   将NULL值替换为绑定具有相同的效果   变量

本书的示例代码:

DECLARE
  TYPE cur_type IS REF CURSOR;
  cur                cur_type;
  null_value    CHAR(1);
  sql_string     VARCHAR2(150);
  emp_rec       employees%ROWTYPE;
BEGIN
  sql_string := 'SELECT * ' ||
                          'FROM EMPLOYEES ' ||
                       'WHERE MANAGER_ID IS :null_val';

  OPEN cur FOR sql_string USING null_value;
  LOOP
    FETCH cur INTO emp_rec;
    DBMS_OUTPUT.PUT_LINE(emp_rec.first_name || ' ' || emp_rec.last_name || 
                                                        ' - ' || emp_rec.email);
    EXIT WHEN cur%NOTFOUND;
  END LOOP;
  CLOSE cur;
 END;
/

所以我的困惑是:方法(A)对我来说似乎表现得很好,无论我是否动态运行查询,它都正确选择没有NULL的记录(或与他们一起,如果我颠倒了条件)。

那么这个问题是什么?我正在运行Oracle 11g第2版。

1 个答案:

答案 0 :(得分:4)

你不允许写的是:

OPEN cur FOR sql_string USING NULL;

当你可以写:

OPEN cur FOR sql_string USING 'A string'; 

除此之外别无其他。