Tableau des fonctions Oracle
Question
J'ai un peu prob avec la fonction TABLE dans 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;
/
Je suis une erreur sur la fonction ne prend pas en charge dans l'instruction SQL (je suis sur 9i 9.2 vr)
La solution
Tout d'abord vous ne pouvez pas Pipline tableaux assosiative. Vérifiez cela pour plus d'informations sur les types de collections. http: //www.developer. com / db / article.php / 10920_3379271_2 / Oracle-programmation avec-PLSQL-Collections.htm
Ensuite, vous devez sélectionner dans ou utiliser le curseur dans pl / sql.
J'ai écrit un code de démonstration afin que vous puissiez vérifier un peu comment cela peut fonctionner. Je ne suis pas tout à fait sûr de ce que vous voulez vraiment faire, mais au moins cette compile, ce qui est bon.
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;
/
Autres conseils
-
(comme déjà souligné dans les commentaires) que vous avez une instruction SELECT intégrée dans PL / SQL avec aucune instruction sur ce qu'il faut faire avec les résultats de la requête. Vous pouvez
SELECT INTO
une variable déclarée localement, ou vous pouvez faire une boucle à travers les résultats avec un curseur, par exempleFOR rec IN (SELECT...) LOOP .. END LOOP
; -
Peut-être que vous voulez créer un package à la place d'un bloc anonyme; puis, dans votre programme d'appel que vous pouvez émettre des requêtes telles que votre
SELECT * FROM TABLE(mypackagename.calice_ORACLE(2))
.