Ankündigung

Einklappen
Keine Ankündigung bisher.

Oracle groß/klein vom Spaltennamen

Einklappen

Neue Werbung 2019

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

  • Oracle groß/klein vom Spaltennamen

    Hallo,

    ich bin dabei eine bestehende Anwendung von MySQL nach Oracle zu portieren. Bisher war es so, dass Spaltennamen zB "UserID" lauten (Mit Groß und Kleinschreibung). Die Anwendung holt die Werte meist in ein Array und greift dann so zu:

    PHP-Code:
    $UserID $Result[UserID]; 
    Das klappt natürlich nur, wenn die Groß/Kleinschreibung auch für den Array-Key passt. Ich lege die Datenbank jetzt in Oracle auch passend an und mache zB einen solchen Select:

    Code:
    SELECT UserID FROM tblusers WHERE Username='Klaus';
    Wenn ich nun mit

    PHP-Code:
    $UserID $Result[UserID]; 
    Abfragen möchte, hat mir Oracle ins Array den Key "USERID" (alles Groß) geschrieben und ich bekomme keinen Wert zurück (meiner lautet ja "UserID").

    Problem: Ich habe etwa 7'000 Stellen im Code wo das zutrifft (mit RegExp gezählt). Wie kann ich Oracle dazu bringen die Spaltennamen so zurückzugeben wie ich es im Select und bei der Tabellendefinition explizit vorgegeben habe? Es kann ja nicht sein dass diese Mega-Datenbank so was nicht kann, oder?

    Kann ich notfalls PHP beibringen bei Arrays die Groß-Kleinschreibung von Keys zu ignorieren? So das das hier das gleiche ist:

    PHP-Code:
    $UserID $Result[UserID];
    $UserID $Result[USERID]; 
    Danke,

    Donald


  • #2
    $UserID = $Result[UserID];
    Das ist sowieso falsch. Die korrekte Syntax lautet:
    PHP-Code:
    $UserID $Result['UserID']; 
    Wenn Du mal Dein error-reporting hochschraubst sollte es Fehlermeldungen hageln. Geschätzte 7000.

    Lustigerweise könntest Du den Fehler mißbrauchen, um Dein Problem zu lösen.
    PHP-Code:
    if ($oracle) {
      
    define ('UserID' 'USERID');

    --

    „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
    Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


    --

    Kommentar


    • #3
      Welchen Oracle-Treiber benutzt Du? (PDO, PECL)? Bei PDO gibt es ein paar Parameter, aber auch nicht passendes. Das Beste wir sein, dass du alle Spaltennamen im Array auf klein oder gross konvertierst. Das wäre der Standard. Die Case-Sensitiv Spaltennamen sind nicht üblich.

      PHP: PDO::setAttribute - Manual

      EDIT
      Also per Default werden die Spaltennamen von ORACLE in Großbuchstaben geliefert.

      Code:
      $s = oci_parse($c, "select postal_code from locations");
      oci_execute($s);
      while ($res = oci_fetch_array($s, OCI_ASSOC)) {
       echo $res["POSTAL_CODE"] . "<br>\n";
      }
      Am besten Du baust Dir einen kleinen Datenbank-Layer und erledigst dort die Umwandlung.

      Code:
      switch ($sDatabaseTyp) {
        case 'ORACLE':
         $aRow['UserId'] = $aRow['USERID'];
         ...
         break;
      }

      Grüße
      Thomas

      Kommentar


      • #4
        Ich habe noch folgendes gefunden:

        PHP-Code:
        <?php

        /*
          Before running, create the table with a case sensitive column name:
            CREATE TABLE mytab (id NUMBER, "MyDescription" VARCHAR2(30));
            INSERT INTO mytab (id, "MyDescription") values (1, 'Iced Coffee');
            COMMIT;
        */

        $conn oci_connect('hr''welcome''localhost/XE');
        if (!
        $conn) {
            
        $e oci_error();
            
        trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
        }

        $stid oci_parse($conn'SELECT * FROM mytab');

        // Use uppercase for non case-sensitive column names
        oci_define_by_name($stid'ID'$id);

        // Use the exact case for case-sensitive column names
        oci_define_by_name($stid'MyDescription'$mydesc);

        oci_execute($stid);

        while (
        oci_fetch($stid)) {
            echo 
        "id $id is $mydesc<br>\n";
        }

        // Displays:
        //   id 1 is Iced Coffee

        oci_free_statement($stid);
        oci_close($conn);

        ?>
        PHP: oci_define_by_name - Manual

        Habe es aber nicht probiert.

        Grüße
        Thomas

        Kommentar


        • #5
          Hallo,

          vielen Dank für Euren Input. Ich habe sowas bereits befürchtet.

          Ich werde mir in PureBasic ein Hilfsprogramm schreiben. Dieses soll mich bei der Konvertierung etwas unterstützen. Mal sehen...

          Grüße,

          Donald

          Kommentar


          • #6
            Du kannst auch probieren, ob Du in ORACLE über jede Tabelle eine View legen kannst. In der View werden die Spalten dann gemäß der MySQL schreibweise (Case-Sensitiv) definiert.

            Code:
            CREATE TABLE test_1 (
             feld INT NOT NULL
            );
            
            INSERT INTO test_1 
            VALUES (1);
            
            CREATE VIEW view_test_1
            ( "Feld" ) AS 
            SELECT * FROM test_1;
            
            SELECT * FROM view_test_1;
            
            Feld                   
            ---------------------- 
            1
            Grüße
            Thomas

            Kommentar


            • #7
              Hast Du meine Lösung mal angesehen?
              PHP-Code:
              if ($oracle) {
                
              define ('UserID' 'USERID');

              --

              „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
              Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


              --

              Kommentar


              • #8
                Hallo,

                Danke für Eure Tipps. Aber das sind alles nur "Krücken".

                Ich habe mich entschlossen, die ganze Anwendung nach allen Vorkommen von SQL-Zugriffen etc. zu durchsuchen und das zu reparieren. Auch wenn es Tage dauert...

                Ich korrigiere dabei die alten Array-Keys, wo keine Hochkommas verwendet werden und ersetze alle Datenbank-Zugriffe durch Großbuchstaben. Ich habe bereits ein PHP Script, welches die bestehende MySQL Datenbank so umbaut, dass alle Spaltennamen in Großbuchstaben angegeben werden. So sollte es dann endgültig klappen. Jetzt kämpfe ich noch mit DATE_SUB, DATE_ADD, NOW(), CURRENT_DATE, YEAR(), MONTH() etc... Das wird wohl nicht ganz ohne DB-spezifische Query's zu machen sein

                Mein Fehler war damals, die von MySQL verwendeten Funktionen gerne anzunehmen und nicht danach zu sehen, ob die auch im Standard sind. Oracle kennt offensichtlich alle diese kleinen Helfer nicht.

                Danke,

                Donald

                Kommentar

                Lädt...
                X