Ergebnis 1 bis 7 von 7

Thema: Variable Tabelle als Parameter mit anschließendem select

  1. #1
    olze ist offline Neuer Benutzer
    Registriert seit
    05.01.2011
    Beiträge
    3

    Standard Variable Tabelle als Parameter mit anschließendem select

    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.

    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;
    Ich bin Anfänger was plpgsql angeht, bin also für jede Erklärung (oder Link zur Erklärung) dankbar!!

  2. #2
    ads
    ads ist offline Super-Moderator
    Registriert seit
    08.02.2006
    Ort
    MD
    Beiträge
    4.056

    Standard

    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

  3. #3
    castorp ist offline Erfahrener Benutzer
    Registriert seit
    27.06.2009
    Beiträge
    525

    Standard

    Zitat Zitat von olze Beitrag anzeigen
    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)
    Versteh' ich nicht.
    Ein Prepared Statement (wir reden über Java PreparedStatements oder?) ist doch auch nur ein String der dynamisch zusammengebaut wird. Warum sollte man da nicht eine andere Tabelle verwenden können?
    A SQL query walks into a bar and sees two tables. He walks up to them and says 'Can I join you?'

  4. #4
    olze ist offline Neuer Benutzer
    Registriert seit
    05.01.2011
    Beiträge
    3

    Standard

    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).

    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;
    ich hoffe Links nach extern sind erlaubt, falls nicht bitte entfernen:
    Passing Table Names in PreparedStatement (JDBC forum at JavaRanch)

  5. #5
    castorp ist offline Erfahrener Benutzer
    Registriert seit
    27.06.2009
    Beiträge
    525

    Standard

    Zitat Zitat von olze Beitrag anzeigen
    Es gibt keine PreparedStatements wenn die Tabelle dynamisch ist
    Natürlich geht das:

    Code:
    String sql = "SELECT * FROM " + tableName + " WHERE id = ?";
    PreparedStatement pstmt = connection.prepareStatement(sql);
    pstmt.setInt(1, 42);
    ResultSet rs = pstmt.executeQuery();
    A SQL query walks into a bar and sees two tables. He walks up to them and says 'Can I join you?'

  6. #6
    ads
    ads ist offline Super-Moderator
    Registriert seit
    08.02.2006
    Ort
    MD
    Beiträge
    4.056

    Standard

    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

  7. #7
    olze ist offline Neuer Benutzer
    Registriert seit
    05.01.2011
    Beiträge
    3

    Standard

    Code:
    String sql = "SELECT * FROM " + tableName + " WHERE id = ?";
    PreparedStatement pstmt = connection.prepareStatement(sql);
    pstmt.setInt(1, 42);
    ResultSet rs = pstmt.executeQuery();
    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.

    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)

Ähnliche Themen

  1. Antworten: 2
    Letzter Beitrag: 16.10.2010, 14:26
  2. SELECT eine Variable doppelt abfragen
    Von renzge im Forum SQL
    Antworten: 4
    Letzter Beitrag: 23.07.2009, 13:30
  3. Frage Tabelle als Parameter in View
    Von christophW im Forum SQL
    Antworten: 8
    Letzter Beitrag: 10.03.2009, 13:43
  4. Insert Trigger | Variable Tabelle
    Von CenText im Forum Trigger und Funktionen
    Antworten: 13
    Letzter Beitrag: 16.07.2008, 05:27
  5. NOTIFY mit Parameter
    Von tueb im Forum Trigger und Funktionen
    Antworten: 8
    Letzter Beitrag: 05.06.2008, 21:28

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Links: Tobias Bauer - IT- und Funkdienstleistungen   -   Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen   -   Funkforum