我有一个关于绑定变量可以在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
的值null
在EXECUTE 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块及其合法。