हां यह है। आपको अपने कॉलम को ऑब्जेक्ट के कंस्ट्रक्टर में लपेटना होगा और BULK COLLECT
का उपयोग करना होगा SELECT
. में विकल्प कथन:
CREATE OR REPLACE TYPE t_some_type AS OBJECT(f varchar2(10))
/
CREATE OR REPLACE TYPE t_some_table IS TABLE OF t_some_type
/
DECLARE
v_some_table t_some_table;
BEGIN
SELECT t_some_type (dummy)
BULK COLLECT INTO v_some_table
FROM DUAL;
END;
एक तरफ के रूप में, आपको यह भी सुनिश्चित करने की ज़रूरत है कि आप ऑब्जेक्ट विनिर्देश बनाते हैं, न कि केवल शरीर (जैसा कि आपके उदाहरण में है)।
SELECT
. में कॉलम उसी क्रम में होना चाहिए जैसे वे ऑब्जेक्ट के कंस्ट्रक्टर में पाए जाते हैं। यदि आपने स्पष्ट रूप से एक कंस्ट्रक्टर को परिभाषित नहीं किया है, तो विनिर्देश में घोषित क्रम में प्रत्येक कॉलम के साथ एक स्पष्ट रूप से मौजूद है।
इस कार्यक्षमता का उपयोग करने का एकमात्र नकारात्मक पक्ष यह है कि बड़ी संख्या में पंक्तियों के परिणामस्वरूप भारी स्मृति उपयोग होगा। यदि आप बड़ी संख्या में पंक्तियों को संसाधित करने के लिए इसका उपयोग करने की अपेक्षा करते हैं, तो आपको LIMIT
वाले लूप का उपयोग करना चाहिए खंड।
विनिर्देश में मिली कॉलम सूची के अतिरिक्त, एक स्पष्ट निर्माता निर्दिष्ट करना संभव है। कंस्ट्रक्टर के पास आपके द्वारा परिभाषित कोई भी इनपुट हो सकता है, इसलिए, जाहिर है, जब आप एक स्पष्ट कंस्ट्रक्टर का उपयोग करते हैं, तो आपको इसकी तर्क सूची का पालन करना होगा। यहां एक उदाहरण दिया गया है:
CREATE OR REPLACE TYPE t_some_type AS OBJECT
(
f1 VARCHAR2 (10),
CONSTRUCTOR FUNCTION t_some_type (p_length NUMBER, p_value VARCHAR2)
RETURN SELF AS RESULT
);
/
CREATE OR REPLACE TYPE BODY t_some_type AS
CONSTRUCTOR FUNCTION t_some_type (p_length NUMBER, p_value VARCHAR2)
RETURN SELF AS RESULT IS
BEGIN
self.f1 := LPAD (p_value, p_length, p_value);
RETURN;
END t_some_type;
END;
/
CREATE OR REPLACE TYPE t_some_table IS TABLE OF t_some_type
/
DECLARE
v_some_table t_some_table;
BEGIN
--Explicit Constructor
SELECT t_some_type (10, dummy)
BULK COLLECT INTO v_some_table
FROM DUAL;
DBMS_OUTPUT.put_line (v_some_table (1).f1);
--Implicit Constructor
SELECT t_some_type (dummy)
BULK COLLECT INTO v_some_table
FROM DUAL;
DBMS_OUTPUT.put_line (v_some_table (1).f1);
END;