代码之家  ›  专栏  ›  技术社区  ›  Omnipresent

关于在oracle中使用类型而不是gtt的困惑

  •  0
  • Omnipresent  · 技术社区  · 16 年前

    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(我的gtt表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:太多的值

    我真的很困惑,并且被这个问题困扰着:(

    2 回复  |  直到 16 年前
        1
  •  2
  •   Vincent Malgrat    16 年前

    6 属性并尝试用 价值观。请尝试以下操作:

        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(您遇到的)中命名相同的类型是令人困惑和不明智的 shadowing lname_exact 键入两次(使用CREATE语句和DECLARE块)。因为您正在实例化 完全相同 在SQL语句中,本例中选择的类型是SQL类型(只有6个属性)。

    完全相同 或将其重命名。

        2
  •  0
  •   Dave Costa    16 年前

    下面是一个简单的例子:

    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