lina-: PLSQL Datenbankname durch Variable ersetzen

moin liebes Forum :)

ich lebe noch *G* und mich plagt ein Problem... ich bin absolut neu auf dem Gebiet plsql und bin dabei mich einzuarbeiten. Leider lassen meine sql-Kenntnisse generell zu wünschen übrig :/

Folgendes Problem:
ich möchte gern den Tablespace für eine Select-Anweisung dynamisch anpassen. Geht das irgendwie?

liebe Grüße aus Berlin
lina-

--
Dinge aus dem linaland
Self-Code: ie:% fl:( br:^ va:) ls:/ fo:| rl:( ss:) de:] js:| mo:)
  1. Folgendes Problem:
    ich möchte gern den Tablespace für eine Select-Anweisung dynamisch anpassen. Geht das irgendwie?

    Du könntest eine stored procedure schreiben und den Tabellennamen als Parameter mitgeben.
    Wobei ich:

    • nicht weiss, ob Du mit "tablespace" auch Tabelle meinst
    • ob das irgendeinen Sinn macht
    • ob das irgendeinen Sinn machen kann
    1. Hi,

      "Tablespaces" in Oracle sind mehr oder weniger mit "Datenbanken" im SQL Server zu vergleichen (von der Hierarchiestufe her).

      Gruss, Frank

      1. "Tablespaces" in Oracle sind mehr oder weniger mit "Datenbanken" im SQL Server zu vergleichen (von der Hierarchiestufe her).

        http://de.wikipedia.org/wiki/Tablespace - bei MS heisst dass glaube ich Dateigruppe oder Partition oder so.

        Für ein besonderes SELECT sollte man aber da wohl eher nichts anpassen...

        1. ein bisschen komplexer ist es schon ...

          In MS SQL ist die Hierarchie für gewöhnlich

          Server
           Datenbank
            (Schema) / Benutzer
              Objekt (Tabelle, View)

          Eine Datenbank kann aus mehreren Dateigruppen (mit mehreren einzelnen Daten und Log Dateien) bestehen.

          Für Tabellen selbst kann man mittels "Partitionierung" im MS SQL angeben, ob die Daten auf mehrere Datenbankdateigruppen verteilt werden sollen.

          In Oracle (zmd meiner Meinung und Kenntnis von 8i nach) gibt es kein Mehrere-Datenbanken Konzept. Es gibt die Oracle Instanz. Und darin können in Schemas / Tablespaces Tabellen verteilt werden. Man kann identische Tabellen in verschiedenen Tablespaces haben.

          Wie sich das dann noch mit der Partitionierung von Tabellen verhält, entzieht sich leider meiner momentanen Kenntnis.

          Die Oracle Freaks hier dürfen mich gern berichtigen. Habe seit 8i kein weiteres Oracle benutzt und auch das ist schon ne weile her. :)

          Cheers,
          Frank

          1. yo,

            ein tablespace ist eine von vier logischen abstrahierungsebenen. auch können in unterschiedlichen tablespaces nicht identische tabellen gehalten werden, da sie ja den gleichen objektnamen hätten.

            eine instanz unter oracle ist keine datenbank, sondern meint die prozesse und die speicherstrukturen. insofern fährt man eigentlich auch keine datenbank hoch, sondern die instance, im sonderfall sogar die instancen. die datenbank selbst wird dann gemounted.

            Ein Schemta enthält kein Tablespace, sondern hat was mit den Benutzern der Datenbank zu tun. jeder Benutzer hat sein eigenes Schema, sprich lege ich einen neuen Benutzer an, dann wird dieser in aller regel seine objekte in seinem Schemata anlegen, sofern nichts anderes angegeben wird.

            Ilja

  2. yo,

    ich möchte gern den Tablespace für eine Select-Anweisung dynamisch anpassen. Geht das irgendwie?

    was genau willst du den anpassen, bzw. was genau hast du vor ?

    Ilja

    1. moin :)

      erstmal danke für die Antworten... hat mich mit meinen spärlichen Kenntnissen leider nicht viel weiter gebracht.
      Was ich hier klarstellen kann: mit tablespace meine ich das was in MySQL die Datenbanken sind... und eigentlich bin ich der Meinung mit dieser Terminologie richtig zu liegen. Man möge mich berichtigen.

      Vielleich sollte ich noch mal genauer beschreiben was ich eigentlich machen will (hätt ich ja auch gleich machen können *G*)

      Ich habe ein einfaches select:

      select project_name from admin; (gibt mir alle vorhandenen Projekte zurück. Das besondere ist, dass für jedes Projekt ein tablespace existiert. Ein Projektname zum Beispiel lautet "Test")

      ein weiteres einfaches select gibt mir nun die Klassen-ID für Kommentare zurück:

      select class_id from Test.classes where class_name='Comment' (Test ist der tabelspace und classes die Tabelle)

      Ich möchte die ID aber nicht nur für dieses eine Projekt sondern für alle Projekte ausgeben lassen.

      Ich habe mittlerweile gelernt über ein loop (mit der Laufvariable i z.B.) durch alle Projektnamen zu wandern. Das sieht dann so aus:

      for i in (select project_name from admin;)
      loop
         dbms_output.put_line(i.project_name);
      end loop;

      Leider kann ich innerhalb des Loops nicht einfach sagen: select class_id from i.project_name.classes where class_id='Comment'.

      Genau hier stellt sich mir die Frage, kann ich statt "Test" als tabelspace das Ergebnis des ersten selects in einer Schleife irgendwie benutzen?

      Hoffe ich konnte mein Problem halbwegs veständlich erklären...

      liebe Grüße aus Berlin
      lina-

      --
      Dinge aus dem linaland
      Self-Code: ie:% fl:( br:^ va:) ls:/ fo:| rl:( ss:) de:] js:| mo:)
      1. yo,

        Was ich hier klarstellen kann: mit tablespace meine ich das was in MySQL die Datenbanken sind... und eigentlich bin ich der Meinung mit

        dieser Terminologie richtig zu liegen. Man möge mich berichtigen.

        dein wille soll geschehen, was du meinst sind keine tablespaces sondern schemata. jedem benutzer ist ein eigenes schema zugeordnet, dass man und die punktnotierung ansprechen kann (schemaname.tabellenname).

        Das besondere ist, dass für jedes Projekt ein tablespace existiert. Ein Projektname zum Beispiel lautet "Test")

        wie oben beschrieben, das sind Schemata, sprich du hast einen benutzer mit den namen Test, dessen Schemaobjekte über den gleichen namen angesprochen werden können. was man zusätzlich dabei beachten muss, dass man entsprechende berechtigungen hat, wenn man objekte in einem anderem Schema lesen oder verändern will.

        Leider kann ich innerhalb des Loops nicht einfach sagen: select class_id from i.project_name.classes where class_id='Comment'.

        was du machen willst ist dynamisches PL/SQL. google doch mal ein wenig danach, ob du was brauchbares findest, wenn nicht melde dich einfach wieder hier.

        Ilja

      2. select class_id from Test.classes where class_name='Comment'

        for i in (select project_name from admin;)
        loop
           dbms_output.put_line(i.project_name);
        end loop;

        Hoffe ich konnte mein Problem halbwegs veständlich erklären...

        Jaja, was da so alles rauskommt.

        Aber zum Thema:

        • SQL ist mengenorientiert
        • mit SELECT holst Du Dir eine Datensatzmenge
        • diese kann auch nur aus einem Element bestehen, gerade dann wenn Du die WHERE-Klausel dementsprechend füllst
        • der SQL-sprechende Datenserver liefert die Datensatzmengen an Deine Progrämmchen
        • diese wiederum unterstützen den Empfang der Datensatzmengen und die Speicherung bspw. in Arrays
        • Arrays können "durchlaufen" werden (sowas könnte der o.g. Code leisten)

        Also, versuche genau zu verstehen, was der Datenserver leistet und was Deine Progrämmchen leisten. Wichtig ist, dass Du die Konzepte verstehst. Was Du KEINESFALLS machen solltest ist bspw. alle Datensätze einer Tabelle vom Server zu holen und dann in Deinem Programm einen einzelnen Satz suchen und auswerrten.
        Traffic minimieren also.

        1. Ach so, "PLSQL Datenbankname durch Variable ersetzen" lesen Wir da noch gerade, also dazu was:

          • SQL ist eine Sprache
          • Sprache wird gesprochen und besteht aus Sätzen bzw. einzelnen Anweisungen
          • einzelne Anweisungen sind Zeichenketten
          • zeichenketten können manipuliert werden
          • Also die SQL-Anweisung in Deinem Progrämmchen nicht "hart", sondern als Variable kodieren, so dass die DB gewechselt werden kann zur Ausführungszeit des Codes