はい、そうです。オブジェクトのコンストラクターで列をラップし、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;