gpt4 book ai didi

oracle - 是否可以对对象类型的表执行选择?

转载 作者:行者123 更新时间:2023-12-04 22:11:24 24 4
gpt4 key购买 nike

所以我有一个类型

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;

我想从某个 View 中选择行到这个 T_Some_Table
select * 
into T_Some_Table
from V_Some_View

这甚至可能吗,这样做有什么缺点吗(如果可能的话)。
T_Some_Type 中做列必须与 V_Some_View 中的顺序相同或者如果列名相同,plsql 会在此处进行绑定(bind)吗?

如果不可能,还有什么替代方案?

编辑:假设已经定义了 body ,它们不在这里,因为它们与问题无关。

最佳答案

是的。您需要将列包装在对象的构造函数中并使用 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;

关于oracle - 是否可以对对象类型的表执行选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30305161/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com