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 …