Query von Oracle auf Postgres anpassen:

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

Query von Oracle auf Postgres anpassen:

Beitrag von nms » Fr 9. Dez 2016, 12:32

Hallo Postgre Experten,

ich konnte Dank des Tools ora2pg die bestehende oracle db (tabellen/typen/constraints) auf postgres teilweise migrieren ich bekomme aber
bei oracle packages Probleme weil die nicht in postgres existieren. Deswegen pro package lege ich ein neus Schema (ich weiss es nicht ob es die richtige Strategie ist?)
also kommen wir jetzt zur Frage :

Code: Alles auswählen

CREATE TYPE class_attributes_t AS
   (text character varying(500),
    format character varying(500),
    posnr bigint,
    listposnr bigint,
    colspan bigint,
    lcolspan bigint,
    newrow bigint,
    anzeige_art bigint,
    size_x bigint,
    size_y bigint,
    style character varying(250),
    tpl_modes character varying(50),
    html_style_label character varying(250),
    html_style_value character varying(250)
    );

CREATE OR REPLACE FUNCTION activator.getclsattrib(attr_id bigint)
  RETURNS class_attributes_t AS
$BODY$
DECLARE
      therow   class_attributes_t;   
BEGIN
      therow := class_attributes_t ();
      SELECT attr.text, attr.format, attr.posnr, attr.listposnr,
             attr.colspan, attr.lcolspan, attr.newrow,
             attr.anzeige_art, attr.size_x, attr.size_y, attr.style,
             attr.tpl_modes, attr.html_style_label, attr.html_style_value
        INTO therow.text, therow.format, therow.posnr, therow.listposnr,
             therow.colspan, therow.lcolspan, therow.newrow,
             therow.anzeige_art, therow.size_x, therow.size_y, therow.style,
             therow.tpl_modes, therow.html_style_label, therow.html_style_value
        FROM class_attribute attr
       WHERE attr.ID = attr_id;

      RETURN therow;
   END;

$BODY$
  LANGUAGE plpgsql VOLATILE SECURITY DEFINER
wenn ich die funtion aufrufe

Code: Alles auswählen

select * from getclassattrib(1);
bekomme ich folgende FEHLER:
============================================================
FEHLER: Funktion getclassattrib(integer) existiert nicht
LINE 1: select * from getclassattrib(1);
^
HINT: Keine Funktion stimmt mit dem angegebenen Namen und den Argumenttypen überein. Sie müssen möglicherweise ausdrückliche Typumwandlungen hinzufügen.
********** Fehler **********

FEHLER: Funktion getclassattrib(integer) existiert nicht
SQL Status:42883
Hinweis:Keine Funktion stimmt mit dem angegebenen Namen und den Argumenttypen überein. Sie müssen möglicherweise ausdrückliche Typumwandlungen hinzufügen.
Zeichen:15

any idea ?
Thnx

akretschmer
Erfahrener Benutzer
Beiträge: 7538
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Re: Query von Oracle auf Postgres anpassen:

Beitrag von akretschmer » Fr 9. Dez 2016, 12:35

Typo?

"CREATE OR REPLACE FUNCTION activator.getclsattrib(attr_id bigint)", also getclsattrib, das ist != getclassattrib.
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

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

Re: Query von Oracle auf Postgres anpassen:

Beitrag von nms » Fr 9. Dez 2016, 12:51

DANKE fuer die super schnelle Antwort!
es funktioniert jetzt :)

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

Re: Query von Oracle auf Postgres anpassen:

Beitrag von castorp » Fr 9. Dez 2016, 13:38

Du brauchst im Übrigen kein PL/pgSQL dafür:

Code: Alles auswählen

CREATE OR REPLACE FUNCTION activator.getclsattrib(attr_id bigint)
  RETURNS class_attributes_t AS
$BODY$
      SELECT (attr.text, attr.format, attr.posnr, attr.listposnr,
             attr.colspan, attr.lcolspan, attr.newrow,
             attr.anzeige_art, attr.size_x, attr.size_y, attr.style,
             attr.tpl_modes, attr.html_style_label, attr.html_style_value)::class_attributes_t
        FROM class_attribute attr
       WHERE attr.ID = attr_id;
$BODY$
  LANGUAGE sql;
Die Klammern um die Spaltenliste erzeugen einen record der dann zum gewünschten Typ ge-casted wird.

SQL Funktionen sind im Regelfall schneller als PL/pgSQL weil der Overhead wegfällt und die enthaltene Query für den Optimizer sichtbar ist. Damit hat der Optimizer mehr Möglichkeiten einen besseren Plan zu erzeugen, vor allem wenn die Funktion innerhalb eines anderen Statements aufgerufen wird.
A SQL query walks into a bar and sees two tables. He walks up to them and says 'Can I join you?'

akretschmer
Erfahrener Benutzer
Beiträge: 7538
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Re: Query von Oracle auf Postgres anpassen:

Beitrag von akretschmer » Fr 9. Dez 2016, 14:48

Man könnte noch prüfen, ob die Datentypen sinnvoll sind, z.B. die ganten bigint - Werte.
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

Antworten