Heute geht es um ein kleines, aber dennoch nützliches Feature in Oracle TEXT, wenn
es um das Erstellen von Preferences geht. Die verschiedenen Prozeduren in CTX_DDL
setzen alle ein implizites COMMIT ab, und verhalten sich damit wie normale SQL DDL Kommandos.
Das folgende Codebeispiel zeigt das - obwohl ein ROLLBACK erfolgte, ist die neue Preference
noch sichtbar - sie wurde vorher schon festgeschrieben.
SQL> select pre_name, pre_class from ctx_user_preferences; Es wurden keine Zeilen ausgewählt SQL> exec ctx_ddl.create_preference('MYLEXER', 'BASIC_LEXER'); PL/SQL-Prozedur erfolgreich abgeschlossen. SQL> rollback; Transaktion mit ROLLBACK rückgängig gemacht. SQL> select pre_name, pre_class from ctx_user_preferences; PRE_NAME PRE_CLASS ------------------------------ ------------------------------ MYLEXER LEXER 1 Zeile wurde ausgewählt.
In den meisten Fällen ist dies sicherlich auch das gewünschte Verhalten; aber es geht
auch anders. Letztlich werden durch die verschiedenen CTX_DDL-Aufrufe doch nur
Zeilen in interne Tabellen eingefügt - es wäre also schon interessant, wenn man
kein implizites COMMIT machen würde - dann könnte man auch mehrere CTX_DDL-Aufrufe
per Rollback rückgängig machen. Und das geht so.
begin CTX_DDL.PREFERENCE_IMPLICIT_COMMIT := FALSE; end; / PL/SQL-Prozedur erfolgreich abgeschlossen.
Wenn man die Kommandos von oben nun nochmals laufen lässt, sieht das Bild so aus.
SQL> select pre_name, pre_class from ctx_user_preferences; Es wurden keine Zeilen ausgewählt SQL> exec ctx_ddl.create_preference('MYLEXER', 'BASIC_LEXER'); PL/SQL-Prozedur erfolgreich abgeschlossen. SQL> rollback; Transaktion mit ROLLBACK rückgängig gemacht. SQL> select pre_name, pre_class from ctx_user_preferences; Es wurden keine Zeilen ausgewählt
Kombiniert man dies in einem SQL-Skript mit einem WHENEVER SQLERROR EXIT oder WHENEVER SQLERROR ROLLBACK,
so muss man sich nicht mehr mit dem Problem "halb" angelegter Index-Preferences herumschlagen. Mehr
dazu findet Ihr in der Oracle TEXT Dokumentation.