Pregunta

Tengo algunos prob con la tabla de funciones en Oracle.

SET SERVEROUTPUT ON SIZE 100000;

DECLARE 

int_position NUMBER(20);

TYPE T_REC_EMP IS RECORD (  nameFile VARCHAR2(200) );    

R_EMP T_REC_EMP ; -- variable enregistrement de type T_REC_EMP

TYPE TAB_T_REC_EMP IS TABLE OF T_REC_EMP index by binary_integer ;
t_rec TAB_T_REC_EMP ; -- variable tableau d''enregistrements


PROCEDURE Pc_Insert ( v_value IN VARCHAR2) IS
BEGIN

  if t_rec.exists(t_rec.Last) then
    int_position := t_rec.last;
    int_position := int_position +1;

    t_rec(int_position).nomFichier := v_value;
  else
    t_rec(1).nomFichier :=v_value;
  end if;

END;

FUNCTION calice_ORACLE( n IN NUMBER) RETURN T_REC_EMP  PIPELINED IS

BEGIN

  FOR i in 1 .. n LOOP
    PIPE ROW(t_rec(i));
  END LOOP;

  RETURN;
END;

BEGIN

    Pc_Insert('allo1');
    Pc_Insert('allo2');
    Pc_Insert('allo3');

    SELECT * fROM TABLE(calice_ORACLE(2));

END;
/

Soy un error referente a la función no soporta en la instrucción SQL (estoy en 9i 9.2 VR)

¿Fue útil?

Solución

En primer lugar no se puede Pipline matrices assosiative. Comprobar esto para obtener más información sobre los tipos de recolección. http: //www.developer. com / db / article.php / 10920_3379271_2 / Oracle-Programación-con-PLSQL-Collections.htm

En segundo lugar es necesario seleccionar en el uso o cursor en PL / SQL.

Me escribió algo de código de demostración para que pueda comprobar un poco cómo se puede trabajar. No estoy muy seguro de lo que realmente quiere hacer, pero al menos Esto compila, que es bueno.

create or replace type t_rec_emp as object (namefile varchar2(200));    
/

create or replace type tab_t_rec_emp is table of t_rec_emp;
/

create or replace package mydemopack as
    t_rec tab_t_rec_emp := tab_t_rec_emp(); 
    procedure pc_insert ( v_value in varchar2);
    function calice_oracle( n in integer) return tab_t_rec_emp pipelined;

end;
/

create or replace package body mydemopack as
    procedure pc_insert ( v_value in varchar2) is
    begin
        t_rec.extend(1);
        t_rec(t_rec.count):= t_rec_emp(v_value);
    end;

    function calice_oracle( n in integer) return tab_t_rec_emp pipelined is

    begin

      for i in 1 .. n loop
        pipe row(t_rec(i));
      end loop;

      return;
    end;
end;
/


declare
    cursor c_cur is
        select * from table(myDemoPack.calice_oracle(2));
begin

    myDemoPack.pc_insert('allo1');
    myDemoPack.pc_insert('allo2');
    myDemoPack.pc_insert('allo3');

    for rec in c_cur loop
        dbms_output.put_line(rec.namefile);
    end loop;

end;
/

Otros consejos

  • (como ya se ha señalado en los comentarios) que tiene una instrucción SELECT incrustado en PL / SQL sin instrucciones sobre qué hacer con los resultados de la consulta. Puede SELECT INTO ya sea una variable declarada localmente, o puede recorrer a través de los resultados con un cursor, por ejemplo, FOR rec IN (SELECT...) LOOP .. END LOOP;

  • Tal vez desea crear un paquete en lugar de un bloque anónimo; a continuación, en su programa de llamada se pueden realizar consultas al igual que su SELECT * FROM TABLE(mypackagename.calice_ORACLE(2)).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top