如何在 PL/SQL 中的存储过程中将列名作为参数传递?
How to pass column name as parameter in a Stored Procedure in PL/SQL?
我想在 query_type
参数中传递 p.lastname
或 p.first_name
之类的内容,以便我可以按自己的需要进行排序;因此,query_value
将包含 UPPER('%Smith%')
或 UPPER('%Henry%')
之类的内容,具体取决于我在 query_type
.
中输入的内容
但是当我将它们作为字符串传递时,游标返回为空。
有没有ps?理想情况下,我不想摆脱光标。
ps。 search_cursor
已在包 header.
中声明为 REF CURSOR
PROCEDURE test_proc(
company_id IN NUMBER,
query_type IN VARCHAR2,
query_value IN VARCHAR2,
result_limit IN NUMBER,
cur OUT search_cursor) AS
BEGIN
OPEN cur FOR
select *
from (SELECT p.first_name as "first_name",
p.surname as "surname",
row_number()
OVER (ORDER BY query_type asc) rn
FROM person p, company c
WHERE c.employee_id = p.person_id
AND c.id = company_id
AND query_type LIKE query_value
)
where rn BETWEEN 1 AND result_limit;
END test_proc;
动态SQL。谨防 SQL 注入。
因为我没有你的表,所以我使用了 Scott 的示例模式。
returns 引用游标的函数(这也是您所做的,仅作为过程的 OUT 参数):
SQL> create or replace function f_test
2 (query_type in varchar2,
3 query_value in varchar2
4 )
5 return sys_refcursor
6 is
7 l_str varchar2(500);
8 rc sys_refcursor;
9 begin
10 l_str := 'select e.ename, e.job, ' ||
11 ' row_number() over (order by ' || query_type || ' asc) rn ' ||
12 'from emp e join dept d on e.deptno = d.deptno ' ||
13 'where ' || query_type || ' like ' || query_value;
14 open rc for l_str;
15 return rc;
16 end;
17 /
Function created.
测试:
SQL> select f_test('e.ename', q'[upper('%King%')]') from dual;
F_TEST('E.ENAME',Q'[
--------------------
CURSOR STATEMENT : 1
CURSOR STATEMENT : 1
ENAME JOB RN
---------- --------- ----------
KING PRESIDENT 1
SQL>
我想在 query_type
参数中传递 p.lastname
或 p.first_name
之类的内容,以便我可以按自己的需要进行排序;因此,query_value
将包含 UPPER('%Smith%')
或 UPPER('%Henry%')
之类的内容,具体取决于我在 query_type
.
但是当我将它们作为字符串传递时,游标返回为空。
有没有ps?理想情况下,我不想摆脱光标。
ps。 search_cursor
已在包 header.
PROCEDURE test_proc(
company_id IN NUMBER,
query_type IN VARCHAR2,
query_value IN VARCHAR2,
result_limit IN NUMBER,
cur OUT search_cursor) AS
BEGIN
OPEN cur FOR
select *
from (SELECT p.first_name as "first_name",
p.surname as "surname",
row_number()
OVER (ORDER BY query_type asc) rn
FROM person p, company c
WHERE c.employee_id = p.person_id
AND c.id = company_id
AND query_type LIKE query_value
)
where rn BETWEEN 1 AND result_limit;
END test_proc;
动态SQL。谨防 SQL 注入。
因为我没有你的表,所以我使用了 Scott 的示例模式。
returns 引用游标的函数(这也是您所做的,仅作为过程的 OUT 参数):
SQL> create or replace function f_test
2 (query_type in varchar2,
3 query_value in varchar2
4 )
5 return sys_refcursor
6 is
7 l_str varchar2(500);
8 rc sys_refcursor;
9 begin
10 l_str := 'select e.ename, e.job, ' ||
11 ' row_number() over (order by ' || query_type || ' asc) rn ' ||
12 'from emp e join dept d on e.deptno = d.deptno ' ||
13 'where ' || query_type || ' like ' || query_value;
14 open rc for l_str;
15 return rc;
16 end;
17 /
Function created.
测试:
SQL> select f_test('e.ename', q'[upper('%King%')]') from dual;
F_TEST('E.ENAME',Q'[
--------------------
CURSOR STATEMENT : 1
CURSOR STATEMENT : 1
ENAME JOB RN
---------- --------- ----------
KING PRESIDENT 1
SQL>