在 oracle 中使用类型而不是 gtts 的困惑
题
我正在尝试将如下查询转换为类型,这样我就不必使用 GTT:
insert into my_gtt_table_1
(house, lname, fname, MI, fullname, dob)
(select house, lname, fname, MI, fullname, dob
from (select 'REG' house, mbr_last_name lname, mbr_first_name fname, mbr_mi MI,
mbr_first_name || mbr_mi || mbr_last_name fullname, mbr_dob dob from
table_1 a, table_b
where a.head = b.head and mbr_number = '01' and mbr_last_name = v_last_name) c
上面只是一个示例,但复杂的查询比这更大。
上面是一个存储过程。所以要避免gtt(my_gtt_table_1)。我做了以下事情:
create or replace type lname_row as object
(
house varchar2(30)
lname varchar2(30),
fname varchar2(30),
MI char(1),
fullname VARCHAR2(63),
dob DATE
)
create or replace type lname_exact as table of lname_row
现在在 SP 中:
type lname_exact is table of <what_table_should_i_put_here>%rowtype;
tab_a_recs lname_exact;
在上面我不确定要放置哪个表,因为我的查询具有嵌套子查询。
在SP中查询:(我正在尝试此示例以查看它是否有效)
select lname_row('',
'',
'',
'',
'',
'',
sysdate) bulk collect
into tab_a_recs
from table_1;
我收到如下错误:ORA-00913:太多的值
我真的很困惑并坚持这个:(
解决方案
您定义了一个类型 6 属性并且你尝试用它来实例化它 7 价值观。试试这个:
select lname_row(/*'',*/
'',
'',
'',
'',
'',
sysdate) bulk collect
into tab_a_recs
from table_1;
编辑关于类型似乎也存在混乱。在 Oracle 中,您可以在 SQL 或 PL/SQL 中定义类型。SQL 类型可以访问 SQL(!),而 PL/SQL 类型提供一些额外的功能,但对于纯 SQL 来说是不可见的(PL/SQL 也可以访问 SQL 类型)。
话虽这么说,在 SQL 和 PL/SQL 中命名相同的类型是令人困惑且不明智的(您会遇到 影子 问题)。您定义了 lname_exact
输入两次(使用 CREATE STATEMENT 并在 DECLARE 块中)。由于您正在实例化一个 lname_exact
在 SQL 语句中,本例中选择的类型是 SQL 类型(只有 6 个属性)。
您应该删除以下声明 lname_exact
在 SP 上或重命名它。
其他提示
在除文森特的出色答卷:你并不需要显式地创建您的SQL查询的lname_row。 BULK COLLECT会自动匹配了INTO目标领域选定的列。因此,基于到目前为止,你已经证明什么,你并不需要在架构级别创建类型,你只需要在你的PL / SQL块来定义它们。
下面是一个简单的例子,作品:
SQL> l
1 declare
2 type my_row is record (x number, y date);
3 type my_tab is table of my_row;
4 a_table my_tab;
5 begin
6 select 1,sysdate
7 bulk collect into a_table
8 from dual;
9 dbms_output.put_line(a_table(1).y);
10* end;
SQL> /
14-JUN-10
不隶属于 StackOverflow