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

时间:2011-10-19 04:02:44

标签: sql oracle plsql oracle11g execute-immediate

我有一个关于在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参考,但他们没有像这样的选择的例子。

由于

5 个答案:

答案 0 :(得分:27)

不,你不能那样使用绑定变量。在您的第二个示例中,:into_bind中的v_query_str只是占位符,用于变量v_num_of_employees的值。您的select into语句将变为类似:

SELECT COUNT(*) INTO  FROM emp_...

因为v_num_of_employees的{​​{1}}值为null

您的第一个示例提供了将返回值绑定到变量的正确方法。

修改

原始海报编辑了我在答案中提到的第二个代码块,EXECUTE IMMEDIATE使用OUT参数模式而非默认v_num_of_employees模式。这种修改使得这两个例子在功能上等同。

答案 1 :(得分:27)

在我看来,动态PL / SQL块有点模糊。虽然非常灵活,但也很难调整,难以调试,很难弄清楚是什么。 我的投票是你的第一个选择,

EXECUTE IMMEDIATE v_query_str INTO v_num_of_employees USING p_job;

两者都使用绑定变量,但首先,对我来说,它比@jonearles选项更具可重复性和可调性。

答案 2 :(得分:19)

将select语句放在动态PL / 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 := 'begin SELECT COUNT(*) INTO :into_bind FROM emp_' 
                 || p_loc
                 || ' WHERE job = :bind_job; end;';
  EXECUTE IMMEDIATE v_query_str
    USING out v_num_of_employees, p_job;
  RETURN v_num_of_employees;
END;
/

答案 3 :(得分:0)

绑定变量可以在Oracle SQL查询中使用" in"子句。

以10克为单位;我不了解其他版本。

绑定变量的varchar最多为4000个字符。

示例:绑定包含以逗号分隔的值列表的变量,例如

:bindvar = 1,2,3,4,5

      year month  square
    1 2000     2      A1
    2 2000     2      B2
    3 2000     2      H5
    4 2000     2      J9
    5 2000     2      A2
    6 2000     3      N8
    7 2000     3      M9
    8 2000     3      C7

(与我在此处发布的信息相同:How do you specify IN clause in a dynamic query using a variable?

答案 4 :(得分:-2)

Select Into功能仅适用于PL / SQL Block,当您使用Execute immediate时,oracle会将v_query_str解释为SQL查询字符串,因此您无法使用.will get关键字缺少异常。 在例2中,我们使用begin end;所以它变成了pl / sql块并且是合法的。