2017-10-02 12 views
0

アプリケーションでは、SQL文を使用して要素を初期化できます。グローバルタイプのない関数から複数の値を返す方法

SELECT name $GUIElement 
FROM myTable 
WHERE id = 1337; 

基本的なデータベース構造が変更される可能性があるため、構造体を非表示にして、代わりにOracleパッケージをインタフェースとして使用することをおすすめします。今私は、リストの初期化の問題に直面しています

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

:単一の値の場合、このアプローチは次のような機能とうまく動作します。関数から複数の値を返すには、新しいSQL型を定義する必要があります。関数がTABLE OF VARCHAR2を返す場合、このコードは動作します:

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

は、残念ながら、私は生産的なデータベースに新しいタイプを作成するには何の権利を持っていません。 Oracleでは、新しいデータ型を定義せずに同様の動作をさせる方法はありますか?私はSYS_REFCURSERを調べましたが、正しく動作していないようです。

+0

なぜ機能が常にテーブルを返すように設定しないのですか? –

+0

私が知る限り、テーブルを返すには新しいSQL型が必要です。 – Thanthla

+0

これは、PL/SQLでデータ・カートリッジを作成することで実行できます。例えば、ここに:http://www.oracle-developer.net/display.php?id=422そしてここに:https://github.com/method5/method4 –

答えて

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' 
       ) 
+0

非常にいい解決法。私は数日待って、エレガントなものが提案されなければ、私はあなたの答えを受け入れるでしょう。 – Thanthla

関連する問題