Du kannst die Anfrage dynamisch in einem String zusammenbauen und dann ausführen.
Entsprechende Beispiele findest du auch in der pl/pgSQL Dokumentation.
Hallo auch,
folgendes Problem:
Ich möchte prüfen ob ein Link bereits existiert. Da es aber nicht die Möglichkeit gibt, das mit prepared Statements zu machen (da die Tabelle dynamisch abhängig von dem Link ist) dachte ich ich mach das zumindest in plpgsql damit es etwas performanter wird.
Leider versucht der u.g. Code direkt auf "db" zuzugreifen, und nicht auf die Variable.
Ich bin Anfänger was plpgsql angeht, bin also für jede Erklärung (oder Link zur Erklärung) dankbar!!Code:-- Function: checkiflinkexists(text, text) --DROP FUNCTION checkiflinkexists(text, text); CREATE OR REPLACE FUNCTION checkIfLinkExists(varchar, varchar) RETURNS boolean AS ' DECLARE retVal boolean := false; resultSet RECORD; link1 Alias FOR $1; db Alias FOR $2; BEGIN select into resultSet link from db where link = link1 limit 1; if found then retVal := true; end if; return retVal; END; ' LANGUAGE plpgsql VOLATILE COST 100; ALTER FUNCTION checkIfLinkExists(varchar, varchar) OWNER TO postgres;
Du kannst die Anfrage dynamisch in einem String zusammenbauen und dann ausführen.
Entsprechende Beispiele findest du auch in der pl/pgSQL Dokumentation.
Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören
Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler
PostgreSQL Service & Support
A SQL query walks into a bar and sees two tables. He walks up to them and says 'Can I join you?'
Es gibt keine PreparedStatements wenn die Tabelle dynamisch ist. Steht so in der Doku und ich habs auch getestet, es geht leider nicht. Leider hat aber auch die plpgsql Loesung nicht zum Erfolg gefuehrt (Performance immer noch katastrophal).
ich hoffe Links nach extern sind erlaubt, falls nicht bitte entfernen:Code:-- Function: checkiflinkexists(text, text) --DROP FUNCTION checkiflinkexists(text, text); CREATE OR REPLACE FUNCTION checkIfLinkExists(varchar, varchar) RETURNS boolean AS ' DECLARE retVal boolean := false; resultSet RECORD; BEGIN EXECUTE ''select link from '' || quote_ident($1) || '' where link = '' || quote_literal($2) || '' limit 1;'' INTO resultSet; if found then retVal := true; end if; return retVal; END; ' LANGUAGE plpgsql VOLATILE COST 100; ALTER FUNCTION checkIfLinkExists(varchar, varchar) OWNER TO postgres;
Passing Table Names in PreparedStatement (JDBC forum at JavaRanch)
A SQL query walks into a bar and sees two tables. He walks up to them and says 'Can I join you?'
Hier sollte man zwischen Prepared Statements in Java und in der Datenbank unterscheiden - bzw. eigentlich unterscheiden, wer die generiert.
Das was Java generiert, kommt in der Datenbank schon als fertiger String an.
Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören
Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler
PostgreSQL Service & Support
Inzwischen hab ich einiges geaendert und brauche die Datenbank nur noch sehr wenig, der Teil zb. ist vollstaendig rausgeflogen einfach weils nicht performant genug war.Code:String sql = "SELECT * FROM " + tableName + " WHERE id = ?"; PreparedStatement pstmt = connection.prepareStatement(sql); pstmt.setInt(1, 42); ResultSet rs = pstmt.executeQuery();
edit:
Und nein, es gibt keine PreparedStatements die eine dynamische Tabelle verpacken wenn es IM sql dynamisch sein soll. Ich meine hier nichts wie "select * from " + irgendEineTabelle; sondern sowas wie: "select * from ?"; und das geht 100% nicht.
Denn was bringt es mir wenn ich (angenommen ich hab 1000 Tabellen) jedes mal bei jeder Tabelle ein neues PreparedStatement generiere - dann ist mein Heap ganz schnell voll.
Geändert von olze (18.01.2011 um 10:32 Uhr)
Links: Tobias Bauer - IT- und Funkdienstleistungen - Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen - Funkforum
Lesezeichen