AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Oracle & Dyn Cursor & Bulk SQL
Thema durchsuchen
Ansicht
Themen-Optionen

Oracle & Dyn Cursor & Bulk SQL

Ein Thema von Robert_G · begonnen am 25. Aug 2004 · letzter Beitrag vom 25. Aug 2004
 
Robert_G
(Gast)

n/a Beiträge
 
#1

Oracle & Dyn Cursor & Bulk SQL

  Alt 25. Aug 2004, 12:32
Moin

Gegeben sei folgendes Problem: (bitte nicht über den tieferen Sinn von Code oder Bennenungen grübeln -> sind nur Beispiele )

In mehreren Usern gibt es mehrere Tabellen, die die Spalten a, b & c enthalten.
Diese 3 Spalten möchte ich so schnell wie möglich in PL/SQL-Tabellen einlessen -> bulk collect.
AABEER...
Die Tabellen/User heißen natürlich nicht gleich.


Ich habe eben die 3 möglichen Varianten ausprobiert, die mir eingefallen sind (bisher konnte ich die Kombi Bulk SQL & dyn. SQL gut umschiffen )
  • Versuch1: Weak Typed Dyn. Cursor
    SQL-Code:
    create or replace procedure TestDynCur1
    (
      pOwner in varchar2
     ,pTable in varchar2
    ) is
      -- constants
      Lf char(1) := Chr(10);

      -- cursors
      type WeakTypedDynCur is ref cursor;
      DynCur WeakTypedDynCur;

      -- Bulk tables
      type ShortChrTab is table of varchar2(20);
      a ShortChrTab;
      b ShortChrTab;
      c ShortChrTab;
    begin

      open DynCur for
       'SELECT a' || Lf ||
       ' ,b' || Lf ||
       ' ,c' || Lf ||
       'FROM ' || pOwner || '.' || pTable;

      fetch DynCur bulk collect
        INTO a, b, c;

      close DynCur;
    end;
    Der Kompiler meckert nix, aabeer...

    Zitat von Oracle:
    ORA-01001: invalid cursor, line 26
  • Versuch2: Strong Typed Dyn. Cursor
    SQL-Code:
    create or replace procedure TestDynCur2
    (
      pOwner in varchar2
     ,pTable in varchar2
    ) is
      -- constants
      Lf char(1) := Chr(10);

      --"Alibi" cursor ;)
      cursor AlibiCur is
        SELECT a
              ,b
              ,c
        FROM a;

      -- cursors
      type StrongTypedDynCur is ref cursor return AlibiCur%rowtype;
      DynCur StrongTypedDynCur;

      -- Bulk tables
      type ShortChrTab is table of varchar2(20);
      a ShortChrTab;
      b ShortChrTab;
      c ShortChrTab;
    begin

      open DynCur for
       'SELECT a' || Lf ||
       ' ,b' || Lf ||
       ' ,c' || Lf ||
       'FROM ' || pOwner || '.' || pTable;

      fetch DynCur bulk collect
        INTO a, b, c;

      close DynCur;
    end;

    Zitat von Oracle:
    Compilation errors for PROCEDURE ROBERTG.TESTDYNCUR2

    Error: PLS-00455: cursor 'DYNCUR' cannot be used in dynamic SQL OPEN statement
    Line: 27
    Text: open DynCur for
  • Versuch 3: komplett dynamischer Block
    SQL-Code:
    create or replace procedure TestDynCur3
    (
      pOwner in varchar2
     ,pTable in varchar2
    ) is
      -- constants
      Lf char(1) := Chr(10);

      -- cursors
      -- keine lokalen cursor mehr nötig

      -- Bulk tables
      /*musste durch einen SQL Type ersetzt werden
        type ShortChrTab is table of varchar2(20); */

      a ShortChrTab;
      b ShortChrTab;
      c ShortChrTab;
    begin
      execute immediate
       'declare' || Lf ||
       ' cursor getVals is' || Lf ||
       ' SELECT a' || Lf ||
       ' ,b' || Lf ||
       ' ,c' || Lf ||
       ' FROM ' || pOwner || '.' || pTable||';' || Lf ||
       'begin' || Lf ||
       ' open getVals;' || Lf ||
       '' || Lf ||
       ' fetch getVals bulk collect' || Lf ||
       ' INTO :a, :b, :c;' || Lf ||
       ' close getVals;' || Lf ||
       'end;'
        Using out a, out b, out c;

    end;
    Das funktioniert jetzt, aber es sieht irgendwie aus, wie der Code von einem totalen Oracle-Newbie

Wozu der Thread?
Ich hoffe jemand von euch wird mir gleich sagen "Mensch, warum machst du das denn so! Das geht doch ... viel einfacher."

Achso: Das ganze muss leider kompatibel ab Ora 8.174 sein
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:47 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz