Avatar billede davidfossil Nybegynder
06. maj 2006 - 15:45 Der er 5 kommentarer og
1 løsning

Kalde PostgreSQL functions fra Java

Sidder lige og roder med noget Java/PostrgreSQL og er lidt i tvivl om jeg gør tingene "rigtigt". Følgende kodeeksempel virker efter hensigten, men ser i mine øjne en smule rodet ud:

CallableStatement proc = conn.prepareCall("{ ? = CALL \"users\".\"spAuthenticateUser\"(?,?) }");
proc.registerOutParameter(1, Types.BOOLEAN);
proc.setString(2, userID);
proc.setString(3, password);
proc.execute();
return proc.getBoolean(1);

Er det virkelig nødvendigt at have SQL kode med hver gang ("? = CALL"), eller findes der en pænere objektorienteret måde at kalde sine funktions?

Note: Normalt arbejder jeg i C#/MSSQL hvor samme kald ville være noget i stil med:
SqlCommand = new SqlCommand("spAuthenticateUser", CommandType.StoredProcedure, conn);
cmd.Parameters.Add("@return", SqlDbType.Bit);
cmd.Parameters["@return"].Direction = ParameterDirection.ReturnValue;
cmd.Parameters.AddWithValue("@userID", userID);
cmd.Parameters.AddWithValue("@password", password);
cmd.ExecuteNonQuery();
return (bool)cmd.Parameters["@return"].Value;

Jeg kan godt se at .NET koden er en smule længere end Java koden, men jeg synes den er pænenere i og med at jeg kan referere til mine parametre med deres navne i stedet for index og en række "?,?" der skal matche til antallet.

Findes der andre løsninger en den jeg pt. bruger i Java? Jeg kan selv tænke mig til en implementering der vil gøre det enklere, men det ville nu være nemmest om der fandtes noget klar-til-brug i postrgres pakken :)
Avatar billede davidfossil Nybegynder
06. maj 2006 - 15:51 #1
Method org.postgresql.jdbc3.Jdbc3CallableStatement.setString(String,String) is not yet implemented.

Det tyder vist på at der ikke pt. er support for at bruge parametre navne i stedet for indexes.
Avatar billede arne_v Ekspert
06. maj 2006 - 16:22 #2
syntaxen er korrekt

jeg forstår dog ikke helt hvorfor du skal have "" i din SQL (\"\" i Java) når
du ikke har det i C#

det er den rigtige måde at gøre det på

syntaxen kan godt virke lidt primitiv, men den er rimeligt database uafhængig
(i ADO.NET skal du bruge @ foran navne i SQLServer, Access og gamle
versioner af MySQL provider, ? i ODBC og nyere versioner af MySQL
provider, : i Oracle etc. - alle andre end ODBC bruger navnet mens ODBC bruger
rækkefølgen etc.)
Avatar billede arne_v Ekspert
06. maj 2006 - 17:06 #3
(stored procedures er naturligvis ikke portable anyway, men både i .NET og Java kaldes
de ligesom almindelige SQL sætninger med parametre)
Avatar billede davidfossil Nybegynder
15. maj 2006 - 09:45 #4
Oki - du har nok ret igen :)

Kan jeg lokke dig til at foretælle hvordan jeg kalder en void function fra min postgres i Java? Og så smide et svar.
Avatar billede arne_v Ekspert
16. maj 2006 - 04:33 #5
har du prøvet det oplagte:

CallableStatement proc = conn.prepareCall("{ CALL envoidfunk(?) }");

?

og et svar
Avatar billede davidfossil Nybegynder
16. maj 2006 - 10:28 #6
Ja, jeg har prøvet det uden held. Så vidt jeg har kunne læse mig til SKAL der (pga. en eller anden bug) tages imod en return værdi. Endte med at hacke det således:

CallableStatement proc = conn.prepareCall("{ ? = CALL \"spVoidFunction\"(?,?) }");
proc.registerOutParameter(1, Types.OTHER);
proc.setString(2, userID);
proc.setBigDecimal(3, intToNumeric(amount));
proc.execute();
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester