関数を使用して選択クエリを実行しています。この関数は4つの属性を持つオブジェクトタイプを返します。これらの属性をすべて選択したいと思います。
この方法で試してみると全体としてtypeオブジェクトのみを返します。
SELECT SERVICE_TYPE, FN_GET_ADDRESS_DETAIL(USER_ID) FROM REG_ADDRESS;
それは返します:
SERVICE_TYPE | FN_GET_ADDRESS_DETAIL(USER_ID)
---------------------------------------------
0 | USERNAME.ADDRESS_DETAIL_T
0 | USERNAME.ADDRESS_DETAIL_T
0 | USERNAME.ADDRESS_DETAIL_T
私のオブジェクトタイプは次のとおりです:
CREATE OR REPLACE TYPE ADDRESS_DETAIL_T AS OBJECT
(
apt_number NUMBER,
district_name NVARCHAR2(40),
zipcode NUMBER,
whatever NVARCHAR2(40)
);
また、関数呼び出しの後に属性名を指定すると機能します。しかし、すべての属性を選択するには、関数を4回呼び出す必要があります。 O_O
SELECT SERVICE_TYPE, FN_GET_ADDRESS_DETAIL(USER_ID).apt_number,
FN_GET_ADDRESS_DETAIL(USER_ID).district_name,
FN_GET_ADDRESS_DETAIL(USER_ID).zipcode,
FN_GET_ADDRESS_DETAIL(USER_ID).whatever, FROM REG_ADDRESS;
他のオプションはありますか?
これはあなたが必要とする類のものかもしれないと思います。
WITH get_detail
AS (SELECT get_addr(col1) AS obj_type from my_test)
SELECT x.obj_type.district_name FROM get_detail x
/
これは、テストするために作成したものです。
CREATE OR REPLACE TYPE my_ADDRESS_DETAIL_T AS OBJECT
(
apt_number NUMBER,
district_name NVARCHAR2(40),
zipcode NUMBER
)
/
create table my_test
(col1 number,
addr_detl my_address_detail_t)
/
INSERT INTO my_test
values(1, my_address_detail_t(1,'HOME',12345))
/
commit
/
そして機能;
CREATE OR REPLACE FUNCTION my_get_addr(addr_id IN NUMBER)
RETURN my_address_detail_t IS
addr_t my_address_detail_t;
BEGIN
SELECT addr_detl
INTO addr_t
FROM my_test
WHERE col1 = addr_id;
RETURN addr_t;
END;
Get_detailがデータを取得するための正しいcol1を持つためには、どこかで結合を定義する必要があります。私は完全な要件が本当にわからないのでそのビットは試していませんが、これで基本がわかるはずです。
関数を数回呼び出さない場合は、関数を副選択にラップして、その結果をmy_address_detail_tとして数回処理することができます。
SELECT
SERVICE_TYPE,
ADDR.apt_number,
ADDR.district_name,
ADDR.zipcode,
ADDR.whatever
FROM (SELECT SERVICE_TYPE, FN_GET_ADDRESS_DETAIL(USER_ID)
FROM REG_ADDRESS);
ところで、あなたが書いても信じる:
SELECT SERVICE_TYPE, FN_GET_ADDRESS_DETAIL(USER_ID).apt_number,
FN_GET_ADDRESS_DETAIL(USER_ID).district_name,
FN_GET_ADDRESS_DETAIL(USER_ID).zipcode,
FN_GET_ADDRESS_DETAIL(USER_ID).whatever, FROM REG_ADDRESS;
Oracleはこの関数を4回呼び出しません。さらに、関数をDETEMINISTICにすることもできます。