我不确定你是否可以做你想做的事(至少,不是在 Oracle 中)。
从表中获取某些内容的常用方法是运行select 语句,或者,如果您愿意,也可以运行(存储的)函数。您将参数传递给它并获得结果。这就是它的工作原理。您没有传递“config.a.vstr_content”(无论它代表什么)。
这里有几个例子,看看是否有帮助。
(哦,是的 - 您的代码甚至无法运行,它会因 TOO_MANY_ROWS 错误而失败)。
示例表:
SQL> select * From config;
ID_PROCEDURE VSTR_NAME VSTR_CONTENT
--------------- ---------- ------------
P1 A C1
P1 B C2
P1 C C3
SQL>
一个简单的函数,返回标量变量;就像您的情况一样,如果不止一行满足 WHERE 条件,它可能会失败。
SQL> create or replace function f_config
2 (par_id_procedure in varchar2, par_name in varchar2)
3 return config.vstr_content%type is
4 retval config.vstr_content%type;
5 begin
6 select vstr_content
7 into retval
8 from config
9 where (id_procedure = par_id_procedure or par_id_procedure is null)
10 and (vstr_name = par_name or par_name is null);
11 return retval;
12 end;
13 /
Function created.
测试:
SQL> select f_config('P1', 'A') from dual;
F_CONFIG('P1','A')
--------------------------------------------------------------------------------
C1
SQL> select f_config('P1', null) from dual;
select f_config('P1', null) from dual
*
ERROR at line 1:
ORA-01422: exact fetch returns more than requested number of rows
ORA-06512: at "SCOTT.F_CONFIG", line 6
SQL>
那么,返回一个 refcursor 怎么样?
SQL> create or replace function f_config
2 (par_id_procedure in varchar2, par_name in varchar2)
3 return sys_refcursor is
4 retval sys_refcursor;
5 begin
6 open retval for
7 select *
8 from config
9 where (id_procedure = par_id_procedure or par_id_procedure is null)
10 and (vstr_name = par_name or par_name is null);
11 return retval;
12 end;
13 /
Function created.
测试:
SQL> select f_config('P1', 'A') from dual;
F_CONFIG('P1','A')
--------------------
CURSOR STATEMENT : 1
CURSOR STATEMENT : 1
ID V VS
-- - --
P1 A C1
SQL> select f_config('P1', null) from dual;
F_CONFIG('P1',NULL)
--------------------
CURSOR STATEMENT : 1
CURSOR STATEMENT : 1
ID V VS
-- - --
P1 A C1
P1 B C2
P1 C C3
SQL>
或者,返回一个集合:
SQL> create or replace type t_row as object
2 (id_procedure varchar2(10),
3 name varchar2(10),
4 content varchar2(10));
5 /
Type created.
SQL> create or replace type t_tab as table of t_row;
2 /
Type created.
SQL> create or replace function f_config
2 (par_id_procedure in varchar2, par_name in varchar2)
3 return t_tab is
4 retval t_tab;
5 begin
6 select t_row(id_procedure, vstr_name, vstr_content)
7 bulk collect into retval
8 from config
9 where (id_procedure = par_id_procedure or par_id_procedure is null)
10 and (vstr_name = par_name or par_name is null);
11 return retval;
12 end;
13 /
Function created.
测试:
SQL> select * From table(f_config('P1', 'A'));
ID_PROCEDU NAME CONTENT
---------- ---------- ----------
P1 A C1
SQL> select content From table(f_config('P1', 'A'));
CONTENT
----------
C1
SQL> select * from table(f_config('P1', null));
ID_PROCEDU NAME CONTENT
---------- ---------- ----------
P1 A C1
P1 B C2
P1 C C3
SQL>
如果这些都没有帮助,请解释一下你写的最后一句话的确切含义(“但是,我想要一个方法......”)。