如何在 plsql 函数中使用绑定变量
How can I use bind variable in plsql function
我有这样的功能:
create or replace function params
(
p_pr varchar2,
p_qu_id varchar2,
p_date date := sysdate,
p_param varchar2 := null
)
return varchar2
as
...
sql_stmt varchar2(4000);
rc sys_refcursor;
...
BEGIN
sql_stmt := 'select parameter_name, parameter_value from ' || p_pr | '.v_view where query_id = ''' || p_qu_id || '''';
IF p_param IS NOT NULL
THEN
sql_stmt := sql_stmt || ' and parameter_value=''' || p_param || '''';
END IF;
OPEN rc FOR sql_stmt;
LOOP
FETCH rc
INTO v_param_name, v_param_value;
EXIT WHEN rc%NOTFOUND;
EXIT WHEN v_param_value is NULL;
....
DBA 说这个函数使用硬解析,我必须在这个函数中使用绑定变量。我该怎么做?
谢谢。
I must use bind variable in this function.
解决方法是在模板中使用占位符 SQL ...
sql_stmt := sql_stmt || ' and parameter_value= :p1';
...然后在打开引用游标时使用 USING 子句传递实际值。
事情有点棘手,因为您根据是否填充参数执行不同的语句。所以你需要做这样的事情:
sql_stmt := 'select parameter_name, parameter_value from ' || p_pr
|| '.v_view where query_id =:p1';
IF p_param IS NOT NULL
THEN
sql_stmt := sql_stmt || ' and parameter_value= :p2';
OPEN rc FOR sql_stmt using p_qu_id, p_param;
else
OPEN rc FOR sql_stmt using p_qu_id;
END IF;
LOOP
请注意,p_pr
- 架构名称 - 不能替换为绑定变量。
我有这样的功能:
create or replace function params
(
p_pr varchar2,
p_qu_id varchar2,
p_date date := sysdate,
p_param varchar2 := null
)
return varchar2
as
...
sql_stmt varchar2(4000);
rc sys_refcursor;
...
BEGIN
sql_stmt := 'select parameter_name, parameter_value from ' || p_pr | '.v_view where query_id = ''' || p_qu_id || '''';
IF p_param IS NOT NULL
THEN
sql_stmt := sql_stmt || ' and parameter_value=''' || p_param || '''';
END IF;
OPEN rc FOR sql_stmt;
LOOP
FETCH rc
INTO v_param_name, v_param_value;
EXIT WHEN rc%NOTFOUND;
EXIT WHEN v_param_value is NULL;
....
DBA 说这个函数使用硬解析,我必须在这个函数中使用绑定变量。我该怎么做?
谢谢。
I must use bind variable in this function.
解决方法是在模板中使用占位符 SQL ...
sql_stmt := sql_stmt || ' and parameter_value= :p1';
...然后在打开引用游标时使用 USING 子句传递实际值。
事情有点棘手,因为您根据是否填充参数执行不同的语句。所以你需要做这样的事情:
sql_stmt := 'select parameter_name, parameter_value from ' || p_pr
|| '.v_view where query_id =:p1';
IF p_param IS NOT NULL
THEN
sql_stmt := sql_stmt || ' and parameter_value= :p2';
OPEN rc FOR sql_stmt using p_qu_id, p_param;
else
OPEN rc FOR sql_stmt using p_qu_id;
END IF;
LOOP
请注意,p_pr
- 架构名称 - 不能替换为绑定变量。