在PL/SQL中使用绑定变量和动态SELECT INTO子句

我有一个问题,在PL / SQL中的动态SQL语句中绑定变量可以在哪里使用。

例如,我知道这是有效的:

CREATE OR REPLACE FUNCTION get_num_of_employees (p_loc VARCHAR2, p_job VARCHAR2) 
RETURN NUMBER
IS
  v_query_str VARCHAR2(1000);
  v_num_of_employees NUMBER;
BEGIN
  v_query_str := 'SELECT COUNT(*) FROM emp_' 
                 || p_loc
                 || ' WHERE job = :bind_job';                           
  EXECUTE IMMEDIATE v_query_str
    INTO v_num_of_employees
    USING p_job;
  RETURN v_num_of_employees;
END;
/

我想知道你是否可以在这样的select语句中使用绑定变量

CREATE OR REPLACE FUNCTION get_num_of_employees (p_loc VARCHAR2, p_job VARCHAR2) 
RETURN NUMBER
IS
  v_query_str VARCHAR2(1000);
  v_num_of_employees NUMBER;
BEGIN
  v_query_str := 'SELECT COUNT(*) INTO :into_bind FROM emp_' 
                 || p_loc
                 || ' WHERE job = :bind_job';                           
  EXECUTE IMMEDIATE v_query_str
    USING out v_num_of_employees, p_job;
  RETURN v_num_of_employees;
END;
/

注意我使用一个SELECT INTO语句作为我的dyamic字符串,并在INTO子句中使用一个绑定变量。

我现在正在旅行,将不能访问我的电脑回家在家里几天,但这一直困扰我一点。尝试读取PL / SQL引用,但他们没有像这样的选择的例子。

谢谢

最佳答案
不,你不能这样使用绑定变量。在第二个示例中:v_query_str中的into_bind只是变量v_num_of_employees的值的占位符。你的select into语句将变成:

SELECT COUNT(*) INTO  FROM emp_...

因为在EXECUTE IMMEDIATE时,v_num_of_employees的值为null。

你的第一个例子介绍了将返回值绑定到变量的正确方法。

编辑

原来的海报已经编辑了第二个代码块,我在我的回答使用OUT参数模式为v_num_of_employees而不是默认的IN模式。该修改使得这两个示例在功能上等效。

转载注明原文:在PL/SQL中使用绑定变量和动态SELECT INTO子句 - 代码日志