如何在 PL/SQL 中的存储过程中将列名作为参数传递?

How to pass column name as parameter in a Stored Procedure in PL/SQL?

我想在 query_type 参数中传递 p.lastnamep.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>