Announcement

Collapse
No announcement yet.

PL/SQL Tabelle bzw. Array über eine Funktion zurückzugeben

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • PL/SQL Tabelle bzw. Array über eine Funktion zurückzugeben

    Hallo zusammen,

    ist es möglich eine PL/SQL Tabelle bzw. einen Array über eine Funktion zurückzugeben?

    Ich möchte beispielsweise alle Regionen aus einer Tabelle in eine PL/SQL Tabelle schreiben und diese zurückgeben...

    mein bisheriger Stand:

    Code:
    ---Spec
    TYPE gt_rname_rec IS RECORD (
    	ort varchar2(50),
    	gebiet varchar2(50)
    	);
    
    TYPE gt_rname IS TABLE OF gt_rname_rec INDEX BY varchar2(50);
    
    gv_rname	gt_rname_rec;
    
    FUNCTION get_rname (x IN NUMBER) RETURN gt_rname;
    
    
    ---Body
    
    FUNCTION get_rname (x IN NUMBER)
    	RETURN gt_rname
    IS
    	lv_region	region.ort%TYPE;
    BEGIN
    	SELECT	a.ort
    	  INTO	lv_region
    	  FROM	region a
    	 WHERE	a.region_id = x;
    
    	gv_rname_rec.ort := lv_region;
    
    	RETURN gt_rname;
    END;
    Danke für die Hilfe!
    Grüße aus Leipzig
    Jonathan

  • #2
    Wenn du deinen Code wie folgt korrigierst, sollte es funktionieren.
    Code:
    DECLARE
    ---Spec
    TYPE gt_rname_rec IS RECORD (
    	ort varchar2(50),
    	gebiet varchar2(50)
    	);
    
    TYPE gt_rname IS TABLE OF gt_rname_rec INDEX BY varchar2(50);
    
    -- gv_rname	gt_rname_rec;
       gv_rname	gt_rname;
    
    FUNCTION get_rname (x IN NUMBER) RETURN gt_rname;
    
    
    ---Body
    
    FUNCTION get_rname (x IN NUMBER)
    	RETURN gt_rname
    IS
    	lv_region	region.ort%TYPE;
    BEGIN
    	SELECT	a.ort
    	  INTO	lv_region
    	  FROM	region a
    	 WHERE	a.region_id = x;
    
    	-- gv_rname_rec.ort := lv_region;
                    gv_rname('h').ort := lv_region;
    
    	-- RETURN gt_rname;
                    RETURN gv_rname;
    END;
    BEGIN
     null;
    END;
    /
    
    PL/SQL-Prozedur wurde erfolgreich abgeschlossen.
    Die urspüngliche Code-Zeile wurde auskommentiert.

    TYPE gt_rname IS TABLE OF gt_rname_rec INDEX BY varchar2(50);

    Bei einer solchen INDEX BY-Tabelle wird die Eingabe eines Indizies erwartet (im Code durch 'h' realisiert). Dieser Indexwert sollte sich für jede neue Zeile natürlich ändern.

    kuemmelchen

    Comment


    • #3
      funktioniert...

      Danke funktioniert, geht aber auch so:

      Code:
      CREATE OR REPLACE 
      PACKAGE get_region_west_pkg
        IS
      
      /**
      * get_region_west_pkg
      */
      
      ---
      
      ------------------------------------------------------------------------- SUBTYPES
      ------------------------------------------------------------------------- TYPES, TABLES
      
      TYPE gt_intern_region_rec IS RECORD (
      ort VARCHAR2(50),
      gebiet VARCHAR2(50)
      );
      
      TYPE gt_region_rec_tab IS TABLE OF gt_intern_region_rec;
      
      ------------------------------------------------------------------------- CONSTANTS
      ------------------------------------------------------------------------- EXCEPTIONS
      ------------------------------------------------------------------------- VARIABLES
      ------------------------------------------------------------------------- CURSORS
      ------------------------------------------------------------------------- FOREWARD-DECLARATIONS
      ------------------------------------------------------------------------- Standard-UNITS
      ------------------------------------------------------------------------- UNITS
      
      	FUNCTION get_region_west RETURN gt_region_rec_tab;
      	
      	PROCEDURE show_region_west (out_region OUT VARCHAR2);
      
      END;
      /
      
      CREATE OR REPLACE 
      PACKAGE BODY get_region_west_pkg
      IS
      
      FUNCTION get_region_west RETURN gt_region_rec_tab IS
      
      	CURSOR lv_region_cur IS
      		SELECT a.ort, a.gebiet FROM region a
      			WHERE a.gebiet = 'West';
      
          region_rec                 lv_region_cur%ROWTYPE;
      	
      	lv_region_rec	           gt_intern_region_rec;
          lv_region_tab              gt_region_rec_tab := gt_region_rec_tab(NULL);
      
      BEGIN
      
      	lv_region_tab.DELETE;
            FOR region_rec IN lv_region_cur
            LOOP
              lv_region_rec.ort               	:= region_rec.ort;
              lv_region_rec.gebiet				:= region_rec.gebiet;
              --
              lv_region_tab.EXTEND;
              lv_region_tab(lv_region_tab.LAST) 	:= lv_region_rec;
            END LOOP;
       
          RETURN lv_region_tab;
      
      END get_region_west;
      
      ---
      
      PROCEDURE show_region_west (out_region OUT VARCHAR2) IS
      	lv_ret	 gt_region_rec_tab := gt_region_rec_tab (NULL);
      BEGIN
      	lv_ret := get_region_west();
      
      	FOR idx IN lv_ret.first..lv_ret.last
      	LOOP
      		out_region := lv_ret(idx).ort;
      		dbms_output.put_line(lv_ret(idx).ort);
      	END LOOP;
      
      END show_region_west;
      
      
      END get_region_west_pkg;
      /
      
      
      
      -- End of DDL Script for Package Body E_SYSTEM.GET_REGION_WEST_PKG
      Mit der abschließenden Prozedur, kann man die PL/SQL Tabelle direkt auf der Datenbank auslesen und über output ausgeben...
      Grüße aus Leipzig
      Jonathan

      Comment

      Working...
      X