如何从没有全局类型的函数返回多个值

时间:2017-10-02 16:29:21

标签: sql oracle

在应用程序中,GUI-Elements可以使用SQL语句进行初始化。

SELECT name $GUIElement
FROM myTable
WHERE id = 1337;

由于底层数据库结构可能会发生变化,我宁愿隐藏结构并使用Oracle Package作为接口。对于单个值,此方法适用于以下函数:

SELECT myPackage.getNameByID(1337) $GUIElement
FROM DUAL;

现在我面临初始化列表的问题。原始代码:

SELECT name $GUIList
FROM myTable;

要从函数返回多个值,我需要定义一个新的SQL类型。如果函数返回TABLE OF VARCHAR2,则此代码有效:

SELECT COLUMN_VALUE $GUIList 
FROM TABLE(myPackage.getNames())

不幸的是,我无权在高效数据库上创建新类型。 那么,Oracle是否有办法在不定义新数据类型的情况下获得类似的行为?我调查了SYS_REFCURSER,但似乎没有正常工作。

1 个答案:

答案 0 :(得分:1)

xmltype怎么样?该函数始终返回xml类型。而对于处理此对象,您使用的是xmltable。

像这样的东西。

create or replace function return_params return xmltype is
 result xmltype;
begin 

select xmlelement(params,xmlagg(xmlelement(param,xmlforest(name,value,data_type)))) into result from (
select 'param_name1' name, 'param_value1' value , 'varchar2' data_type from dual
union all
select 'param_name2' name, 'param_value2' value , 'varchar2' data_type from dual
union all
select 'param_name3' name, 'param_value3' value , 'varchar2' data_type from dual
);  return result;
end;

select * from xmltable('/PARAMS/PARAM' passing return_params 
                 columns name varchar2(1000) path 'NAME'
                         ,value varchar2(1000) path 'VALUE'
                         ,data_type varchar2(1000) path 'DATA_TYPE'
                 )