Ankündigung

Einklappen
Keine Ankündigung bisher.

SQL "IN" Operator mit Listen variabler Länge verwenden in Groovy SQL Statements

Einklappen
X

SQL "IN" Operator mit Listen variabler Länge verwenden in Groovy SQL Statements

Einklappen
  • Filter
  • Zeit
Alles löschen
neue Beiträge

  • PhilippDoerner
    antwortet
    Hmm das hatte ich fast befürchtet. Nicht die perfekte Lösung die ich mir erhofft hätte, aber dennoch eine die Funktioniert. Danke !

    Einen Kommentar schreiben:


  • MartinW
    antwortet
    Also bei dem % Operator ist es so, dass man es dem Parameter anhängen muss.
    Bei dem IN-Operator ist es so, dass man für jeden Teil des IN einen eigenen Parameter benötigt.

    Also so bei 4 Parametern: IN (?,?,?,?)
    Falls es 10 Parameter sind: IN (?,?,?,?,?,?,?,?,?,?)

    Hierfür gehe ich in der Regel so vor, dass ich das SQL dynamisch per Groovy zusammenbaue und auch die notwendigen setString-Aufrufe rufe ich in Schleifen auf.

    Einen Kommentar schreiben:


  • PhilippDoerner
    antwortet
    Heya MartinW,

    Ich bin mir dessen bewusst, es war einfach das erste Beispiel das mir eingefallen ist weil es allgemein (Intrexx unabhängig) ein häufig vorkommender Fall ist.
    Ne alternative wäre zu einer Applikation die Artikel in verschiedenen Sprachen beinhaltet zu schauen ob ein Artikel in einer Liste von Sprachen, die der Nutzer vorgibt, vorhanden ist.
    Das Prinzip der Frage bleibt dasselbe: Ich möchte SQL Queries mit "IN" Operator verwenden können mit variablen Listen als SQL Parameter. Gibt es dazu Syntax in JDBC oder komme ich nicht drum herum mir das SQL Statement selbst zu generieren, wie z.B. hier unter 2.1. beschrieben.

    Einen Kommentar schreiben:


  • MartinW
    antwortet
    Warum genau möchtest du das auf SQL-Ebene lösen?
    Es gibt das Kontext-Objekt g_om welches auch Methoden liefert um festzustellen, ob ein User Mitglied einer bestimmten Gruppen ist.
    Oder auch Methoden die alle Gruppen eines Users zurückgeben..

    Einen Kommentar schreiben:


  • SQL "IN" Operator mit Listen variabler Länge verwenden in Groovy SQL Statements

    Hallo allerseits,

    Ich möchte gerne ein Groovy Skript abfeuern, bei dem ich überprüfe ob ein Wert X in einer variablen Liste aus Werten vorhanden ist.
    Das ist ein klassischer Fall für SQL's "IN" Syntax

    Im Idealfall würde das ganze in etwa so funktionieren (Exemplarisch: Überprüfen ob der User in einer variablen Anzahl von Gruppen ist, bitte im Hinterkopf behalten das es insgesamt aber ums Prinzip geht und nicht direkt um die Aufgabe):

    Code:
    boolean userIsInGroup(int p_userLID, int[] p_groupLIDs){
        String sqlStatementStr = """
           SELECT LSETID
           FROM DSMEMBER
           WHERE LOBJECTID = (?) AND LSETID IN (?)
         """
         int objectId = p_userLID //In DSOBJECT, records represent users, groups and more
    
         String groupLIDStr= p_groupLIDs.join(",")
         Object[] sqlParameterArr = [objectId, groupLIDStr]
         List<GroovyRowResult> resultSetObj = executeSelectSQLQuery(sqlStatementStr, sqlParameterArr)
    
         return resultSetObj.size() > 0
    }
    
    List<GroovyRowResult> executeSelectSQLQuery(String p_sqlQueryStr, Object[] p_sqlParameterArr) {
        Sql databaseConnectionObj = new Sql(g_dbConnections.systemConnection)
        List<GroovyRowResult> resultSetObj
        try {
            resultSetObj = databaseConnectionObj.rows(p_sqlQueryStr, p_sqlParameterArr)
        } catch (Exception e){
            g_syslog.error ( e )
        }
        return resultSetObj
    }
    Das geht leider nicht, da der String "groupLIDStr", wenn er in "LSETID IN (?)" eingefügt wird keine gültige Gruppe darstellt auf die SQL's "IN" Operator angewandt werden kann.
    Man erhält einen Fehler: "Error: de.uplanet.jdbc.StandardDbException: Error: 1722, SQLState: 42000: ORA-01722: invalid number"
    Das verwundert mich etwas, weil nach dem einfügen des Strings dort doch eigentlich stehen sollte "LSETID IN (X,Y,Z)", was normalerweise ein valides SQL Statement wäre... aber ich schweife ab.

    IN jedem Fall möchte ich Fragen wie das was ich hier tun möchte sauber zu bewerkstelligen wäre.

    Ich habe bereits eine Mögliche Lösung:
    Ich generiere sqlStatementStr so dass dessen Wert "SELECT LSETID FROM DSMEMBER WHERE LOBJECTID = (?) AND LSETID IN (X,Y,Z)" darstellt.
    Das funktioniert auch, aber ich werde das Gefühl nicht los das JDBC eigentlich die Möglichkeit, variable Arrays in ein SQL Statement zu werfen, unterstützen sollte.
Lädt...
X