Oracle

如何選擇對像類型的所有屬性

  • October 14, 2019

我正在執行帶有函式的選擇查詢。該函式返回具有 4 個屬性的對像類型,我想選擇所有這些屬性。

當我以這種方式嘗試時。它只返回整個類型對象。

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 來檢索數據。我不太確定完整的要求,所以沒有嘗試過,但這應該會給你一些基礎知識。

如果你不想多次呼叫一個函式,你可以將它包裝到 subselect 中,然後多次將其結果視為 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 不會呼叫該函式四次。此外,您可以使函式 DETEMINISTIC。

引用自:https://dba.stackexchange.com/questions/140675