Función de tabla en Oracle
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)
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))
.