Announcement

Collapse
No announcement yet.

clob mit empty_clob()

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

  • clob mit empty_clob()

    Hallo zusammen,

    ich versuche über eine Procedure eine lange STRING (über 4000 Zeichen) in eine Tabellenspalte zu schreiben.

    Das String wird über eine Variable eingelesen.
    Code:
    create or replace procedure p_langer_text
      (P_IDX IN NUMBER, P_TXT IN VARCHAR2)
       AS
       
       v_ErrorText log_table.message%TYPE;
       v_ErrorCode log_table.code%TYPE;
       g_clob CLOB;
    BEGIN
       INSERT INTO langer_text2 VALUES (P_IDX, empty_clob())RETURNING text INTO g_clob;
       dbms_lob.write( g_clob,length(P_TXT), 1, P_TXT);
       COMMIT;
       EXCEPTION 
         WHEN OTHERS THEN
                v_ErrorCode := SQLCODE;
                v_ErrorText := SUBSTR(SQLERRM, 1, 200);
                INSERT INTO log_table (code, message, info) Values(v_ErrorCode, v_ErrorText, 'Another error occurred'); 
       COMMIT; 
    END p_langer_text;
    Die Procedur funktioniert, aber leider liest nicht alle meine eingegebenen Zeichen ein. Ich vermute dass bei 4000 Zeichen stopt.
    Hat jemand eine Idee was falsch sein sollte?

    mfg. f_mal
    Zuletzt editiert von f_mal; 02.02.2009, 13:18. Reason: nicht vollständig

  • #2
    Und wo ist jetzt die Frage?

    CLOB bei Oracle ist teilweise ein Glückspiel, abhängig von Version und Datenbank-Characterset.

    Comment


    • #3
      hallo ... die Frage sieht Du jetzt.
      mein Beitrag war leider noch nicht fertig.

      Comment


      • #4
        Vermutlich wird P_TXT als VARCHAR2 nur max. 4000 Zeichen fassen.

        Comment


        • #5
          CLOB ist kein Glücksspiel, man muss nur wissen wie man LOBs verwendet
          Das Problem das f_mal wohl hat, ist das unter PL/SQL VARCHAR2 Variablen maximal 32K groß werden können.

          Die Aussage
          Ich vermute dass bei 4000 Zeichen stopt.
          müsste mal verifiziert werden ob es nicht vielleicht 32K sind. Ansonsten noch die Frage, wie die Procedur denn ihre Daten bekommt. Wird sie über SQL aufgerufen (da hätten wir dann die 4000 Zeichen Grenze) oder über eine Programmiersprache?

          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


          • #6
            hi ... danke für eure antworten.
            die Procedure wird in ColdFusion aufgerufen.
            der Variable P_TXT werden die Werte zugewiesen.
            z.B. so
            Code:
            declare
              -- Parameter declaration
              P_IDX NUMBER;
              P_TXT VARCHAR2(2000);
            
            begin
              -- Please customize initialization
              P_IDX := 100;
              P_TXT := 'xxxxxxxxzzzzzzzzzfdgsdgsd ....';
            
              -- Call the procedure/function
              P_LANGER_TEXT
              ( 
                P_IDX, P_TXT
              );
            
              -- Print out the results
            end;
            gruß f_mal

            Comment


            • #7
              P_TXT VARCHAR2(2000);
              Jetzt bin ich etwas iritiert. Länger als diese Deklaration von p_txt kann dein clob auch nicht werden.
              Daher nochmal die Frage: Wie lang sind die einzubauenden Daten und wie lang sind die LOBs dann in der Datenbank (select dbms_lob.getlength(lobspalte) from tabelle)

              Dann ist mir noch was aufgefallen:
              Code:
              EXCEPTION 
                   WHEN OTHERS THEN
                          v_ErrorCode := SQLCODE;
                          v_ErrorText := SUBSTR(SQLERRM, 1, 200);
                          INSERT INTO log_table (code, message, info) Values(v_ErrorCode, v_ErrorText, 'Another error occurred'); 
                 COMMIT;
              1. Egal welcher Fehler auftritt, deine Procedure läuft fehlerfrei durch.
              2. Im Fehlerfall committest Du deine Session. D.H. tritt beim Einfügen des CLOBs ein Fehler auf, hast Du einen leeren Satz in der DB stehen. Hier würde ich eine zentrale Loggingprocedure empfehlen die ihre Änderungen innerhalb einer autonomen Transaktion macht.
              3. Warum gibst Du nur die ersten 200 Zeichen der Meldung aus? Des weiteren würde ich mir auch immer einen Stacktrace mit abspeichern. Die Funktion DBMS_UTILITY.FORMAT_ERROR_BACKTRACE liefert dir einen solchen.

              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


              • #8
                es sind in der Regel über 5.000 Zeichen.
                mit der Exception hast Du Recht. Da muss ich noch abändern.

                Comment


                • #9
                  es sind in der Regel über 5.000 Zeichen.
                  5000 Zeichen was? Die eingelesen werden sollen? Die in der DB stehen? Du machst es einem nicht leicht. Und wie sieht die Einbindung in CF aus? Ich kenn das nicht, aber ein anonymer PL/SQL Block wird es ja wohl nicht sein oder?

                  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


                  • #10
                    sorry, also .. es sind über 5000 Zeichen die eingelesen werden sollen.
                    jetzt vergessen wir CF. Angenommen möchte ich das ganze über ein anonymer PL/SQL Block aufrufen. siehe oben.
                    wie muss ich meine CODE ändern?
                    wie gesagt...meine Vermutung: liegt vieleicht an die P_TXT IN VARCHAR2 Variable? ich hänge genau an diese Stelle.

                    ich versuche über eine Procedure eine lange STRING (über 4000 Zeichen) in eine Tabellenspalte zu schreiben.
                    f_mal

                    Comment


                    • #11
                      Eine VARCHAR2 Variable kann in PL/SQL maximal 2^15-1 Byte lang sein (=32767 Byte).

                      Wenn Du 5000 Zeichen in deinem CLOB schreiben möchtest, dann muss die Variable natürlich auch mindestens so groß sein. Möchtest Du mehr als 32K schreiben, dann musst Du die Daten entweder per Datei laden (auch dazu hat dbms_lob entsprechende Proceduren) oder aber Du musst eine 3G Programmiersprache wie Java, C/C++, VB etc. verwenden.

                      Dein Code an sich sollte richtig sein. Mir fällt jetzt nichts auf.

                      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
                        alles klar. danke für deine hilfe.

                        mfg. f_mal

                        Comment

                        Working...
                        X