oracle xml extract in postgres ?

Probleme und Fragen zum Thema Trigger und Funktionen.
Antworten
nms
Neuer Benutzer
Beiträge: 16
Registriert: Fr 9. Dez 2016, 12:11

oracle xml extract in postgres ?

Beitrag von nms » Mi 14. Dez 2016, 11:26

Hallo zusammen,

hat jemand ne Idee wie folgende oracle stmt im postgres aussieht

Code: Alles auswählen

 SELECT LPAD( RTRIM(XMLAGG (XMLELEMENT (e, s0 || '; ')).EXTRACT('//text()'), '; '), 4000) 
Danke schon mal fuer Ihre Hilfe!

castorp
Erfahrener Benutzer
Beiträge: 1060
Registriert: Sa 27. Jun 2009, 22:24
Wohnort: Bayern

Re: oracle xml extract in postgres ?

Beitrag von castorp » Mi 14. Dez 2016, 12:24

Kannst Du uns ein paar Beispieldaten und das Ergebnis Deiner Abfrage zeigen und die Struktur der Tabelle von der Du selektierst?
A SQL query walks into a bar and sees two tables. He walks up to them and says 'Can I join you?'

nms
Neuer Benutzer
Beiträge: 16
Registriert: Fr 9. Dez 2016, 12:11

Re: oracle xml extract in postgres ?

Beitrag von nms » Mi 14. Dez 2016, 14:25

Hallo castorp,

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

Code: Alles auswählen

 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:

Code: Alles auswählen

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

Code: Alles auswählen

--------------------------------------------------------
--  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

castorp
Erfahrener Benutzer
Beiträge: 1060
Registriert: Sa 27. Jun 2009, 22:24
Wohnort: Bayern

Re: oracle xml extract in postgres ?

Beitrag von castorp » Mi 14. Dez 2016, 15:04

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:

Code: Alles auswählen

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;
A SQL query walks into a bar and sees two tables. He walks up to them and says 'Can I join you?'

nms
Neuer Benutzer
Beiträge: 16
Registriert: Fr 9. Dez 2016, 12:11

Re: oracle xml extract in postgres ?

Beitrag von nms » Mi 14. Dez 2016, 16:10

Hallo castorp,

Ich weiss leider selber auch nicht was der code liefern soll :) 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!

Antworten