简体   繁体   English

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

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

I want to pass something like p.lastname or p.first_name in the query_type parameter so that i can order by what i want;我想在query_type参数中传递p.lastnamep.first_name之类的query_type以便我可以按我想要的方式订购; and accordingly, query_value would contain something like UPPER('%Smith%') or UPPER('%Henry%') depending on what i put in query_type .因此, query_value将包含类似UPPER('%Smith%')UPPER('%Henry%')具体取决于我在query_type放入的query_type

But when I pass these as strings, the cursor is returned empty.但是当我将这些作为字符串传递时,游标返回空。

Any tips?有小费吗? I would ideally not want to get rid of the cursor.理想情况下,我不想摆脱光标。

ps.附: search_cursor has been declared as a REF CURSOR in package header. search_cursor已在包头中声明为 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;

Dynamic SQL.动态 SQL。 Beware of SQL injection.谨防 SQL 注入。

As I don't have your tables, I used Scott's sample schema.由于我没有你的表,我使用了 Scott 的示例模式。

Function that returns ref cursor (that's what you do as well, only as procedure's OUT parameter):返回 ref 游标的函数(这也是您所做的,仅作为过程的 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.

Testing:测试:

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>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 将表作为参数传递给PL / SQL存储过程 - Pass table as parameter in PL/SQL stored procedure 如何将键和值作为参数传递给 pl/sql 中的存储过程 - How to pass keys and values as a parameter to stored procedure in pl/sql 在PL / SQL过程中,如何将表名作为参数传递? - In a PL/SQL procedure, how do I pass a table name as a parameter? 我可以在 SQL 存储过程中将列名作为输入参数传递吗 - Can I pass column name as input parameter in SQL stored Procedure 如何在SQL Server中将列名和表名作为参数传递给存储过程? - How to pass column name as well as Table Name to a stored procedure as a parameter in SQL Server? 在我的示例中,如何在存储过程中将参数作为列名传递 - How to pass parameter as column name in stored procedure in my example 将表名和列名动态传递给 PL/SQL 存储过程 - Passing table name and column name dynamically to PL/SQL Stored procedure PL/SQL 存储过程用于更新由参数指定的列的值 - PL/SQL stored procedure to update values of a column that is specified by the parameter SQL将字符串传递给不是列名的存储过程 - SQL Pass a string to a Stored Procedure that is not a Column Name 如何在存储过程中将架构名称作为参数传递 - How to pass schema name as parameter in stored procedure
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM