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)

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top