Funktionstabelle IN ORACLE
Frage
Ich habe einige prob mit der Funktion TABLE in 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;
/
Ich bin Fehlermeldungen bezüglich Funktion nicht in SQL-Anweisung nicht unterstützt (ich bin auf 9i 9.2 vr)
Lösung
Zunächst einmal können Sie assoziatives Arrays nicht pipline. Prüfen Sie diese für weitere Informationen auf Sammlungstypen. http: //www.developer. com / db / article.php / 10920_3379271_2 / Oracle-Programmierung-mit-PLSQL-Collections.htm
Zweitens müssen Sie in oder Verwendung wählen Cursor in PL / SQL.
Ich schrieb einige Demo-Code, so dass Sie ein wenig überprüfen können, wie es funktionieren kann. Ich bin mir nicht ganz sicher, was Sie eigentlich tun wollen, aber zumindest diese compiliert, was gut ist.
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;
/
Andere Tipps
-
(wie bereits in den Kommentaren darauf hingewiesen) haben Sie eine SELECT-Anweisung eingebettet in PL / SQL keine Anweisungen, was mit den Ergebnissen der Abfrage zu tun. Sie können entweder eine lokal deklarierte Variable
SELECT INTO
, oder Sie können eine Schleife durch die Ergebnisse mit einem Cursor, z.B.FOR rec IN (SELECT...) LOOP .. END LOOP
; -
Vielleicht möchten Sie ein Paket anstelle eines anonymen Block zu erzeugen; dann, in Ihrem rufende Programm Sie Abfragen wie Ihre
SELECT * FROM TABLE(mypackagename.calice_ORACLE(2))
ausgeben kann.