我对书中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版。
答案 0 :(得分:4)
你不允许写的是:
OPEN cur FOR sql_string USING NULL;
当你可以写:
OPEN cur FOR sql_string USING 'A string';
除此之外别无其他。