Skip to content

Repository files navigation

sqlplus-checker

Statische Analyse von Oracle SQL-Skripten auf SQLPlus-Kompatibilität.

Viele Skripte funktionieren problemlos in SQL Developer oder Toad, scheitern aber beim Deployment über SQLPlus auf dem Linux-Server. Dieses Tool prüft Skripte rein statisch (ohne Datenbankverbindung) auf die häufigsten Fehlerquellen.


Installation

cd python-sqlplus-checker
uv sync
uv lock --upgrade

Mit uv run python main.py ausführbar.


Verwendung

sqlplus-checker <PFAD> [OPTIONEN]

Argumente

ArgumentBeschreibung
PFADDatei oder Verzeichnis — Verzeichnisse werden rekursiv durchsucht

Optionen

OptionKurzformBeschreibung
--ext EXT-e EXTKommagetrennte Dateiendungen (Standard: .sql,.pls,.pks,.pkb,.prc,.fnc,.trg,.vw,.tps,.tpb)
--no-warnings-WNur Fehler ausgeben, Warnungen unterdrücken
--summary-only-sNur die Zusammenfassung ausgeben, keine Einzelmeldungen

Exit-Codes

CodeBedeutung
0Keine Fehler gefunden (Warnungen möglich)
1Mindestens ein Fehler gefunden
2Ungültige Aufrufargumente

Beispiele

Einzelne Datei prüfen:

sqlplus-checker deploy.sql

Komplettes Verzeichnis rekursiv prüfen:

sqlplus-checker ./scripts/

Nur Fehler anzeigen (keine Warnungen), z. B. für CI/CD-Pipeline:

sqlplus-checker ./scripts/ --no-warnings

Nur die Zusammenfassung anzeigen:

sqlplus-checker ./scripts/ --summary-only

Andere Dateiendungen einschließen:

sqlplus-checker ./scripts/ --ext .sql,.ddl,.dml

In CI/CD-Pipelines (Exit-Code auswerten):

sqlplus-checker ./scripts/ --no-warnings
if [ $?-ne 0 ];thenecho"SQL-Prüfung fehlgeschlagen — Deployment abgebrochen"exit 1
fi

Geprüfte Regeln

Fehler (ERROR) — blockieren das Deployment

RegelBeschreibung
UTF-8-KodierungDatei muss gültiges UTF-8 ohne BOM sein
Windows-Zeilenenden (CRLF)SQLPlus unter Linux erwartet LF
Fehlendes / nach PL/SQL-BlockPROCEDURE, FUNCTION, PACKAGE, TRIGGER, TYPE und BEGIN/END-Blöcke brauchen / in einer eigenen Zeile
Leerzeile in PL/SQL-BlockOhne SET SQLBLANKLINES ON bricht SQLPlus den Block bei einer Leerzeile ab
Fehlendes ; bei SQL-StatementsSELECT, INSERT, UPDATE, DELETE, ALTER, CREATE TABLE usw. müssen mit ; enden
& ohne SET DEFINE OFFSQLPlus fragt sonst interaktiv nach dem Substitutionswert

Warnungen (WARNING) — sollten vor dem Deployment behoben werden

RegelBeschreibung
Fehlendes WHENEVER SQLERROR EXIT FAILUREOhne diese Einstellung läuft das Skript bei einem Fehler einfach weiter
Fehlendes SET DEFINE OFF& im Code wird als Substitutionsvariable interpretiert
Fehlendes SET SQLBLANKLINES ONLeerzeilen in PL/SQL-Blöcken brechen den Block ab
Fehlendes SET SERVEROUTPUT ONDBMS_OUTPUT-Ausgaben sind unsichtbar
Fehlendes SPOOLKein Log-File für den Betrieb
Fehlendes EXIT;SQLPlus gibt die Shell-Kontrolle nicht zurück
DML ohne COMMIT/ROLLBACKINSERT/UPDATE/DELETE/MERGE ohne abschließende Transaktion
Absoluter Pfad in @-AufrufAbsolute Pfade sind umgebungsabhängig — relative Pfade verwenden
Nicht-ASCII in KommentarenUmlaute können bei NLS_LANG-Mismatch zwischen Client und Server Probleme verursachen
Reserviertes Keyword als AliasOracle-Keywords (z. B. DATE, TABLE) unquotiert nach AS

Empfohlener Skript-Header

Jedes Deployment-Skript sollte mit folgendem Header beginnen:

