PG-Funktion mit c++ aufrufen und auswerten

Hallo allerseits,

ich habe hier ein MFC-Programm mit dem ich auf eine Datenbank zugreifen kann. Der Zugriff erfolgt per ODBC-Treiber. Nun habe ich in meiner PG-Datenbank eine Funktion, die anhand der übergebenen Parameter bestimmte Tabellen auswertet und mir ein Wert zurückliefert. Ich möchte nun aus meinem MFC-Programm diese Funktion gerne aufrufen und den Rückgabetyp auswerten. Kann mir jemand helfen?

gruß chuqa

Wie wäre es ganz normal mit ‘select my_function(param1, param2);’ bzw. ‘select * from my_function(param1, param2);’, sollte es sich um eine SRF handeln.

Andreas

Also bisher habe ich einfache statements wie folgt ausgeführt:

...
str_buffer = "INSERT INTO ... ";    

m_SQL_Connect = _T("DSN=PostgreSQL30;DATABASE=<db>;SERVER=127.0.0.1;PORT=5432;UID=postgres;PWD=<pw>;SSLmode=disable;ReadOnly=0;Protocol=6.4;FakeOidIndex=0;ShowOidColumn=0;RowVersioning=0;ShowSystemTables=0;ConnSettings=;Fetch=100;Socket=4096;UnknownSizes=0;MaxVarcharSize=255;MaxLongVarcharSize=8190;Debug=0;CommLog=0;Optimizer=1;Ksqo=1;UseDeclareFetch=0;TextAsLongVarchar=1;UnknownsAsLongVarchar=0;BoolsAsChar=1;Parse=0;CancelAsFreeStmt=0;ExtraSysTablePrefixes=dd_;;LFConversion=1;UpdatableCursors=0;DisallowPremature=0;TrueIsMinus1=0;BI=0;ByteaAsLongVarBinary=0;UseServerSidePrepare=0;LowerCaseIdentifier=0");

if (m_pDatabase) {
   delete m_pDatabase;
   m_pDatabase = NULL;
}

m_pDatabase = new CDatabase();
try {
   if (m_pDatabase->Open(NULL, FALSE, FALSE, m_SQL_Connect)) {
      m_SQLConnected = TRUE;
   }
   m_pDatabase->ExecuteSQL(str_buffer);
} catch( CDBException* e ) {
   ...
}
...

Allerdings liefert mir ExecuteSQL kein Wert zurück. Weiß nicht ob es gehen würde, wenn ich ein Recordset auf die Funktion anlege?! Und ob das soviel sind für einen einzigen Wert macht :frowning:

Ähm, obiges ist ein INSERT. Wie machst Du das bei einem SELECT? Ich kann Dir mit C++ nicht helfen, aber aus DB-Sicht ist ein ‘select * from foo’ (mit einer Tabelle foo) gleich mit ‘select * from foo()’ mit einer Funktion foo().

Andreas

Also die Funktion prüft, ob ein Tupel bereits vorhanden ist. Wenn nicht, legt es ein neuen Eintrag an. Anschließend liefert sie mir die ID des Eintrags, der hinzugefügt wurde, oder schon vorhanden war.
Die Daten einer Tabelle werden in einem Steuerelement gehalten: CRecordset. Aus dem wird dann praktisch gelesen usw. Ich könnte natürlich die Tabelle, auf die die Funktion die Operation ausführt, in einem solchen Objekt halten und nach einer Ausführung das Recordset nach dem bestimmten Eintrag durchsuchen um so die ID auszulesen. Halte das nur für zu umständlich, da ja die Funktion die Rückgabe der ID bereits implementiert hat…

Ja. Wie kommst Du denn an das Resultat eines einfachen ‘select version()’ ran? Ähnlich geht es mit selbstgebastelten Funktionen. Hier mal eine selbstgestrickte Funktion, die einen Parameter hat und auch was liefert:

test=# create function get_random(int) returns int as $$begin return ($1*random())::int;end;$$language plpgsql;
CREATE FUNCTION
test=*# select * from get_random(200);
 get_random
------------
         29
(1 row)

Andreas

Ich weise dem Recordset eine bestimmte Tabelle zu und assoziere Klassenvariablen mit den Tabellenattributen. Dann kann ich über Filter die Auswahl für das Recordset einschränken und über die Klassenmember auf die Attributwerte zugreifen.

Ich denke, ich muss ein solches Steuerelement erstellen. Allerdings kann ich das Recordset nur mit Views und Tabellen verknüpfen. Kann man einen View auf eine Funktion anlegen? Wäre das überhaupt sinnvoll?
Oder wäre es nicht viel einfacher, wenn ich das Recordset mit der entsprechenden Tabelle verknüpfe und in meinem Programm die Funktionalität implementiere, die die PG-Funktion enthält (sind ja nur 3 Zeilen)?

gruß

Was spricht gegen einen Versuch? Allerdings kennt ein VIEW keine Parametzer mehr.

test=# create function get_random(int) returns int as $$begin return ($1*random())::int;end;$$language plpgsql;
CREATE FUNCTION
test=*# select * from get_random(200);
 get_random
------------
         20
(1 row)

test=*# create view random_view as select * from get_random(200);
CREATE VIEW
test=*# select * from random_view;
 get_random
------------
         29
(1 row)

test=*# select * from random_view;
 get_random
------------
         60
(1 row)

Andreas

Nur weiß ich zum Zeitpunkt, an dem ich den View anlege, nicht, welchen Werte die Parameter der Funktion haben sollen.