Ergebnis 1 bis 4 von 4

Thema: ODBC Treiber und plpgsql Funktionen

  1. #1
    IdaS ist offline Neuer Benutzer
    Registriert seit
    15.01.2009
    Beiträge
    9

    Unglücklich ODBC Treiber und plpgsql Funktionen

    Hallo,
    ich komme gleich zum Punkt:
    ICh bin mir nicht sicher ob es ein Bug im aktuellen ODBC Treiber ist (8.3.0400) oder ob ich mich einfach nur mächtigst vertan habe.

    Folgendes: Ich schicke das prepared Statement "{SELECT * FROM gen_master_sel0(?,?)};" (mit 10 und 'S2' als Parameter die ich vorher binde) mit SQLExecute an den Server. Der Treiber macht nun aber folgendes daraus, was dann auch so beim Server ankommt
    SELECT * FROM gen_master_sel0( 10, E'S2');() ...
    Ich hab mal ein wenig zugeschaut was der Treiber denn da so macht.
    1) Er setzt das E davor. Ich bin mir zu 99% sicher das es nicht an mir und ich die Parameter richtig binde etc. (Zumal ich mit kdbg gesehen hab das er S2 als Parameter ausliest)
    2) ICh weiß nciht warum, aber wenn er erkennt das ich ne "Procedure" rufe, denkt er ich hab keine Parameter übergeben und setzt automatisch die () dahinter.

    Nun noch ein paar Anmerkungen: ich hab ds erste mal hier mit Postgres gearbeitet und musste mich erst etwasumstellen.. also von Stored Procedures auf Funktionen. Meine FUnktion die ich rufe sieht folgendermaßen aus:

    CREATE OR REPLACE FUNCTION gen_master_sel0(IN a int2,IN b char(2),OUT fileset INT2, OUT mtype CHAR(2), OUT hnumber INT) RETURNS RECORD AS '
    DECLARE
    r RECORD;
    BEGIN
    SELECT INTO r master_fileset,master_type,highest_number
    FROM gen_master
    WHERE master_fileset= a
    AND master_type= b;
    fileset:=r.master_fileset;
    mtype:=r.master_type;
    hnumber:=r.highest_number;
    END;
    ' LANGUAGE plpgsql;

    Mit SELECT * FROM gen_master_sel0(10,'S2'); bekomm ich auch über diverse PG Clients schön meinen Select.
    Warum erkennt der Postgres Treiber meine Parameter nicht? Könnte es daran liegen das ja eigentlich noch die 3 Output Parameter mit in der Funktionsdeklaration stehen?
    Ist meine Funktion falsch?


    Tipps und Tricks jeglicher Art sind herzlich willkommen!

    HILFE, ich bin echt verzweifelt

  2. #2
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    5.337

    Standard

    Zitat Zitat von IdaS Beitrag anzeigen
    Hallo,
    ich komme gleich zum Punkt:
    ICh bin mir nicht sicher ob es ein Bug im aktuellen ODBC Treiber ist (8.3.0400) oder ob ich mich einfach nur mächtigst vertan habe.

    Folgendes: Ich schicke das prepared Statement "{SELECT * FROM gen_master_sel0(?,?)};" (mit 10 und 'S2' als Parameter die ich vorher binde) mit SQLExecute an den Server. Der Treiber macht nun aber folgendes daraus, was dann auch so beim Server ankommt
    SELECT * FROM gen_master_sel0( 10, E'S2');() ...
    Das E ist nix schlimmes, guggst Du hier: PostgreSQL: Documentation: Manuals: PostgreSQL 8.3: Release 8.1 unter "Add E'' syntax so eventually ordinary strings can treat backslashes literally (Bruce)"
    Die Klammer ist allerdings Blödsinn, ja.

    Ich hab mal ein wenig zugeschaut was der Treiber denn da so macht.
    1) Er setzt das E davor. Ich bin mir zu 99% sicher das es nicht an mir und ich die Parameter richtig binde etc. (Zumal ich mit kdbg gesehen hab das er S2 als Parameter ausliest)
    2) ICh weiß nciht warum, aber wenn er erkennt das ich ne "Procedure" rufe, denkt er ich hab keine Parameter übergeben und setzt automatisch die () dahinter.

    Nun noch ein paar Anmerkungen: ich hab ds erste mal hier mit Postgres gearbeitet und musste mich erst etwasumstellen.. also von Stored Procedures auf Funktionen. Meine FUnktion die ich rufe sieht folgendermaßen aus:
    Beim Querlesen nix falsches gesehen, aber nutze mal lieber Dollar-Quoting in Funktionen, PostgreSQL: Documentation: Manuals: PostgreSQL 8.3: Lexical Structure -> 4.1.2.2. Dollar-Quoted String Constants


    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  3. #3
    IdaS ist offline Neuer Benutzer
    Registriert seit
    15.01.2009
    Beiträge
    9

    Standard

    Hallo Andreas,
    danke für die schnelle Hilfe!

    Ich habs jetzt geändert und statt 'functionsbody'
    ----> $function$ functionsbody $funcktion$

    Mit dem E hast du recht. Gut das ich mir da keinen Kopf machen muss.

    Leider setzt der Treiber immer noch die () dahinter.

  4. #4
    IdaS ist offline Neuer Benutzer
    Registriert seit
    15.01.2009
    Beiträge
    9

    Standard

    Ich habe mich noch in der offiziellen postgres Mailinglist eingeschrieben und da mal mein Problem gepostet.

    Der Fehler lag auf meiner Seite indem ich den Stored Procedure Call PG spezifisch gemacht habe :-|

    >The above call is wrong.
    >You should prepare the ODBC style procedure call
    >{call gen_master_sel0(?,?)}
    >or you can simply prepare the pg-specific procedure call
    >SELECT * FROM gen_master_sel0(?,?)
    >.
    >
    >regards,
    >Hiroshi Inoue


    Tja.. nun gehts
    Aber danke trotzdem für die Hilfe

    Ida

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Links: Tobias Bauer - IT- und Funkdienstleistungen   -   Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen   -   Funkforum