Anweisung über Parameter ausführen

Ich würde gerne in einer Funktion eine Tabelle abfragen, dessen Name ich über einen Parameter übergebe:

SELECT * FROM $1 WEHRE $2 > $3

ohne EXECUTE zu verwenden! Ist dies überhaupt möglich? Der grund dafür ist, dass der String beim zusammensetzen für EXECUTE viel zu lange wird und ich gerne direkt mit den Datentypen arbeiten möchte. Meine Lösung sieht im Moment so aus und die finde ich nicht so toll:

querySelect := 'SELECT * FROM ‘||$1||’ WHERE ‘||$2||’ > ‘||$3||’;
EXECUTE querySelect ;

und als Parameter muss ich varchar übergeben, obwohl ich lieber integer übergeben würde. Gibt es da wirklich keine bessere Lösung?

nehme EXECUTE

ohne EXECUTE zu verwenden! Ist dies überhaupt möglich? Der grund dafür ist, dass der String beim zusammensetzen für EXECUTE viel zu lange wird

Hä?

und ich gerne direkt mit den Datentypen arbeiten möchte. Meine Lösung sieht im Moment so aus und die finde ich nicht so toll:

querySelect := 'SELECT * FROM ‘||$1||’ WHERE ‘||$2||’ > ‘||$3||’;
EXECUTE querySelect ;

Wo ist das Problem?

und als Parameter muss ich varchar übergeben, obwohl ich lieber integer übergeben würde. Gibt es da wirklich keine bessere Lösung?

Du kannst auch INT übergeben. Oder float. Oder date. Oder…


Andreas

Vielleicht bin ich noch nicht so bewandert mit Funktionen :-).

Zu deinem Hä:
Wenn ich einen EXECUTE ausführen will, muss ich eine Variable des Typs varchar oder text deklarieren - oder?

DECLARE
queryInsert text;
BEGIN
queryInsert := 'INSERT INTO ‘||$1||’ ()
SELECT ( FROM

WHERE ;
EXECUTE queryInsert;
END;

um den Query ausführen zu können. Zumindest, wenn ich Parameter zu einem String zusammensetzen muss.

Das Problem:
Die Länge der kann ca. 15’000 Zeichen sein. Ich muss also sogar den Typ text verwenden. Ohne Execute wäre dies nicht nötig. Ich brauche den Execute nur, weil ich nicht vorher weiss wie die Tabelle heisst :-(! Ansonsten würde es auch ohne gehen. Du fragst dich vielleicht, wieso ich da so viele Bedinungen habe. Es sind nicht so viele aber vorallem bit(500) Daten Manipulationen und bei etwa 30 Bedingungen komme ich auf 30 * 500 = 15000 oder mehr Zeichen…

Zumindest mache ich das so, ja.


Das Problem:
Die Länge der kann ca. 15’000 Zeichen sein. Ich muss also sogar den Typ text verwenden.

Darin sehe ich aber kein Problem. Ich bin mir grad nicht ganz sicher, wie lang TEXT sein darf, ich glaube, so 2 GByte. Mit Deinen 15 KByte hast Du da noch ein paar Reserven.

Andreas

Es geht hier nur um Performance:

Was ist deiner Meinung nach schneller:

1:
DECLARE
var1 varchar(500) := ‘01010100101010100101010101010…’;
var2 varchar(500) := ‘00000000000000000000000000000…’;
queryInsert text;
BEGIN
queryInsert := ‘INSERT INTO ‘||$1||’ ()
SELECT ( FROM

WHERE &B’’’||var1||’’’ != B’’’||var2||’’’ ORDER BY …’;
EXECUTE queryInsert;
END;

2:
DECLARE
var1 bit(500) := ‘01010100101010100101010101010…’;
var2 bit(500) := ‘00000000000000000000000000000…’;
queryInsert text;
BEGIN
INSERT INTO $1 ()
SELECT ( FROM

WHERE &var1 != var2 ORDER BY …;
END;

Es geht mir nur um Geschwindigkeit…
Gibt es vielleicht einen Weg, den Tabellenname sonst irgendwie herauszubekommen?