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

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

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. :frowning:

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

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