Announcement

Collapse
No announcement yet.

escape oder replace &

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • escape oder replace &

    Moin,

    ich habe folgendes Problem. Mein SQL-Statement endet mit
    Code:
    AND 'P.DEBITOR' = t.KUNDE
    P.DEBITOR wird als Parameter übergeben. Steht in dem Kundennamen nun ein Kaufmanns-und, funktioniert das ganze nicht mehr.
    Beispiel:
    Code:
    AND 'Kundenname & Co. KG' = t.KUNDE
    Wie kann das Statement angepasst werden, dass es funktioniert? Ein replace scheint nicht zu funktionieren. Und ein "SET DEFINE OFF" kann ich nicht verwenden, weil das SQL-Statement mehr oder weniger automatisch generiert wird und ich die entsprechende Stelle nicht finden kann.
    Hat jemand eine Idee?

    Gruß
    Martin

  • #2
    Versuchs mal damit:
    Code:
    AND t.KUNDE LIKE parameter ESCAPE '\'
    Code:
    AND t.KUNDE LIKE 'P.DEBITOR' ESCAPE '\'
    kuemmelchen

    Comment


    • #3
      Danke für deine Antwort kuemmelchen. Aber leider funktioniert's nicht. Syntaktisch ist es schon korrekt, aber im Oracle SQL-Developer werde ich beim Absenden der Query zum Eingeben der Substitutionsvariable "CO" aufgefordert. Ich verstehe nicht, dass der String 'Kundenname & Co. KG' nicht als solcher behandelt wird

      Comment


      • #4
        Möglichkeiten der Eingaben wären noch:

        'Kundenname ' || '&' || ' Co. KG' oder 'Kundenname ' || chr(38) || ' Co. KG'

        kuemmelchen

        Comment


        • #5
          Das Problem ist, dass ich ja gar nicht weiß ob der Kundenname ein & beinhaltet oder nicht. Daher wäre mir ein replace(Kundenname, '&', 'und') sehr symphatisch gewesen. Aber das funktioniert ja nun mal leider nicht.

          Comment


          • #6
            Das mit dem Escape hätte eigentlich funktionieren sollen (aus meiner allgemeinen SQL Sicht nicht speziell Oracle) . Hast du denn das Ampersand auch escaped? Also & durch \& ersetzt?

            Comment


            • #7
              Originally posted by Martin Drefers View Post
              Und ein "SET DEFINE OFF" kann ich nicht verwenden, weil das SQL-Statement mehr oder weniger automatisch generiert wird und ich die entsprechende Stelle nicht finden kann.
              Wieso musst du die Stelle den finden? Es scheint ja ein größeres Script zu sein. Erwartest Du etwa irgendwo doch noch eine Parameternachfrage?

              Schalt es doch zu Anfang ab und am Ende wieder ein.
              Gruß, defo

              Comment


              • #8
                Also ich arbeite hier mit einem Tool (PPM von HP). In diesem Tool besteht die Möglichkeit eine Datenquelle zu definieren. Anschließend kann man im Browser ein sogenanntes Portlet definieren, welches auf der vorher erstellten Datenquelle basiert. Bei der Definition der Datenquelle schreibt man nicht einfach das SQL runter, sondern gibt mittels eines Frontends die zu selektierenden Spalten, die FROM-KLausel, die WHERE-Klausel und optional auch noch das order by. Das SELECT wird scheinbar automatisch hinzugefügt. Somit kann ich davor kein "SET DEFINE OFF" schreiben, leider!
                @Ralf:
                Wie meinst du das mit dem Escapen des Ampersand? Ich hab doch nur folgendes:
                Code:
                AND 'P.DEBITOR' = t.KUNDE
                Wobei 'P.DEBITOR' das Ampersand beinhalten KANN!

                Comment


                • #9
                  Die Frage ist etwas unklar - wenn ein SQL-Statement enthält:
                  Code:
                  AND 'P.DEBITOR' = t.KUNDE
                  wird der STRING 'P.DEBITOR' mit dem Inhalt der Spalte t.KUNDE verglichen, dabei taucht kein Ampersand auf?

                  Comment


                  • #10
                    Also 'P.DEBITOR' ist in Wirklichkeit eine Variable in der der tatsächliche Kundenname (mit oder ohne Ampersand) steht.

                    Comment


                    • #11
                      Mit Variablen sollte es aber klappen, hier ein Beispiel:
                      Code:
                      SET SERVEROUTPUT ON SIZE 900000;
                      DECLARE
                       t_var VARCHAR2(100);
                       t_out VARCHAR2(100);
                       i_num NUMBER;
                      BEGIN
                         t_var := 'Smith '||chr(38)||' Wesson';
                         dbms_output.put_line(t_var);
                         SELECT empno, ename 
                           INTO i_num, t_out
                           FROM emp 
                          WHERE ename < t_var
                            AND empno < 7400;
                         dbms_output.put_line('EMPNO='||i_num||' ENAME='||t_out);
                      END;
                      
                      Smith & Wesson
                      EMPNO=7369 ENAME=SMITH
                      PL/SQL procedure successfully completed.
                      Ich musste nur bei der Zuweisung das Ampersand als CHR(38) schreiben, wenn es erst einmal in einer Variable ist, kann man damit problemlos arbeiten.

                      Comment


                      • #12
                        Originally posted by Martin Drefers View Post
                        Also 'P.DEBITOR' ist in Wirklichkeit eine Variable in der der tatsächliche Kundenname (mit oder ohne Ampersand) steht.
                        Klassisches Einfallstor für SQL-Injection. Kannst du dein Script so anpassen, dass es Bind-Variablen verwendet? Dann wäre das Problem auch gelöst.

                        Gruss

                        Comment


                        • #13
                          Prinzipiell funktioniert die Ausgabe einer Variable, in der ein Ampersand vorkommt, bei mir auch. Das scheint also wohl doch eher an dem Tool von HP liegen. Ich werde das mal dort dem Support mitteilen. Evtl. haben die eine Idee.
                          Danke für Eure Beiträge!

                          Comment

                          Working...
                          X