所以我有一个类型
create or replace type body T_Some_type is object
(...fields)
Run Code Online (Sandbox Code Playgroud)
我有一个由T_Some_type类型的行组成的表类型
create or replace TYPE T_Some_Table IS TABLE OF T_Some_type;
Run Code Online (Sandbox Code Playgroud)
我想从一些视图中选择行到这个T_Some_Table
select *
into T_Some_Table
from V_Some_View
Run Code Online (Sandbox Code Playgroud)
这是否可能,并且这样做是否有任何缺点(如果可能的话).如果列的名称相同,那么列中的列T_Some_Type必须与in中的列相同V_Some_View或者plsql是否会绑定吗?
如果不可能,会有什么替代方案?
编辑:假设已定义主体,它们不在此处,因为它们与问题无关.
All*_*lan 10
是的.您需要将列包装在对象的构造函数中并使用语句中的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;
Run Code Online (Sandbox Code Playgroud)
另外,您还需要确保创建对象规范,而不仅仅是正文(如示例中所示).
其中的列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;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9417 次 |
| 最近记录: |