Announcement

Collapse
No announcement yet.

Truncate Befehl geht nicht in stored Procedures

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

  • Truncate Befehl geht nicht in stored Procedures

    Hi,<BR>
    freut mich dass Du reinschaust.<BR>
    <PRE>Ich versteh das nicht, ich habe eine Oracle 8-er Version ,ging allerdings vorher mit der 7-er Version auch nicht.
    TRUNCATE TABLE mytable; geht in SQL einwandfrei, der Befehl lasst sich einfach nicht in stored Procedures und auch nicht in Triggern verwenden.
    Kann mir da jemand helfen - vielleicht mach ich auch was falsch.

    Danke im vorraus
    Roland</PRE>

  • #2
    Hallo Roland,

    mmhhh, genau weiss ich es auch nicht, kannst Du irgendeine Exeption abfangen? Ich hatte ein ähnliches Problem, da waren foreign keys auf der Tabelle. Was ich gemacht habe war dann ein delete from. Das hat problemlos geklappt, dauert aber etwas.

    MfG Steve

    Comment


    • #3
      Hallo Steven,<BR><PRE>
      Danke erst mal für Deine Antwort
      Vielleicht zur Erklärung:
      Ich erstelle aus mehreren Oracle Tabellen, die sehr wohl mit
      foreign Keys verbunden sind Datensätze. Diese Arbeitsdatensätze
      schreibe ich in eine sagen wir temporäre Tabelle mit Session Id.
      Wir sind ein technisches Vermessungsunternehmen, diese Tabelle wird
      dazu benutzt, um den Aussendienstvermessern am Jahresanfang - das genügt -
      einmal diese Tabelle auf einen Laptop für MS-Access zur Verfügung zu stellen.
      Bevor nun dieser jährliche Zusammenstellung läuft wollte ich die Tabelle mit truncate löschen
      - sonst gibts Probleme mit Rollbacksegmenten will ich aber nicht
      mehr erhöhen, Es sind viele Daten! Bei einem normalen delete ohne
      where laufen Die RBS auf alle Fälle über, bei einem reinem Select-Cursor in While schleifen, ja was lösch ich denn da
      - where Bedingung ?! und bei Cursor for Update hätt ich zwar current
      of row aber der sperrt auch die ganze tabelle und RBS laufen über!
      Wie gesagt ich hab`ne Lösung! Aber Truncate wäre halt so einfach,
      da die einzelnen Sätze nicht in den RBS protokolliert werden.
      </PRE>
      Gruß Rolan

      Comment


      • #4
        Hallo Roland,

        wenn ich Dich richtig verstanden habe machst Du das nur einmal im Jahr. Dann sehe ich zwei Möglichkeiten. Entweder du passt Deine Rollbacksegmente an (ein grosses (privates ?)Rollbacksegment nur für diese Aktion)in einem Tablespace welches ungehindert extendieren kann, und verwendest dieses Segment exclusiv in Deinem Code. Das sehe ich allerdings als die schlechtere Möglichkeit an. Besser währe es die Constraints temporär abzuschalten. Mit "ALTER TABLE temptable DISABLING Constraintname". Du kannst auch ein "CASCADE" anfügen, dann werden alle anhängigen Constraint mit abgeschalten. Einschalten kannst Du diese wieder mit "ALTER TABLE temptable ENABLE constraintname". Guck bei der Gelegenheit mal die Oracle 8 Erweiterung "VALIDATE" (standardmässig ein enable Validate gesetzt)an wenn Du willst. Aber ich glaube die brauchst Du nicht, weil die Tabelle ja vollständig geleert werden soll. Nach dem Abschalten der Constraints müsstes Du meines Wissens nach ein Truncate machen können, aber "nichts genaues weiss man nicht" ;-)).

        Viel Glück

        MfG Steve

        Comment


        • #5
          <PRE>Hi Steven,
          alles klar,
          weshalb ich aber immer noch nicht weiss,
          warum der TRUNCATE - Befehl in Procedures nicht geht- nicht erkannt wird.
          Aber gut lass es damit bewenden
          und nochmals Dank für Deine schnelle und nette Hilfe
          Rolan

          Comment


          • #6
            Hallo Roland,

            doch noch ein kleiner Nachtrag ;-)). Du kannst kein Truncate auf eine Tabelle machen auf welcher Constraints mit referenzieller Integrität draufhängen. Diese müssen entweder abgeschaltet oder gedroppt werden. Weiterhin muss die tabelle entweder dem User gehören welcher das Truncate absetzt oder der User muss über das Privileg "DELETE ANY TABLE" verfügen. Es gibt noch die Prozedur plvdyn mit dem Befehl truncate. Genaueres unter http://www.adderpit.com/oreilly/oracle/advprog/ch19_04.htm#ch19-SECT-4.1.2

            Ich denke Das wird helfen.

            MfG Steve

            Comment


            • #7
              Hi - Es geht mit EXECUTE IMMEDIATE (Statement)<BR>
              Allerding serst ab 8.x.<BR>
              Bsp.<BR>
              Create Procedure TruncTable (Tablename IN VARCHAR2)<BR>
              as)BR>
              sql_stmt VARCHAR2(200);<BR>
              BEGIN<BR>
              sql_stmt := 'TRUNCATE TABLE ' || TableName ||';'<BR>
              EXECUTE IMMEDIATE sql_stmt;<BR>
              END;<BR>

              Gruss<BR>
              Matthia

              Comment


              • #8
                <PRE>Hi Steven,
                in meinem Kommentar NR.:2 glaub ich schon ruebergebracht
                zu haben, dass die erzeugte einmalige Tabelle, die ich vor dem jährlichen Wiederaufbau leeren will,
                keine referenziellen Integritaeten aufweist.

                ......an Matthias -
                Oracle orakelt manchmal ;-)) so gehts

                Besten dank an Euch beide
                Roland
                </PRE&gt

                Comment

                Working...
                X