Query von Oracle auf Postgres anpassen:

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 :

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

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

Typo?

“CREATE OR REPLACE FUNCTION activator.getclsattrib(attr_id bigint)”, also getclsattrib, das ist != getclassattrib.

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

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

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.

Man könnte noch prüfen, ob die Datentypen sinnvoll sind, z.B. die ganten bigint - Werte.