Announcement

Collapse
No announcement yet.

Index und Daten aus Oracle auslesen

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

  • Index und Daten aus Oracle auslesen

    Hallo erstmal,
    ich hoffe ich bekomme hier in dem Forum die hilfe die ich brauche *gg*

    ich versuche gerade per PHP Script meine Oracle Datenbank auszulesen und die Ergebnisse in einem Array zu speichern.

    Einmal sollen den Daten der einzelen Tabellen angezeigt werden: Datenlänge, Datentyp, Defaultwert und ob es ein Nulltable sein darf.
    Das Funktioniert auch.

    Im zweiten Schritt würde ich mir gerne die Indizes auslesen und auch in einem Array speichern.

    Hier mal der Quellcode:

    PHP Code:
    $db->queryStmt('SELECT table_name FROM USER_TABLES');

    $table_array = array();
    $index_array = array();

    while (
    $row $db->fetchRow())
    {
        if(
    strpos($row['table_name'],'$'))
            continue;

        
    $db2->queryStmt('SELECT ' .
                
    'LOWER(table_name) as table_name, ' .
                
    'LOWER(column_name) as column_name, ' .
                
    'LOWER(data_type) as data_type, ' .
                
    'data_length, ' .
                
    'data_default, ' .
                
    'nullable ' .
                
    'FROM user_tab_columns ' .
                
    'WHERE table_name=\'' $row['table_name'] . '\'');
                
        while (
    $col $db2->fetchRow())
        {    
            
    $table_array[$col['table_name']][$col['column_name']]['data_type'] = $col['data_type'];
            
    $table_array[$col['table_name']][$col['column_name']]['data_length'] = $col['data_length'];
            
    $table_array[$col['table_name']][$col['column_name']]['data_default'] = $col['data_default'];
            
    $table_array[$col['table_name']][$col['column_name']]['nullable'] = $col['nullable'];
        }
        


        
    $db3->queryStmt('SELECT ' 
                
    'LOWER(table_name) as table_name, ' .
                
    'LOWER(column_name) as column_name, ' .
                
    'LOWER(index_name) as index_name, ' .
                
    'data_index ' .
                
    'FROM dba_indexes ' .
                
    'WHERE table_name=\'' $row['table_name'] . '\'');

        while(
    $index $db3->fetchRow())
        {
            
    $index_array[$index['table_name']][$index['column_name']]['index_name'] = $index['index_name'];
            
    $index_array[$index['table_name']][$index['column_name']]['data_index'] = $index['data_index'];
        }
    }

    echo 
    '<pre>';
    print_r($table_array);
    print_r($index_array
    Wenn ich das ganze nun ausführe, bekomme ich folgende Fehlermeldung:
    MDB2 Error: no such table
    [SELECT LOWER(table_name) as table_name, LOWER(column_name) as column_name, LOWER(index_name) as index_name, data_index FROM dba_indexes WHERE table_name='CATEGORIES']

    _execute: [Error message: could not execute statement] [Last executed query: SELECT LOWER(table_name) as table_name, LOWER(column_name) as column_name, LOWER(index_name) as index_name, data_index FROM dba_indexes WHERE table_name='CATEGORIES'] [Native code: 942] [Native message: ORA-00942: table or view does not exist]



    Weiß vll einer von euch wie ich die Indizes auslesen kann?

  • #2
    Hi,

    dba_indexes ist eine View, die nicht jeder User lesen darf.
    Nachdem Du vorher user_tables gelesen hast, solltest Du jetzt auch die user_indexes verwenden.

    Dim
    Zitat Tom Kyte:
    I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

    Comment


    • #3
      Hallo, also ich habe das Script jetzt mal in ne eigene Datei gelagert.

      PHP Code:
      $db->queryStmt('SELECT table_name FROM USER_INDEXES');

      $index_array = array();

      while (
      $row $db->fetchRow())
      {
          if(
      strpos($row['table_name'],'$'))
              continue;

          

          
      $db3->queryStmt('SELECT ' 
                  
      'LOWER(table_name) as table_name, ' .
                  
      'LOWER(column_name) as column_name, ' .
                  
      'LOWER(index_name) as index_name, ' .
                  
      'index_type ' .
                  
      'FROM dba_indexes ' .
                  
      'WHERE table_name=\'' $row['table_name'] . '\'');

          while(
      $index $db3->fetchRow())
          {
              
      $index_array[$index['table_name']][$index['column_name']]['index_name'] = $index['index_name'];
              
      $index_array[$index['table_name']][$index['column_name']]['index_type'] = $index['index_type'];
          }
      }

      echo 
      '<pre>';
      print_r($index_array
      Der Code sieht nun so aus!

      Wenn ich es ausführe kommt es nun zur folgender Fehlermeldung:

      MDB2 Error: no such table
      [SELECT LOWER(table_name) as table_name, LOWER(column_name) as column_name, LOWER(index_name) as index_name, index_type FROM dba_indexes WHERE table_name='KNOWLEDGE']

      _execute: [Error message: could not execute statement] [Last executed query: SELECT LOWER(table_name) as table_name, LOWER(column_name) as column_name, LOWER(index_name) as index_name, index_type FROM dba_indexes WHERE table_name='KNOWLEDGE'] [Native code: 942] [Native message: ORA-00942: table or view does not exist]

      Comment


      • #4
        Originally posted by Pillemon View Post

        Wenn ich es ausführe kommt es nun zur folgender Fehlermeldung:

        MDB2 Error: no such table
        [SELECT LOWER(table_name) as table_name, LOWER(column_name) as column_name, LOWER(index_name) as index_name, index_type FROM dba_indexes WHERE table_name='KNOWLEDGE']

        _execute: [Error message: could not execute statement] [Last executed query: SELECT LOWER(table_name) as table_name, LOWER(column_name) as column_name, LOWER(index_name) as index_name, index_type FROM dba_indexes WHERE table_name='KNOWLEDGE'] [Native code: 942] [Native message: ORA-00942: table or view does not exist]
        HI,

        Eben, wie dir Dim weiter oben schon geantwortet hatte :

        du musst user_indexes anstelle dba_indexes verwenden, da du vermutlich auf letztere keine Berechtigund hast...

        Hier :

        Code:
         $db3->queryStmt('SELECT ' .  
                    'LOWER(table_name) as table_name, ' . 
                    'LOWER(column_name) as column_name, ' . 
                    'LOWER(index_name) as index_name, ' . 
                    'index_type ' . 
           ---->>>>>>>         'FROM dba_indexes ' . 
                    'WHERE table_name=\'' . $row['table_name'] . '\'');
        Gruss

        Comment


        • #5
          @dbwizard

          Fettes DANKE!!!

          Noch eine frage, habe jetzt den index_name und index_type ausgelsen. Ist ja schön und gut

          Ich hab das ganze für MySQL auch gemacht, da habe ich als ausgabe welches Feld den Index hat und was da rein kommt wie geht das in Oracle?

          Comment


          • #6
            Originally posted by Pillemon View Post
            @dbwizard

            Fettes DANKE!!!

            Noch eine frage, habe jetzt den index_name und index_type ausgelsen. Ist ja schön und gut

            Ich hab das ganze für MySQL auch gemacht, da habe ich als ausgabe welches Feld den Index hat und was da rein kommt wie geht das in Oracle?
            Frage, Du möchtest wissen, auf welchem Feld ein Index liegt, habe ich dich da richtig verstanden ? Was meinst du mit "...und was da rein kommt ..." ?


            Das erstere würdest du so erhalten : (des aktuellen Users)
            select
            b.uniqueness, a.index_name, a.table_name, a.column_name
            from user_ind_columns a, user_indexes b
            where a.index_name=b.index_name
            order by a.table_name, a.index_name, a.column_position;

            Gruss

            Comment


            • #7
              Originally posted by dbwizard View Post
              Frage, Du möchtest wissen, auf welchem Feld ein Index liegt, habe ich dich da richtig verstanden ? Was meinst du mit "...und was da rein kommt ..." ?


              Das erstere würdest du so erhalten : (des aktuellen Users)


              Gruss

              Genau ich meinte einfach nur, wie ich erfahre auf welchem feld der index liegt!

              Im moment gib ich ja den index_name aus, da kommen dann aber im vergleich zu mysql andere werte raus z.b. bei einer tabelle habe ich in oracle als index_name [index_name] => pk_desc und bei mysql 'key' => 'description',
              'column' => 'description',

              würde auch hier gerne diese werte rausholen

              Comment


              • #8
                PHP Code:
                $db->queryStmt('SELECT table_name FROM USER_INDEXES');

                $index_array = array();

                while (
                $row $db->fetchRow())
                {
                    if(
                strpos($row['table_name'],'$'))
                        continue;

                    

                    
                $db3->queryStmt('SELECT ' 
                            
                'LOWER(table_name) as table_name, ' .
                            
                'LOWER(index_name) as index_name, ' .
                            
                'LOWER(column_name) as column_name, ' 
                            
                'uniqueness ' .
                            
                'FROM user_ind_columns, user_indexes ' .
                            
                'WHERE table_name=\'' $row['table_name'] . '\'');

                    while(
                $index $db3->fetchRow())
                    {
                        
                $index_array[$index['table_name']][$index['column_name']]['index_name'] = $index['index_name'];
                        
                $index_array[$index['table_name']][$index['column_name']]['uniqueness'] = $index['uniqueness'];
                    }
                }

                echo 
                '<pre>';
                print_r($index_array
                Ist das so richtig ?

                Ich bekomm da ne Fehlermeldung, was ist falsch?

                Comment


                • #9
                  Originally posted by Pillemon View Post
                  ...Ist das so richtig ?

                  Ich bekomm da ne Fehlermeldung, was ist falsch?
                  Was falsch ist!? Die Frage und das Forum!
                  "ne Fehlermeldung" kann alles mögliche sein - Du solltest also schon schreiben WELCHE Fehlermeldung und am besten den Text der Fehlermeldung posten. Und dann gibt es für PHP-Fragen ein eigenes Forum.

                  Die technischen Oracle-Fragen wurden dir ja beantwortet.

                  Gruß Falk
                  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


                  • #10
                    Also ich habe das Array jetzt erst mal so ausgelesen wie es geklappt hat, jetzt möchte ich beide Scripte zusammen führen, das die Daten der Felder sowie der Index gelesen wird. Und das ganze am Ende verglichen wird mit der vorliegenden Datei und dem Aktuellen Stand einer DB

                    PHP Code:
                    include '../common.php';
                    include 
                    'oracle_test_array.php';
                    include 
                    'oracle_test_indexes.php';

                    function 
                    array_key_exists_r($needle$haystack)
                    {
                        
                    $result array_key_exists($needle$haystack);
                        if (
                    $result) return $result;
                        foreach (
                    $haystack as $v) {
                            if (
                    is_array($v)) {
                                
                    $result array_key_exists_r($needle$v);
                            }
                            if (
                    $result) return $result;
                        }
                        return 
                    $result;
                    }


                    $table_array = array();
                    $table_blank_array = array();
                    $index_array = array();

                    $db->queryStmt('SELECT table_name FROM USER_TABLES');

                    while (
                    $row $db->fetchRow())
                    {
                        if(
                    strpos($row['table_name'],'$'))
                            continue;

                        
                    $db2->queryStmt('SELECT ' .
                                
                    'LOWER(table_name) as table_name, ' .
                                
                    'LOWER(column_name) as column_name, ' .
                                
                    'LOWER(data_type) as data_type, ' .
                                
                    'data_length, ' .
                                
                    'data_default, ' .
                                
                    'nullable ' .
                                
                    'FROM user_tab_columns ' .
                                
                    'WHERE table_name=\'' $row['table_name'] . '\'');
                                
                        while (
                    $col $db2->fetchRow())
                        {    
                            
                    $table_array[$col['table_name']][$col['column_name']]['data_type'] = $col['data_type'];
                            
                    $table_array[$col['table_name']][$col['column_name']]['data_length'] = $col['data_length'];
                            
                    $table_array[$col['table_name']][$col['column_name']]['data_default'] = $col['data_default'];
                            
                    $table_array[$col['table_name']][$col['column_name']]['nullable'] = $col['nullable'];
                            
                        }
                    }

                    $db1->queryStmt('SELECT table_name FROM USER_INDEXES');


                    while (
                    $row $db1->fetchRow())
                    {
                        if(
                    strpos($row['table_name'],'$'))
                            continue;

                        

                        
                    $db3->queryStmt('SELECT ' 
                                
                    'LOWER(table_name) as table_name, ' .
                                
                    'LOWER(index_name) as index_name, ' .
                                
                    'index_type ' .
                                
                    'FROM user_indexes ' .
                                
                    'WHERE table_name=\'' $row['table_name'] . '\'');

                        while(
                    $index $db3->fetchRow())
                        {
                            
                    $index_array[$index['table_name']]['index_name'] = $index['index_name'];
                            
                    $index_array[$index['table_name']]['index_type'] = $index['index_type'];
                        }
                    }

                    $array_for_existing_units = array();
                    $array_for_missing_units = array();
                    $array_for_missing_indexes = array();


                    foreach (
                    $oracle_test_array as $table => $column
                    {
                        if(
                    array_key_exists($table$table_array)) // array_key_exists($table, $table_array)
                            
                    $array_for_existing_units[] = "Tabelle: <b>" $table "</b> existiert";
                        else
                            
                    $array_for_missing_units[] = "Tabelle: <b>" $table "</b> existiert nicht";
                        
                        if (
                    is_array($column))
                        {
                            foreach (
                    $column as $columnname => $attributes)
                            {
                                if(
                    array_key_exists_r($columnname$table_array)) // array_key_exists_r($columnname, $table_array)
                                    
                    $array_for_existing_units[] = "Feld: <b>" $columnname "</b> in Tabelle <br>" $table "</b> existiert";    
                                else
                                {
                                    
                    $array_for_missing_units[] = "Feld: <b>" $columnname "</b> existiert nicht in  Tabelle: <b>" $table"</b>";
                                    continue;
                                }

                                
                                if (
                    is_array($attributes))
                                {
                                    foreach (
                    $attributes as $attrib_name => $attrib_value)
                                    {    
                                        if(
                    array_key_exists_r($attrib_name$table_array)) 
                                            
                    $array_for_existing_units[] = "Attribut: <b>" $attrib_name "</b> des Feld <b>" $columnname "</b> existiert";
                                        else
                                            
                    $array_for_missing_units[] = "Attribut: <b>" $attrib_name "</b> des Feld <b>" $columnname "</b> existiert nicht in <b>" $table"</b>";
                                        
                                        
                                        if(
                    $attrib_value != $table_array[$table][$columnname][$attrib_name])
                                        {
                                            
                    $array_for_missing_units[] = "Der Wert <b>" $attrib_value "</b> des Attribut <b>" $attrib_name "</b> (Tabelle: " $table ")  entspricht nicht dem aktuellen Wert in der DB. "
                                                                                                        
                    "<br> Möglicherweise Resultat eines geänderten Feld-Name.";
                                        }    
                                    }                
                                }
                            }    
                        }
                    }

                    foreach(
                    $oracle_test_indexes as $table => $value)
                    {
                        if(
                    is_array($value))
                        {
                            foreach(
                    $value as $key => $value)
                            {
                                if(
                    array_key_exists_r($key$index_array))
                                {
                                    if(
                    $index_array[$table][$key] == $value
                                        continue;
                                    else 
                                    {
                                        
                    $array_for_missing_indexes[] = "<b>Fehler</b> - Der Wert für: " $key "( = " $index_array[$table][$key] . ")" 
                                                                    
                    .  "weicht vom erwarteten Wert in oracle_test_indexes ab: " $oracle_test_indexes[$table][$key];
                                    }
                                }
                            }
                        }
                    }

                    $count_of_array_for_missing_units count($array_for_missing_units);
                    $count_of_array_for_missing_indexes count($array_for_missing_indexes);

                    if(
                    $count_of_array_for_missing_units >= 1)
                    {
                        echo 
                    "Hier stimmt etwas nicht: <br>";
                        
                        foreach (
                    $array_for_missing_units as $key =>$value)
                        {
                            echo 
                    $value."<br>";
                        }    
                    }

                    if(
                    $count_of_array_for_missing_indexes >= 1)
                    {
                        echo 
                    "Hier stimmt etwas nicht: <br>";
                        
                        foreach (
                    $array_for_missing_indexes as $key => $value)
                        {
                            echo 
                    $value."<br>";
                        }    

                    Das ganze sieht nun so aus....

                    Jedoch klappt es nicht hat von euch wer ne Idee wie ich es zum Laufen bekomme?

                    Comment


                    • #11
                      Jedoch klappt es nicht hat von euch wer ne Idee wie ich es zum Laufen bekomme?
                      Ja und was sollen wir jetzt mit dieser Fehlermeldung anfangen? Ich weiß zwar nicht von welcher Datei du jetzt redest und was Du genau vergleichen möchtest, aber vielleicht solltest Du das im PHP Forum posten?

                      Dim
                      Zitat Tom Kyte:
                      I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

                      Comment


                      • #12
                        Hab mal nen Thread im PHP Bereich erstellt

                        Trotzdem nochmal Danke für Deine Hilfe

                        Comment

                        Working...
                        X