Ankündigung

Einklappen
Keine Ankündigung bisher.

Fehler ORA-06550 bei PHP Oracle Funktionsaufruf

Einklappen

Neue Werbung 2019

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

  • Fehler ORA-06550 bei PHP Oracle Funktionsaufruf

    Hallo zusammen

    Ich bin verzweifelt auf der Suche nach einer Lösung zu meinem Oracle Problem. Zwar tritt bei mir, leider nur teilweise, die gleiche Oracle Fehlermeldung auf. Der Fehler tritt, wenn er auftritt, immer beim Ausführen einer Stored Procedure auf. Folgende Fehlermeldung erscheint:
    Fehler-Nr: 2
    oci_execute() [function.oci-execute]: ORA-06550: line 1, column 41: PLS-00103: Encountered the symbol "" when expecting one of the following: (-+ case mod new not null others <an identifier> <a double-quoted delimited-identifier><a bind variable> avg count current exists max min prior sql stddev sum variance execute forall merge time timestamp interval date <a string literal with character set specification> <a number> <a single-quoted SQL string> pipe <an alternaively-quoted string literal with character set specific
    Eine Beispiel Funktion, bei der dieser Fehler häufig auftritt:

    Code:
    function f_5529_updateNewsData($pr_DBHandle, $pvn_NewsID = 0, $pa_Data, $pvc_UpdateCode) 
    	{
    		// Variablen deklarieren
    		$lr_PrcHandle	= null;
    		$lvc_Return		= "";
    		$lvc_CART		= "1";
    		
    		// Parameter überprüfen: DB-Verbindung angegeben?
    		if (isset($pr_DBHandle)) 
    		{
    			// Ja: DB-Verbindung wurde angegeben
    		
    			// Prozeduraufruf parsen
    			$lr_PrcHandle = oci_parse($pr_DBHandle, "begin KBI_3015_registerNews_PRC(:NewsID,
    					    :Status, 
    					    :CART,
    					    :Bez1,
    					    :Bez2,
    					    :Bez3,
    					    :Bez4,
    					    :GiltAb,
    					    :GiltBis,
       					    :Titel,
    					    :ErrorMessage); end;");
    		
    			// Variablen verknüpfen
    			oci_bind_by_name($lr_PrcHandle, ":NewsID", $pvn_NewsID);
    			oci_bind_by_name($lr_PrcHandle, ":Status", $pvc_UpdateCode);
    			oci_bind_by_name($lr_PrcHandle, ":CART", $lvc_CART);
    			oci_bind_by_name($lr_PrcHandle, ":Bez1", $pa_Data['txt_nws_deutsch']);
    			oci_bind_by_name($lr_PrcHandle, ":Bez2", $pa_Data['txt_nws_franzoesisch']);
    			oci_bind_by_name($lr_PrcHandle, ":Bez3", $pa_Data['txt_nws_italienisch']);
    			oci_bind_by_name($lr_PrcHandle, ":Bez4", $pa_Data['txt_nws_englisch']);
    			oci_bind_by_name($lr_PrcHandle, ":GiltAb", $pa_Data['txt_nws_giltab']);
    			oci_bind_by_name($lr_PrcHandle, ":GiltBis", $pa_Data['txt_nws_giltbis']);
    			oci_bind_by_name($lr_PrcHandle, ":Titel", $pa_Data['txt_nws_titel']);
    			oci_bind_by_name($lr_PrcHandle, ":ErrorMessage", $lvc_Return, 32, SQLT_CHR);
    
    			// Prozeduraufruf ausführen
    			oci_execute($lr_PrcHandle);
    
    			// Prozeduraufruf löschen
    			oci_free_statement($lr_PrcHandle);
    		}
    		
    		// Ergebniscode zurückgeben
    		return $lvc_Return;
    	}
    Was ich schon feststellen konnte ist, dass der Fehler nur bei Funktionen mit Rückgabewert auftritt. Also der Rückgabewert bei dieser Zeile:
    PHP-Code:
    oci_bind_by_name($lr_PrcHandle":ErrorMessage"$lvc_Return32SQLT_CHR); 
    Was zudem seltsam ist, wenn der Fehler wieder auftritt und ich danach das PHP File wieder neu auf den Apache stelle, tritt er in 90% der Fälle nicht mehr auf. Aber leider funktioniert diese dann nicht für immer einwandfrei.

    Was könnte hier das Problem sein? Der Parameter der die Grösse der Rückgabe angibt ist genügend gross.

    Wäre sehr dankbar für Tipps und Hilfe.

  • #2
    Was steht an dieser Stelle?

    Kommentar


    • #3
      An dieser Stelle befindet sich einzig und allein die Parameter Liste der Oracle Funktion. Sonst nichts weiter.

      Kommentar


      • #4
        Hm aber was. Rekonstruier das doch mal durch Einsetzen der Werte. Vielleicht liegts daran: Du uebergibst einen Leerstring (Symbol ""). Ein Leerstring ist bei der Oracle NULL. Wenn die Spalte aber keine NULL-Werte erlaubt, steigt sie aus.

        Kommentar


        • #5
          Wenn ein Attribut auf NOT NULL gestellt ist und ein NULL Wert darauf eingetragen wird. Erscheint eine andere Fehlermeldung. Die NULL Werte werden durch eine Benutzerdefinierte Exception abgefangen. Daran kann es also nicht liegen.

          Was mir hingegen aufgefallen ist, dass wenn ein Cursor zurückgegeben wird, nie das Problem auftritt. Immer nur bei Funktionen, die eine Returnvariable besitzen.

          Kommentar


          • #6
            Tritt das Problem auch auf, wenn du den Query so wie er mit eingesetzten Variablen auch auftritt, ohne PHP (z.B. über den SQL Developer) an die Oracle schickst?

            Kommentar


            • #7
              Nein wenn ich die Procedure in einer Testfunktion aufrufe habe ich das Problem nicht.

              Kommentar


              • #8
                So ich glaube ich habe die Lösung gefunden. Bis jetzt ist der Fehler nicht mehr aufgetreten.
                Und zwar habe ich eine Funktion geschrieben, die den Oracleaufruf "säubert".

                PHP-Code:
                function f_5544_stripSpecialCharacters($pvc_parseString) {

                      
                $lvc_output "";
                      
                $lz_Counter    0;

                    for (
                $lz_Counter 0$lz_Counter strlen($pvc_parseString); $lz_Counter++) {
                      if ((
                ord($pvc_parseString[$lz_Counter]) != 9) && 
                          (
                ord($pvc_parseString[$lz_Counter]) != 10) && 
                          (
                ord($pvc_parseString[$lz_Counter]) != 13)) {
                        
                $lvc_output .= $pvc_parseString[$lz_Counter];
                      }
                    }
                    
                    
                // Return character only strings.
                    
                return $lvc_output;
                  } 

                Kommentar

                Lädt...
                X