oracle 如何返回一个根据调用函数时使用的参数而变化的select-query?

pgvzfuti  于 2022-12-03  发布在  Oracle
关注(0)|答案(1)|浏览(127)

我已经和这个问题纠缠了一段时间了。我想做一个带参数的函数。这个函数应该用用户提交的参数来改变一个选择语句,然后返回/运行选择语句。

函数:

create or replace FUNCTION F_GET_TABLE(column1_in varchar2, column2_in varchar2)
    return query
is 
    base_query constant varchar2(5000 char) :=
    'select column1, column2 from CustomersTable;';
begin    
    replace(replace(base_query, 'column1', column2_in),'column2', column2_in );
    queryToReturn query := base_query;
    return queryToReturn;
end F_GET_TABLE;

在我的脑海中,最终结果应该是这样调用函数:

select F_GET_TABLE('f_name','e_mail') from dual;

如果我将select-statement写成以下形式,应该会得到相同的结果:

select f_name, e_mail from CustomersTable;

所以我尝试了不同的方法来让函数返回我所描述的查询。然而,我所做的最好的事情是返回一个带有select语句的varchar 2-然而,我必须从select块的开始和结束处删除“”,然后手动运行它。我在互联网上搜索时似乎找不到任何问题的答案,请在这里帮助我!

rqcrx0a6

rqcrx0a61#

具体操作如下:

SQL> CREATE OR REPLACE FUNCTION f_get_table (column1_in  VARCHAR2,
  2                                          column2_in  VARCHAR2)
  3     RETURN VARCHAR2
  4  IS
  5     base_query  VARCHAR2 (5000) := 'select column1, column2 from emp';
  6  BEGIN
  7     RETURN REPLACE (REPLACE (base_query, 'column1', column1_in),
  8                                          'column2', column2_in);
  9  END f_get_table;
 10  /

Function created.

SQL> select f_get_table('ename', 'job') from dual;

F_GET_TABLE('ENAME','JOB')
--------------------------------------------------------------------------------
select ename, job from emp

SQL>

如果要返回 result,则返回引用游标:

SQL> CREATE OR REPLACE FUNCTION f_get_table (column1_in  VARCHAR2,
  2                                          column2_in  VARCHAR2)
  3     RETURN SYS_REFCURSOR
  4  IS
  5     base_query  VARCHAR2 (5000) := 'select column1, column2 from emp';
  6     l_rc        SYS_REFCURSOR;
  7  BEGIN
  8     OPEN l_rc FOR
  9        REPLACE (REPLACE (base_query, 'column1', column1_in),
 10                 'column2',
 11                 column2_in);
 12
 13     RETURN l_rc;
 14  END f_get_table;
 15  /

Function created.

测试:

SQL> SELECT f_get_table ('ename', 'job') FROM DUAL;

F_GET_TABLE('ENAME',
--------------------
CURSOR STATEMENT : 1

CURSOR STATEMENT : 1

ENAME      JOB
---------- ---------
KING       PRESIDENT
BLAKE      MANAGER
CLARK      MANAGER
JONES      MANAGE
<snip>

相关问题