Skip to Main Content

 

Auswahl  

Komplett Übersicht aller Oracle Tipps

Linux Shell Skripten in Oracle Tabellen speichern 

Oracle
DBA:PL/SQL
RDBMS 21.1:RDBMS 23.1
23.12.24 (MP)
23.12.24(MP)
Shell Script, Linux,

Passende Schulungen zum Thema

Wollten Sie immer schon mal zu Dokumentationszwecken ihre Shell Skripten in Oracle Tabellen speichern, das Ganze auch noch Clientseitig?

Das Problem sind die vielen Zeilenumbrüche in den Shell Skript Dateien, deswegen wandeln wir die Datei in BASE64 um. 
Da die Dateien länger als 32767 Zeichen lang werden können und damit die Maximallänge von VARCHAR2 in Tabellen von 4k (bzw. 32K ab 12.1 bei spezieller Einrichtung) übersteigen können,
wandeln wir es sicherheitshalber in CLOB um.
Leider hat Oracle eine solche Funktion nicht, dewegen schreiben wir sie uns selbst.

1. Funktion anlegen:

CREATE OR REPLACE FUNCTION Decode_Base64(
       p_base64 IN CLOB
    ) RETURN CLOB AS
       v_blob       BLOB;
       v_decoded    CLOB;
       v_length     INT;
       v_warning    INT;
       v_offset     INT:= 1;
       v_context    INT:= dbms_lob.default_lang_ctx;
    BEGIN
       -- Convert the Base64 CLOB into a BLOB
       DBMS_LOB.CREATETEMPORARY(v_blob, TRUE);
       DBMS_LOB.WRITE(v_blob, DBMS_LOB.GETLENGTH(p_base64), 1, UTL_RAW.CAST_TO_RAW(p_base64));
       -- Decode the Base64 BLOB
       v_blob := UTL_ENCODE.BASE64_DECODE(v_blob);
       -- Determine the length of the decoded text
       v_length := DBMS_LOB.GETLENGTH(v_blob);
       -- Convert the BLOB to CLOB
       DBMS_LOB.CREATETEMPORARY(v_decoded, TRUE);
       DBMS_LOB.CONVERTTOCLOB(
           DEST_LOB     => v_decoded,
           SRC_BLOB     => v_blob,
           AMOUNT       => v_length,
           DEST_OFFSET  => v_offset,
           SRC_OFFSET   => v_offset,
           blob_csid    => dbms_lob.default_csid,
           lang_context => v_context,
           warning      => v_warning
       );
        
            -- Free resources
       DBMS_LOB.FREETEMPORARY(v_blob);
       RETURN v_decoded;
    END Decode_Base64;
    /

2. Ziel-Tabelle erstellen:

CREATE TABLE script_table (
    id int 
    GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, 
    content CLOB);

3. Auf Shell-Ebene gewünschte Datei (hier: install.sh) in Base64 codieren und in Variable B64 speichern:

export B64=`echo -n \`cat install.sh\` | base64`

4. OS-Variable in Oracle Tabelle eintragen und wieder aus Base64 in CLOB Text konvertieren:

    sqlplus scott/TIGER@172.24.114.237:1522/pdb1  <<EOF
    set echo off termout off 
    DECLARE
     script_content CLOB := q'^${B64}^';
    BEGIN
     INSERT INTO script_table(content)VALUES(decode_base64(script_content));
     COMMIT;
    END;
    /
    EXIT;
    EOF

So nun steht Ihrer Versionsverwaltung oder dem Audit nichts mehr im Wege…
Weitere tolle Tipps erhalten Sie in einem unserer 50 Oracle und Postgres Kurse. Wir freuen uns auf Sie …