我如何返回一个根据调用函数时使用的参数而变化的选择查询?



我已经纠结这个问题有一段时间了。我想构造一个带参数的函数。该函数应该使用用户提交的参数,更改select语句,然后返回/运行select。

功能:

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 f_name, e_mail from CustomersTable;

因此,我尝试了不同的方法,使函数返回查询,如我所描述的。然而,我设法做的最好的是返回一个varchar2与选择语句-然而,然后我必须删除"从开始和结束的选择块,并手动运行它。我在互联网上搜索时似乎找不到任何问题的答案,请在这里帮助我!

方法:

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,那么返回ref cursor:

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>

最新更新