Pregunta

Estoy tratando de convertir las consultas, como a continuación a tipos por lo que no voy a tener que usar 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

anterior es sólo una muestra de consultas complejas, pero son más grandes que esto.
lo anterior es dentro de un procedimiento almacenado. Así que para evitar el GTT (my_gtt_table_1). Hice lo siguiente:

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 

Ahora en el SP:

type lname_exact is table of <what_table_should_i_put_here>%rowtype;
tab_a_recs lname_exact;

En lo anterior no estoy seguro de qué mesa para poner como mi consulta tiene subconsultas anidadas.

consulta en el SP: (Estoy tratando esto con fines de muestra para ver si funciona)

        select lname_row('',
                                '',
                                '',
                                '',
                                '',
                                '',
                                sysdate) bulk collect
          into tab_a_recs
        from table_1;

Estoy recibiendo errores como: ORA-00913: demasiados valores

Estoy muy confundido y pegado con esto: (

¿Fue útil?

Solución

Se define un tipo con 6 Atributos y se intenta crear una instancia de valores de 7. Tal vez puedas probar:

    select lname_row(/*'',*/
                     '',
                     '',
                     '',
                     '',
                     '',
                     sysdate) bulk collect
      into tab_a_recs
    from table_1;

Editar También parece haber una confusión con respecto a los tipos. En Oracle se pueden definir tipos de SQL o en PL / SQL. tipos SQL son accessibles a SQL (!) mientras que las PL / SQL ofrecen algunas características adicionales, pero son invisibles para SQL puro (PL / SQL puede también tipos SQL de acceso).

Una vez dicho esto, es confuso e imprudente tipos de nombre de la misma, tanto en SQL y PL / SQL (se ejecuta en sombra cuestiones ). Ha definido el tipo lname_exact dos veces (con su sentencia de creación y en su bloque DECLARE). Puesto que usted está instancias de un lname_exact en una sentencia SQL, el tipo elegido en este caso es del tipo SQL (con sólo 6 atributos).

Se debe eliminar ya sea la declaración de lname_exact en el SP o cambiar su nombre.

Otros consejos

Además de la excelente respuesta de Vincent: No es necesario crear explícitamente un lname_row en la consulta SQL. Granel Tomar emparejará automáticamente las columnas seleccionadas con los campos de la diana INTO. Así que en base a lo que has demostrado hasta el momento, no es necesario para crear tipos en el nivel de esquema, sólo tiene que definirlos en su bloque PL / SQL.

Este es un ejemplo simple que funciona:

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top