Announcement

Collapse
No announcement yet.

Abfrage von varchar2 Spalten

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

  • Abfrage von varchar2 Spalten

    Hallo Zusammen,
    ich greife mittels PHP auf eine 9er Oracle DB zu.
    der select auf Number ode Date spalten funktioniert reibungslos.

    Nur wenn ich varchar2 Spalten auslesen möchte bekommen ich Probleme. Entweder ich bekomme gar keine Seite im Browser angezeigt oder ich bekomme die Fehlermeldung:

    Warning: ocifetch(): OCIFetch: ORA-24374: define not done before fetch or execute and fetch

    Wie gesagt bei nur NUMBER/DATE Spalten gibt es überhaupt keine Probleme.
    Ich habe (zumindest denke ich das) schon so ziemlich alle Möglichekeiten ausprobiert.
    Habt ihr noch eine Idee?

    Hier noch der Code Auszug:

    $statement = "select NUMBER,NUMBER,DATE,VARSCHAR2 from tabelle where xyz='12345'";

    $sid = OCIParse($c,$statement);
    if (!$sid) die("Fehler beim Parsen des Statements");

    if (!(OCIExecute($sid)))
    {
    $a_oci_error = ocierror($c);
    echo Select Statement konnt nicht ausgeführt werden\n".$a_oci_error['code'].":".$a_oci_error['message'];
    }

    while (OCIFetch($sid)) {

    $auf = OCIResult($sid, "NUMBER");
    $zw= OCIResult($sid, "NUMBER");
    $zw2= OCIResult($sid, "DATE");
    $zw3= OCIResult($sid, "VARCHAR2");
    .....

    Vielen Dank und Gruß
    Olli

  • #2
    Hallo Olli,

    ich weiß nicht ob du dich nur hier vertippt hast und das der Grund ist:
    $statement = "select NUMBER,NUMBER,DATE,<b>VARSCHAR2</b> from tabelle where xyz='12345'";<br>
    ...<br>
    $zw3= OCIResult($sid, <b>"VARCHAR2"</b>); <br>

    Gruß Fal
    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

    Comment


    • #3
      Hallo Falk,

      ne, das ist nur ein Tippfehler..... Sorry!

      Danke und Viele Grüße
      Oll

      Comment


      • #4
        Hallo Olli,

        Du musst, glaube ich, die while-Zeile etwas abändern.
        Der Vergleich ist glaube ich noch nicht vollständig.
        while (OCIFetch($sid) == 1) {
        muss es glaube ich heißen.
        Rein logisch ist dies egal, doch brauchen manche Treiber dies, um sauber zu funktionieren.
        Gruß
        Christia

        Comment


        • #5
          Hai,

          Funktioniert mit Number und Date wie sonst auch.
          Sobald ich aber das "Varchar2" mit einbaue passiert wieder nix.
          Also leider keine Besserung.

          Trotzdem Danke!

          Habe noch mal die "@" rausgenommmen und bekomme jetzt noch folgende Fehlermeldungen:

          Warning: ociexecute(): OCIStmtExecute: ORA-03106: fatal two-task communication protocol error in /uebersicht.php on line 81

          Select Statement konnt nicht ausgeführt werden :
          Warning: ocifetch(): OCIFetch: ORA-24374: define not done before fetch or execute and fetch

          Viele Grüße

          Oll

          Comment


          • #6
            Hallo Olli,

            number und date sind interne Oracle-Datentypen, da geht's ohne define. Für char oder varchar2 musst Du vor dem Execute ein OCIDefineByPos aufrufen.

            Gruß
            Usch

            Comment


            • #7
              Hallo Uschi,

              vielen Dank für den Hinweis.

              Habe das mal nachgelesen und kann das auch irgendwo nachvollziehen.

              Leider gibt es "OCIDefineByPos" in PHP nicht.

              Da gibt es nur "OCIDefineByName" was mich aber auch nicht wirklich weiterbringt, ausser das keine Fehlermeldung mehr kommt, sondern die Seite im Browser nicht mehr angezeigt werden kann.

              Für weitere Hinweise bin ich dankbar.

              Danke und viele Grüße

              Oll

              Comment


              • #8
                Hallo Olli,

                wie lautet denn die Syntax für den OCIDefineByName ? im OCI hat es das nicht, aber sowohl ein BindByPos, als auch ein BindByName. Ich stell mir vor, dass es so ähnlich gehen müsste. Hast Du die Möglichkeit, irgendwo eine Länge anzugeben ? bei varchar2 ist die ja variabel.
                Gruß
                Usch

                Comment


                • #9
                  Hallo Uschi,

                  hier die Beschreibungen:

                  Beschreibung
                  int OCIDefineByName ( int stmt, string Spaltenname, mixed & Variable [, int Typ] )

                  Beschreibung
                  int OCIBindByName ( int stmt, string Platzhaltername, mixed & Variable, int Länge [, int Typ] )

                  Ich kann aber nirgends was zu select Beispielen finden.

                  Die Beispiele betreffen nur update und inserts.....

                  Besteht natürlich auch noch die Möglichkeit, das ich einfach nur zu blöd bin..... :-))

                  Besten Dank und Viele Grüße

                  Oll

                  Comment


                  • #10
                    Hallo Olli,

                    ich hab mir die php-Beschreibung zum OCI jetzt auch mal angeschaut. Eigentlich muss es so gehen wie Du es machst. Mit Oracle 9 gibt es allerdings auch in anderen Bereichen ziemliche Unterschiede.

                    Den OCIBindByName benutzt man wohl bei normalem select nicht, aber da gibt es noch einen OCIFetchInto. hast Du den schon probiert ?
                    OCIFetchInto($sid,&$arrSpalten,OCI_ASSOC+OCI_RETUR N_NULLS);

                    $auf = $arrSpalten['Spalte1'];
                    $zw= $arrSpalten['Spalte2");
                    ...

                    Gruß
                    Usch

                    Comment


                    • #11
                      Hi Uschi,
                      klappt mit den Number-Feldern aber nicht mit dem varchar2(12) Feld.

                      $statement = "select varchar2 from tabelle where varchar2='12345678'";

                      $sid = OCIParse($c,$statement);

                      OCIExecute($sid)

                      while (OCIFetchInto($sid,&$spalte,OCI_ASSOC+OCI_RETURN_N ULLS)) {

                      $auf = $spalte['Spaltenname'];

                      echo "$auf";

                      }

                      Es kommt zwar keine Fehlermeldung, aber auch kein Ergebniss, d.h. das Script läuft ellenlang ohne das was passiert.

                      Auch ein Verbindung mit OCIDefinebyName (vor dem OCIExecute) geht nicht.

                      Es ist zum Mäusemelken.

                      Ich habe auch keine Möglichkeit, da ein anderes Feld draus zu machen.

                      Vielen Dank das Du Dir soviele Gedanken machst. Find ich Klasse! :-))

                      Was für Unterschiede in anderen Bereichen meinst Du denn?

                      Evtl. kommt man ja so irgendwie weiter!

                      Oder Vielleicht hast Du ja noch eine Idee (oder vielleicht auch jemand anders!?).

                      Oder anderherum gefragt: Klappt das den bei irgendjemanden?

                      Wenn ja, ggf. gibt es ja ein Konfigurationsfehler o.ä. bei mir.

                      Vielen Dank und Viele Grüße von

                      Oll

                      Comment


                      • #12
                        Hallo Olli,

                        also bei uns läuft der Zugriff mit php über OCI ohne Beanstandungen. Habe allerdings nur Erfahrung mit 8i. Ich verwende auch das OCIFetchInto, allerdings habe ich immer das übergebene Array vor der while-Schleif mit $spalte = array(); initialisiert.

                        Funktioniert den dein Select bei "herkömmlichem" DB-Zugriff, z.B. über SQL-Plus? Liefert das Select eine "begrenzte" Anzahl an Datensätzen und (vielleicht dumme Frage) das Feld heißt nicht wirklich "VARCHAR2"?

                        Gruß Fal
                        Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                        Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                        Comment


                        • #13
                          Hallo Falk,

                          bei SQL-PLUS funktioniert die Abfrage einwandfrei.

                          Bei der Abfrage soll genau ein DS selectiert werden, was bei SQL-Plus auch -wie gesagt- funktioniert
                          und das Feld heißt eigentlich "VERS_NR" und nicht "VARCHAR2"! :-)

                          Ich habe auch schon verschiedene Select Statements probiert ( mit TO_NUMBER z.B., da geht der select
                          zwar zügig, aber ich bekomme kein Ergebniss angezeigt oder auch SUBSTR(VERS_NR,1,12)).

                          Wie bereits angedeutet glaube ich, das da irgendwas anderes sein muss, da alle anderen Spaltentypen einwandfrei laufen.

                          Gibt es vielleicht noch irgendwas, was ich bei der Konfiguration der OCI-Schnittstelle/SLES8 usw. beachten muss?

                          Vielen Dank und Viele Grüße
                          Oll

                          Comment


                          • #14
                            Hallo Olli,

                            ich hab mir jetzt den Thread nochmal komplett durchgelesen und bin der Überzeugung, das es nicht am VARCHAR2, OCIDefineIrgendwas oder OCIFetch liegt. Ursächlich scheint eher der ORA-03106 des OCIExecute, sprich, das Statement wird gar nicht geparst und alle nachfolgenden "Define not done before fetch...", etc. sind nur Folgefehler!
                            Eine kurze Googelei nach "ORA-03106 php" bringt eine Menge "Ansätze". Prüfe mal mit einem einfachen &lt;? phpinfo(); ?&gt; ob die Oracle-Verzeichnisse alle korrekt gesetzt sind (z.B. ORACLE_HOME im Apache-Environment oder die Angaben unter OCI8)

                            Gruß Fal
                            Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                            Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                            Comment


                            • #15
                              Hallo Olli,

                              Version 9.2.0.4 behandelt null-values z.B. anders. Hast Du schon mal probiert (grad wegen der Länge) vor jedem FetchInto Deine Variable zu Initialisieren, damit bestimmt genug Platz da ist und Oracle das auch mitkriegt ? z.B. so:

                              OCIExecute($sid)
                              $auf ="abcdefghijkl";
                              while (OCIFetchInto($sid,&$spalte,OCI_ASSOC+OCI_RETURN_N ULLS)) {
                              $auf = $spalte['Spaltenname'];
                              echo "$auf";
                              $auf ="abcdefghijkl";
                              }

                              falls das auch nicht funkt , fällt mir noch ein, ein PL-SQL-Statement zu verwenden:

                              $statement = "BEGIN select NUMBER,NUMBER,DATE,VARSCHAR2
                              into :num1, :num2, :dat1, :var2
                              from tabelle where xyz='12345'";
                              $sid = OCIParse($c,$statement);
                              if (!$sid) die("Fehler beim Parsen des Statements");

                              OCIBindByName($sid,":num1",&$num1,32);
                              OCIBindByName($sid,":num2",&$num2,32);
                              OCIBindByName($sid,":dat1",&$dat1,10);
                              $var2 ="abcdefghijkl"; // immer Initialisieren, damit die richtige Länge kommen kann.
                              OCIBindByName($sid,":var2",&$var2,-1); // -1, damit Oracle eigentlich selbst die MaxLänge bestimmt

                              eigentlich tippe ich schon drauf, daß Dir Oracle einfach leere Strings zurückgibt, weil es keine Längenangabe hat.
                              Kannst Du ja mal mit einem strlen auf die befüllte Variable nachschauen.

                              Wenn das auch nix hilft, bin ich mit einem Latein auch am Ende.

                              Ansonsten nix für ungut, die Mysterien der modernen Technik find ich faszinierend . :-)

                              Gruß
                              Usch

                              Comment

                              Working...
                              X