web-dev-qa-db-ja.com

オブジェクトタイプのすべての属性を選択する方法

関数を使用して選択クエリを実行しています。この関数は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;

他のオプションはありますか?

2
Zolbayar

これはあなたが必要とする類のものかもしれないと思います。

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を持つためには、どこかで結合を定義する必要があります。私は完全な要件が本当にわからないのでそのビットは試していませんが、これで基本がわかるはずです。

1
BriteSponge

関数を数回呼び出さない場合は、関数を副選択にラップして、その結果を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にすることもできます。

0
Naeel Maqsudov