oracle xml extract in postgres ?

Hallo zusammen,

hat jemand ne Idee wie folgende oracle stmt im postgres aussieht

 SELECT LPAD( RTRIM(XMLAGG (XMLELEMENT (e, s0 || '; ')).EXTRACT('//text()'), '; '), 4000)

Danke schon mal fuer Ihre Hilfe!

Kannst Du uns ein paar Beispieldaten und das Ergebnis Deiner Abfrage zeigen und die Struktur der Tabelle von der Du selektierst?

Hallo castorp,

bin gerade konvertieren einige packages von oracle nach postgres…
hier ist die funktion in oracle

 FUNCTION getSimpleManagedResources (theid IN NUMBER)
    RETURN VARCHAR2
  IS
    retval VARCHAR2(4000 CHAR);
  BEGIN
    SELECT LPAD(RTRIM(XMLAGG (XMLELEMENT (e, s0 || '; ')).EXTRACT('//text()'), '; '), 4000)
     INTO retval
     FROM wfmresource
     WHERE klasse = 45010 AND id IN (SELECT o1 FROM extra WHERE klasse = 45500 AND parent_id = theid);

    RETURN retval;
  EXCEPTION
    WHEN OTHERS
    THEN RETURN NULL;
  END getSimpleManagedResources;

was ora2pg daraus macht:

CREATE OR REPLACE FUNCTION AUFTRAG_UTIL.getsimplemanagedresources (theid bigint)   
 RETURNS varchar AS $body$
DECLARE

    retval varchar(4000);
  
BEGIN
    PERFORM LPAD(RTRIM(XMLAGG (XMLELEMENT(name e, s0 || '; ')).EXTRACT('//text()'), '; '), 4000)
     INTO retval
     FROM wfmresource
     WHERE klasse = 45010 AND id IN (SELECT o1 FROM extra WHERE klasse = 45500 AND parent_id = theid);

    RETURN retval;
  EXCEPTION
    WHEN OTHERS
    THEN RETURN NULL;
  END;

$body$
LANGUAGE PLPGSQL
SECURITY DEFINER
;

und hier ist wfmresource tabelle

--------------------------------------------------------
--  DDL for Table WFMRESOURCE
--------------------------------------------------------

  CREATE TABLE "MYSCHEMA"."WFMRESOURCE" 
   (	"ID" NUMBER, 
	"KLASSE" NUMBER, 
	"LABEL" VARCHAR2(255 CHAR), 
	"ROW_CREATION_TIME" NUMBER, 
	"ROW_CREATOR" VARCHAR2(50 CHAR), 
	"ROW_TIME" NUMBER, 
	"ROW_USER" VARCHAR2(50 CHAR), 
	"PARENT_ID" NUMBER, 
	"STAMM_ID" NUMBER, 
	"A0" NUMBER, 
	"A1" NUMBER, 
	"A2" NUMBER, 
	"A3" NUMBER, 
	"A4" NUMBER, 
	"A5" NUMBER, 
	"A6" NUMBER, 
	"A7" NUMBER, 
	"A8" NUMBER, 
	"A9" NUMBER, 
	"A10" NUMBER, 
	"A11" NUMBER, 
	"A12" NUMBER, 
	"A13" NUMBER, 
	"A14" NUMBER, 
	"A15" NUMBER, 
	"A16" NUMBER, 
	"A17" NUMBER, 
	"A18" NUMBER, 
	"A19" NUMBER, 
	"A20" NUMBER, 
	"D0" DATE, 
	"D1" DATE, 
	"D2" DATE, 
	"D3" DATE, 
	"D4" DATE, 
	"D5" DATE, 
	"D6" DATE, 
	"D7" DATE, 
	"D8" DATE, 
	"D9" DATE, 
	"D10" DATE, 
	"G0" FLOAT(126), 
	"G1" FLOAT(126), 
	"G2" FLOAT(126), 
	"G3" FLOAT(126), 
	"G4" FLOAT(126), 
	"G5" FLOAT(126), 
	"G6" FLOAT(126), 
	"G7" FLOAT(126), 
	"G8" FLOAT(126), 
	"G9" FLOAT(126), 
	"G10" FLOAT(126), 
	"N0" NUMBER, 
	"N1" NUMBER, 
	"N2" NUMBER, 
	"N3" NUMBER, 
	"N4" NUMBER, 
	"N5" NUMBER, 
	"N6" NUMBER, 
	"N7" NUMBER, 
	"N8" NUMBER, 
	"N9" NUMBER, 
	"N10" NUMBER, 
	"O1" NUMBER, 
	"O2" NUMBER, 
	"O3" NUMBER, 
	"O4" NUMBER, 
	"O5" NUMBER, 
	"O6" NUMBER, 
	"O7" NUMBER, 
	"O8" NUMBER, 
	"O9" NUMBER, 
	"O10" NUMBER, 
	"S0" VARCHAR2(255 CHAR), 
	"S1" VARCHAR2(255 CHAR), 
	"S2" VARCHAR2(255 CHAR), 
	"S3" VARCHAR2(255 CHAR), 
	"S4" VARCHAR2(255 CHAR), 
	"S5" VARCHAR2(255 CHAR), 
	"S6" VARCHAR2(255 CHAR), 
	"S7" VARCHAR2(255 CHAR), 
	"S8" VARCHAR2(255 CHAR), 
	"S9" VARCHAR2(255 CHAR), 
	"S10" VARCHAR2(255 CHAR), 
	"S11" VARCHAR2(255 CHAR), 
	"S12" VARCHAR2(255 CHAR), 
	"S13" VARCHAR2(255 CHAR), 
	"S14" VARCHAR2(255 CHAR), 
	"S15" VARCHAR2(255 CHAR), 
	"S16" VARCHAR2(255 CHAR), 
	"S17" VARCHAR2(255 CHAR), 
	"S18" VARCHAR2(255 CHAR), 
	"S19" VARCHAR2(255 CHAR), 
	"S20" VARCHAR2(255 CHAR), 
	"T0" VARCHAR2(4000 CHAR), 
	"T1" VARCHAR2(4000 CHAR), 
	"T2" VARCHAR2(4000 CHAR), 
	"T3" VARCHAR2(4000 CHAR), 
	"T4" VARCHAR2(4000 CHAR), 
	"T5" VARCHAR2(4000 CHAR)
   ) SEGMENT CREATION DEFERRED

Danke&Gruss

Du hast leider immer noch nicht beschrieben, was genau die Funktion zurück gibt - es sieht so aus als wäre das ein Workaround um eine Komma separierte Liste zu erzeugen. Das kann man in Postgres wesentlich einfacher lösen:

CREATE OR REPLACE FUNCTION AUFTRAG_UTIL.getsimplemanagedresources (theid bigint)   
  RETURNS varchar 
AS 
$body$
    select string_agg(s0, ';') 
    FROM wfmresource
    WHERE klasse = 45010 
      AND id IN (SELECT o1 FROM extra WHERE klasse = 45500 AND parent_id = theid);
$body$
LANGUAGE sql;

Hallo castorp,

Ich weiss leider selber auch nicht was der code liefern soll :slight_smile: hat jmd vor einigen Jahren geschrieben, der nicht mehr in der Firma ist…
da hast du Recht mit der kommaseparierte Liste… Ich habe es soweit angepasst und gehts jetzt.
DANKE!