在PL / SQL中使用dynamicSELECT INTO子句中的绑定variables

我有一个关于在PL / SQL的dynamicSQL语句中可以使用哪些绑定variables的问题。

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

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语句中使用绑定variables

 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语句作为我的dynamicstring,并在INTO子句中使用了一个绑定variables。

我目前正在旅行,几天后我的电脑将无法使用,但是这一直让我感到厌烦。 尝试阅读PL / SQL的参考,但他们没有这样的select的例子。

谢谢

不,你不能以这种方式使用绑定variables。 在第二个示例中:into_bind中的v_query_str只是variablesv_num_of_employees值的占位符 。 您的select into语句将变成如下所示:

 SELECT COUNT(*) INTO FROM emp_... 

因为在EXECUTE IMMEDIATEv_num_of_employees值为null

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

编辑

原来的海报已经编辑了第二个代码块,我在我的答案中提到使用OUT参数模式v_num_of_employees而不是默认的IN模式。 这种修改使得这两个例子在function上是等同的。

在我看来,一个dynamic的PL / SQL块是有点模糊的。 虽然很灵活,也很难调整,难以debugging,很难弄清楚发生了什么。 我的投票是你的第一select,

 EXECUTE IMMEDIATE v_query_str INTO v_num_of_employees USING p_job; 

两者都使用绑定variables,但首先对我来说,比@jonearles选项更易于修改和调整。

把select语句放在一个dynamic的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; / 

绑定variables可以在带有“in”子句的Oracle SQL查询中使用。

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

绑定variables是最多4000个字符的varchar。

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

: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 ); 

(和我在这里发布的信息相同: 如何在使用variables的dynamic查询中指定IN子句? )

Select Intofunction仅适用于PL / SQL Block,当您使用Execute immediate时,oracle会将v_query_str解释为一个SQL查询string,因此您将无法使用。 在例2中,我们使用begin end; 所以它变成了PL / SQL块和它的合法性。

Interesting Posts