在 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;
/

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

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 语句作为我的动态字符串,并在 INTO 子句中使用了绑定变量。

我现在正在旅行,几天内无法在家中使用我的电脑,但这一直困扰着我。尝试阅读 PL/SQL 参考,但他们没有这样的选择示例。

谢谢

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

EXECUTE IMMEDIATE v_query_str INTO v_num_of_employees USING p_job;

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

不,你不能以这种方式使用绑定变量。在您的第二个示例中,:into_bind v_query_str 中只是一个变量 v_num_of_employees 值的占位符。您的 select into 语句将变成类似以下内容:

SELECT COUNT(*) INTO  FROM emp_...

因为v_num_of_employees的值nullEXECUTE IMMEDIATE.

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

编辑

原始海报编辑了我在答案中引用的第二个代码块,以v_num_of_employees使用OUT参数模式而不是默认的IN模式。此修改使这两个示例在功能上等效。

将 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;
/

Bind 变量可以在 Oracle SQL 查询中使用,带有 "in" 子句。

10克工作;我不知道其他版本。

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

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

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

select * from mytable
  where myfield in
    (
      SELECT regexp_substr(:bindvar,'[^,]+', 1, level) items
      FROM dual
      CONNECT BY regexp_substr(:bindvar, '[^,]+', 1, level) is not null
    );

(与我在这里发布的信息相同:如何使用变量在动态查询中指定 IN 子句?

Select Into 功能仅适用于 PL/SQL Block,当您使用立即执行时,oracle 会v_query_str解释为 SQL 查询字符串,因此您不能使用 into .will get 关键字缺少异常。在示例 2 中,我们使用开始结束;所以它变成了PL/SQL块及其合法。

相关内容

  • 没有找到相关文章

最新更新