oracle – 是否可以执行对象类型的select into表?
所以我有一个类型 create or replace type body T_Some_type is object (...fields) 我有一个由T_Some_type类型的行组成的表类型 create or replace TYPE T_Some_Table IS TABLE OF T_Some_type; 我想从一些视图中选择行到这个T_Some_Table select * into T_Some_Table from V_Some_View 这是否可能,并且这样做是否有任何缺点(如果可能的话). 如果不可能,会有什么替代方案? 编辑:假设已定义主体,它们不在此处,因为它们与问题无关. 解决方法是的.您需要将列包装在对象的构造函数中,并使用SELECT语句中的BULK COLLECT选项: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; (编辑:青岛站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |