我正在尝试将如下查询转换为类型,这样我就不必使用 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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top