Announcement

Collapse
No announcement yet.

Feldname in Bindvariable

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

  • Feldname in Bindvariable

    Hallo Zusammen.

    Ich habe das problem, daß ich einen cursor habe, dem ich einen feldnamen als bind varinable übergeben möchte um so auf verschiedene Spalten zugreifen zu können. Die geschriebene Package funktion soll mir zur ausgewählten spalte die anzahl der vorzeichenwechsel der Werte ausgeben

    Code:
    function GetSignChangesCount(vfieldname varchar2) return integer is
    
    type CurTyp IS REF CURSOR;
    c CurTyp;
    v_stmt_str varchar2(100);
    
    cnt integer; -- counter
    value number; --wert
    sn  number;  --zum vorzeichen merken
    
    begin 
     v_stmt_str:=' select :x from HD_STERG order by simstep';
     cnt:=0;
    
     open c for v_stmt_str using vfieldname;
       fetch c into value;
       sn:=sign(value);
       loop
         fetch c into value;
         exit when c%NOTFOUND;
         if sign(value)<>sn then 
           cnt:=cnt+1;
           sn:=sign(value);
         end if;
       end loop; 
      close c;
      return(cnt);
    end;
    Das läßt sich zwar wunderschön comiplieren, aber leider bekomme ich einen ORA-01722 fehler in der Zeile
    fetch c into value;

    Geht es überhaupt irgendwie?

  • #2
    Also ich glaube so dynamisches SQL funktioniert nur über das Zusammensetzen von Strings. Wenn Du das ganze allerdings im Client parameterisiert aufrufst sollte es auch kein Problem mit SQL Injection geben.

    Comment


    • #3
      Das will ich halt eben nicht im Client machen sondern die Funktion in einem View einsetzen.

      Comment


      • #4
        Hab gerade selbst die Lösung gefunden

        Code:
        function GetSignChangesCount(vfieldname varchar2) return integer is
        
        type CurTyp IS REF CURSOR;
        c CurTyp;
        v_stmt_str varchar2(100);
        
        cnt integer; -- counter
        value number; --wert
        sn  number;  --zum vorzeichen merken
        
        begin 
         v_stmt_str:=' select '||fieldname||' from HD_STERG order by simstep';
         cnt:=0;
        
         open c for v_stmt_str;
           fetch c into value;
           sn:=sign(value);
           loop
             fetch c into value;
             exit when c%NOTFOUND;
             if sign(value)<>sn then 
               cnt:=cnt+1;
               sn:=sign(value);
             end if;
           end loop; 
          close c;
          return(cnt);
        end;

        Comment


        • #5
          Das war doch das was ich gemeint hatte. Jetzt kann aber in fieldname wieder alles mögliche drin stehen was das ganze wieder für SQL Injection anfällig macht. Ist natürlich nicht für alle Fälle wichtig, aber das war das was ich mit "Strings zusammensetzen" gemeint hatte.

          Comment


          • #6
            Ok, dann hab ich das falsch verstanden.

            Comment

            Working...
            X