我对刚刚在Oracle PL/SQL 食谱一书中读到的东西的含义感到困惑中读到的内容的含义感到困惑。
在配方 8-12 中,它指出:
无法
NULL
使用本机动态 SQL 简单地传递值。至少,您不能将 aNULL
作为文字传递。
这对我来说是这样的(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 版。