[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Apr 2019
    Beiträge
    2

    SQL-replace auf Host-Variable

    Hallo Ihr Wissenden,

    ich möchte in einem RPG-PGM mit einem prepared statement ein Dateifeld (Typ String) updaten.

    Zum Ausführungszeitpunkt soll das "where"-Feld dann noch quasi "normalisiert" werden (Dadurch soll Groß/Kleinschreibung irrelevant werden, und bestimmt Zeichen sollen zum Vergleichszeitpunkt ersetzt werden).

    Nun das Problem:
    Unten seht ihr drei austauschbare Zeilen zum "where"-Teil des Statements.
    In der ersten mein Versuch, in der Hostvariablen ein mögliches P durch ein L zu ersetzen zum Vergleichszeitpunkt. Das führt blöderweise zu einem SQL-Error "-518". Hm.

    Aber:
    In der zweiten Zeile ist beweisen, dass man eine Host- Variable grundsätzlich zum Vergleichszeitpunkt manipulieren kann; Das Statement funktioniert.
    Und in der dritten Zeile ist bewiesen, dass man grundsätzlich zum Vergleichszeitpunkt den zu vergleichenden Wert replacen kann (Allerdings habe ich dabei keine Hostvariable verwendet, sondern eine normale, also kein prepSt).

    Wenn das beides geht, warum funktioniert dann das prep.St in Zeile 1 nicht?

    stmt= 'update myFile set MyField= ''X'' where +
    MyField = replace(? , ''P'', ''L'') '; // 1. <-Geht nicht. Wieso -518?

    // MyField = upper(?) '; // 2. <-Geht. Man kann also Host-Var's verändern

    // MyField = replace(''P'' , ''P'', ''L'')'; // 3. <-Geht. Replace
    funktioniert grundsätzlich,
    solange keine Host-Var.

    Exec sql prepare s1 from :stmt;
    Exec sql execute s1 using :statusP;



    Ich würde es gern verstehen, habt ihr dafür eine Erklärung?

    Besten Dank schon mal,
    Andy

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Ganz einfach, schon mal was von Hostvariablen gehört;-)?

    exec sql set : MyField = upper(: MyField);

    Bei Replace(?,....) weiß SQL nichts über den Typ zur Ausführung. Man kann allerding "cast(? as char(10))" in einem dynamischen SQL verwenden.
    Und warum machst du das Ganze überhaupt dynamisch?

    exec sql update myfile set myfield = replace(: MyField, 'P', 'L')
    where myfield = upper(: MyField);

    Du kannst auch die Parameter P und L wiederum in Hostvariablen setzen.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  3. #3
    Registriert seit
    Apr 2019
    Beiträge
    2
    Ok, recht vielen Dank

  4. #4
    Registriert seit
    Apr 2005
    Beiträge
    385
    Versteh auch nicht, warum eine HostVariable mit SQL geändert werden soll. Da kann man im RPG doch auch die BiF %REPLACE() benutzen?!

  5. #5
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Da es da einen kleinen Unterschied gibt:

    %REPLACE(replacement string: source string{:start position {:source
    length to replace}}

    %REPLACE returns the character string produced by inserting a replacement string into the source string,
    starting at the start position and replacing the specified number of characters.

    Du meinst da wohl eher diese Funktion:

    %SCANRPL(scan string : replacement : source { : scan start { : scan length } )

    %SCANRPL returns the string produced by replacing all occurrences of the scan string in the source
    string with the replacement string. The search for the scan string starts at the scan start position and
    continues for the scan length. The parts of the source string that are outside the range specified by the
    scan start position and the scan length are included in the result.

    Die aber erst ab irgend einem Release kam.
    Des weiteren kommt es immer auf den Einsatz an. Wenn ichmit SQL mischen muss, nehme ich doch gleich SQL, da das Ergebnis einer Bif erst in eine Variable muss.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  6. #6
    Registriert seit
    Apr 2005
    Beiträge
    385
    Ja ich meinte natürlich %SCANRPL verwechselte ich auch immer in der Implementierung
    Welche übringens mit V7R1 Einzug hielt...

    Ich gebe dir Recht Fuerchau, wenn es im SQL geht dann mach es auch da, aber da hier in dem Bsp eine Hostvariable geändert werden soll, kann ich das auch gleich im RPG machen und dann anschließend die in dem SQL Statements weiter zu nutzen.

  7. #7
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Wich ich schon sagte: Betrachte das Gesamtkonstrukt.
    In diesem Fall braucht man weder eine zusätzliche Variable noch dynamisches SQL:

    exec sql update myfile set myfield = replace(: MyField, 'P', 'L')
    where myfield = upper(: MyField);

    was den (relativ hohen) Aufwand des vorherigen Konstrukts vereinfachte.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

Similar Threads

  1. Sql REPLACE
    By tarkusch in forum NEWSboard Programmierung
    Antworten: 1
    Letzter Beitrag: 29-07-17, 12:24
  2. create or replace table
    By dibe in forum IBM i Hauptforum
    Antworten: 11
    Letzter Beitrag: 11-11-16, 10:59
  3. Replace im CL
    By Joe in forum NEWSboard Programmierung
    Antworten: 5
    Letzter Beitrag: 18-05-15, 08:20
  4. RUNSQL Host Variable zurückgeben
    By oulbrich in forum NEWSboard Programmierung
    Antworten: 10
    Letzter Beitrag: 02-04-14, 12:05
  5. SQL0314, Host-Variable nicht eindeutig
    By gue_br in forum IBM i Hauptforum
    Antworten: 7
    Letzter Beitrag: 26-02-14, 16:40

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •