2017-12-18 5 views
1

私はテーブルを返す関数を作成しようとしていました(おそらくプロシージャは良いでしょうか?)。現在、私はこれを持っています:関数からテーブルを返すSQLオラクル

CREATE OR REPLACE TYPE rowx AS OBJECT 
(
    nam1 VARCHAR2 (100), 
    nam2  VARCHAR2 (100) 
); 
/ 

CREATE OR REPLACE TYPE tablex 
IS TABLE OF rowx; 
/

CREATE OR REPLACE FUNCTION example(FS varchar2) 
RETURN tablex 
IS 
tab tablex; 

BEGIN 
select y.ident as PARENT, x.ident as CHILD into tab 
from relation2 rt 
inner join plate x on rt.child = x.id 
inner join plate y on rt.parent =y.id 
where x.ident like 'string1' or y.ident like 'string2'; 

RETURN tab; 
END; 

コンパイル後、私はORA-00947を受け取ります。任意のヒント?

+0

そこにそれを行うための簡単な方法があったが、私の知る限りでは、Oracleが提供しています最も近いものがパイプライン化されている場合、それはいいだろう機能;ここに詳細とのリンクがあります。 https://www.akadia.com/services/ora_pipe_functions.html 個人的には、彼らは通常、彼らが価値があるよりもトラブルが多いと思います。 – kfinity

答えて

1

この例を見てください。それは助けになるのか?

私のTESTテーブルはあなたのテーブルを表します。この関数は、コレクションを返します。このコレクションは、TABLEステートメントとともにSELECTステートメントで使用されます。

SQL> create table test (nam1 varchar2(10), nam2 varchar2(10)); 

Table created. 

SQL> insert into test values ('Little', 'Foot'); 

1 row created. 

SQL> insert into test values ('Stack', 'Overflow'); 

1 row created. 

SQL> create or replace type t_tf_row as object (nam1 varchar2(10), nam2 varchar2(10)); 
    2/

Type created. 

SQL> create or replace type t_tf_tab is table of t_tf_row; 
    2/

Type created. 

SQL> 
SQL> create or replace function get_tab_tf return t_tf_tab as 
    2 l_tab t_tf_tab := t_tf_tab(); 
    3 begin 
    4 for cur_r in (select nam1, nam2 from test) loop 
    5  l_tab.extend; 
    6  l_tab(l_tab.last) := t_tf_row(cur_r.nam1, cur_r.nam2); 
    7 end loop; 
    8 return l_tab; 
    9 end; 
10/

Function created. 

SQL> 
SQL> select * From table(get_Tab_tf); 

NAM1  NAM2 
-------------------- 
Little Foot 
Stack  Overflow 

SQL> 
+0

はい、とても役に立ちました。私はあなたの事例に基づいていて、私が望むものを達成しました。ありがとう! – Hadean

2

クエリでは2つのスカラー値を選択し、それらをオブジェクト型のテーブルに入れようとしています。このタイプには2つのフィールドがありますが、自動での相反はありません。したがって、明示的にオブジェクトを構築する必要があります。これはクエリの一部として行うことができます。

また、あなたのコレクションを移入するために大量のクエリを使用する必要があります。

select rowx(y.ident, x.ident) 
bulk collect into tab 
from relation2 rt 
... 
関連する問題