WHENEVER SQLERROR EXIT FAILURE ROLLBACKSET DEFINE OFF
SET SQLBLANKLINES ONSET SERVEROUTPUT ON
SPOOL /pfad/zum/logfile.log-- ... Skript-Inhalt ...
SPOOL OFF
EXIT;

Ergänzende Syntaxprüfung mit SQLcl

sqlplus-checker prüft statisch ohne Datenbankverbindung — SQLcl kennt hingegen den vollständigen Oracle-SQL/PL/SQL-Parser und findet echte Syntaxfehler, die kein statisches Tool erkennen kann.

Empfohlenes Vorgehen (zweistufig):

StufeToolWas wird geprüft
1sqlplus-checkerSQLPlus-Kompatibilität, Encoding, Header, Slash-Logik
2SQLcl (Docker)Echter Oracle-Syntaxparser, PL/SQL-Semantik

SQLcl-Prüfung per Docker

SQLcl steht als offizielles Oracle Docker-Image zur Verfügung — keine lokale Installation nötig. Das folgende Kommando prüft alle SQL-Dateien rekursiv im angegebenen Verzeichnis:

ORACLE_RESTDATA_PWD=geheim docker run --rm \
--entrypoint /bin/bash \
-e ORACLE_RESTDATA_PWD \
-v ./scripts:/scripts \
container-registry.oracle.com/database/sqlcl:latest \
-c ' errors=0; checked=0 while IFS= read -r -d "" f; do rel="${f#/scripts/}" printf "Prüfe: %s ... " "$rel" checked=$((checked + 1)) output=$(printf "WHENEVER SQLERROR EXIT FAILURE\nSET FEEDBACK OFF\nSET TERMOUT OFF\nSET HEADING OFF\n@%s\nEXIT\n" "$f" \ | /opt/oracle/sqlcl/bin/sql -S -noupdates "restdata/${ORACLE_RESTDATA_PWD}@gmk:1521/XEPDB1" 2>&1) rc=$? if [ $rc -ne 0 ]; then echo "FEHLER" echo "$output" | sed "s/^/ /" errors=$((errors + 1)) else echo "OK" fi done < <(find /scripts \ \( -name "*.sql" -o -name "*.pls" -o -name "*.pks" -o -name "*.pkb" \ -o -name "*.prc" -o -name "*.fnc" -o -name "*.trg" \) \ -print0 | sort -z) echo "" echo "Ergebnis: $checked Dateien geprüft, $errors mit Syntaxfehler" exit $([ "$errors" -eq 0 ] && echo 0 || echo 1)'

Erklärung der SQLcl-Optionen

Option / BefehlBedeutung
-SSilent-Modus — keine Verbindungsbanner
-noupdatesDeaktiviert automatische Update-Prüfung
restdata/$PWD@gmk:1521/XEPDB1Verbindung zur Oracle-Datenbank (kompiliert PL/SQL wirklich)
WHENEVER SQLERROR EXIT FAILUREBricht bei erstem Fehler ab, Exit-Code 1
SET FEEDBACK OFFUnterdrückt "1 row created." u. ä.
SET TERMOUT OFFUnterdrückt Script-Output
SET HEADING OFFUnterdrückt Spaltenüberschriften bei SELECT

In CI/CD-Pipelines

# Stufe 1: SQLPlus-Kompatibilität
sqlplus-checker ./scripts/ --no-warnings
if [ $?-ne 0 ];thenecho"sqlplus-checker fehlgeschlagen";exit 1;fi# Stufe 2: Oracle-Syntaxprüfung
ORACLE_RESTDATA_PWD=geheim docker run --rm \
--entrypoint /bin/bash \
-e ORACLE_RESTDATA_PWD \
-v "$(pwd)/scripts":/scripts \
container-registry.oracle.com/database/sqlcl:latest \
-c '...'# Kommando von obenif [ $?-ne 0 ];thenecho"SQLcl-Syntaxprüfung fehlgeschlagen";exit 1;fi

Hinweis: SQLcl mit echter Datenbankverbindung kompiliert PL/SQL-Blöcke vollständig und kann auch Objektreferenzen (Tabellen, Typen) auflösen. Das Passwort wird über die Umgebungsvariable ORACLE_RESTDATA_PWD übergeben.


Tests ausführen

uv run pytest test_main.py -v

About

Python based pl/sql sqlplus checker for devs

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Contributors

Languages