我有一个关于在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参考,但他们没有像这样的选择的例子。
由于
答案 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块并且是合法的。