Oracle
如何選擇對像類型的所有屬性
我正在執行帶有函式的選擇查詢。該函式返回具有 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。