1

我对刚刚在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 版。

4

1 回答 1

4

你不能写的是:

OPEN cur FOR sql_string USING NULL;

你什么时候可以写:

OPEN cur FOR sql_string USING 'A string'; 

没有什么了。

于 2013-08-26T19:07:43.170 回答