Oracle trifft OpenAI: SELECT AI als Brücke zwischen Sprache und SQL
Oracle 26ai erweitert die relationale Datenbank um native KI-Funktionalitäten: einen Vektordatentyp, eingebettete ONNX-Modelle für Embeddings und SELECT AI für natürlichsprachliche Abfragen. Die genannten Funktionen laufen direkt in der Datenbank ohne externe Vektordatenbank. Diese Beitragsreihe zeigt, wie der Stack aufgebaut wird und worauf geachtet werden muss. Starten wir in diesem Teil mit der SELECT-AI-Funktionalität.
Voraussetzungen für die gezeigten Beispiele: Oracle 26ai, ein:e Datenbankbenutzer:in mit entsprechenden Berechtigungen und für den SELECT-AI-Teilzugriff auf eine Large-Language-Model-API, in diesem Beispiel OpenAI.
SELECT AI: natürlichsprachige Datenbankabfragen
SELECT AI übersetzt natürlichsprachige Eingaben über ein externes LLM in SQL und führt das SQL direkt gegen die Datenbank aus. Das Modell sieht dabei ausschließlich die Tabellen-Metadaten (DDL, Spaltennamen, Kommentare). Die eigentliche Abfrageausführung findet in der Oracle-Datenbank statt.
Technisch basiert SELECT AI auf DBMS_CLOUD_AI. Für die Nutzung ist ein AI-Profil notwendig, das den LLM-Anbieter, das Modell und die Zielobjekte (Tabellen/Views) definiert.
Ablauf der SELECT-AI-Verarbeitung
① Benutzer:in gibt SELECT AI … ein. Das ist für den SQL-Parser wie ein normales Statement.
② Die Oracle DB Engine erkennt das AI-Schlüsselwort, aktiviert das AI-Modul und lädt das aktive Profil.
③ Das AI-Profil (DBMS_CLOUD_AI) baut die erweiterte Abfrage zusammen: Die natürlichsprachige Frage wird mit Tabellennamen, Spaltentypen und Kommentaren aus dem Schema angereichert – damit weiß das LLM, welche Daten überhaupt vorhanden sind.
④ Der LLM-Anbieter (OpenAI, Azure usw.) empfängt nur den angereicherten Prompt, niemals die echten Daten und antwortet mit einem SQL-Statement.
⑤–⑥ Das generierte SQL wird zurück an die DB-Engine übergeben und dort ausgeführt.
⑦ Bei NARRATE geht das Rohresultat nochmal zurück an das LLM, welches daraus einen lesbaren Text formuliert.
⑧ Das Endergebnis, Tabelle oder Text wird angezeigt.
Setup: User:in und Berechtigungen
Als SYSDBA müssen folgende Berechtigungen gesetzt werden, bevor der/die Arbeitsbenutzer:in (hier: vectest) die AI-Funktionen nutzen kann:
Konfiguration:
-- User anlegen CREATE USER vectest IDENTIFIED BY PASSWORT DEFAULT TABLESPACE DATA QUOTA UNLIMITED ON DATA; -- Basis-Rechte GRANT CONNECT, RESOURCE TO vectest; -- DBMS_CLOUD und DBMS_CLOUD_AI GRANT EXECUTE ON DBMS_CLOUD TO vectest; GRANT EXECUTE ON DBMS_CLOUD_AI TO vectest;
Netzwerkzugriff und Credential-Konfiguration für externe LLM-Modelle
Damit Oracle-Datenbankbenutzer:innen auf externe Large Language Models (LLMs) wie GPT-4 von OpenAI zugreifen können, sind zwei wesentliche Konfigurationsschritte erforderlich. Die Freigabe des Netzwerkzugriffs auf Ebene der Datenbank sowie die sichere Verwaltung der Authentifizierungsdaten (Credentials).
Die Verwaltung der Netzwerkfreigaben erfolgt über das Paket DBMS_NETWORK_ACL_ADMIN, das auf dem Konzept der Access Control Lists (ACLs) basiert. Eine ACL ist eine Zugriffskontrollliste, die festlegt, welche:r Datenbankbenutzer:in (Principal) Verbindungen zu welchem Hostnamen oder IP-Adressbereich mit welchen Protokollrechten aufbauen darf. Für den Zugriff auf REST-APIs externer LLM-Anbieter sind die Privilegien http und http_proxy relevant.
-- Netzwerkzugriff für vectest
BEGIN
DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
host => 'api.openai.com',
ace => xs$ace_type(
privilege_list => xs$name_list('http', 'http_proxy'),
principal_name => 'vectest',
principal_type => xs_acl.ptype_db)
);
END;
/
Der Netzwerkzugriff allein reicht nicht aus. Die/Der Datenbankbenutzer:in benötigt auch gültige Authentifizierungsdaten, um sich gegenüber dem externen API-Endpunkt auszuweisen. Oracle stellt hierfür das Paket DBMS_CLOUD bereit.
Credentials werden als benannte Objekte in der Datenbank gespeichert. Der API-Schlüssel wird dabei verschlüsselt im Datenbankschema abgelegt und ist nicht im Klartext auslesbar. Dies ist ein wesentlicher Sicherheitsvorteil gegenüber dem direkten Einbetten von Schlüsseln in PL/SQL-Code oder Konfigurationsdateien.
-- Credential mit dem OpenAI-API-Schlüssel für VECTEST anlegen
BEGIN
DBMS_CLOUD.CREATE_CREDENTIAL(
credential_name => 'OPENAI_CRED',
username => 'OPENAI',
password => '<MEIN_OPENAI_API_KEY>'
);
END;
/
Profil für SELECT AI anlegen und aktivieren
Das AI-Profil verknüpft das Credential mit dem gewünschten LLM-Modell und dem Datenbankschema. Die wichtigsten Parameter sind unter „attributes“ im JSON-Format definiert.
BEGIN
DBMS_CLOUD_AI.CREATE_PROFILE(
profile_name => 'OPENAI_PROFIL_SEMINARE_TEST',
attributes => '{"provider":"openai",
"credential_name":"OPENAI_CRED",
"model":"gpt-4o-mini",
"max_tokens": 1024,
"object_list":[{"owner":"VECTEST",
"name":"SEMINARE_TEST"}],
"comments": true
}'
);
END;
/
-- Profil für die aktuelle Session aktivieren
EXEC DBMS_CLOUD_AI.SET_PROFILE('OPENAI_PROFIL_SEMINARE_TEST');
Je weniger Tabellen im „object_list“-Parameter aufgeführt sind, desto präziser und schneller arbeitet SELECT AI. Es empfiehlt sich, nur die für den Anwendungsfall relevanten Tabellen freizugeben. Das reduziert Token-Verbrauch und verhindert ungewollten Datenzugriff.
Für unterschiedliche Anwendungsfälle können separate Profile angelegt und bei Bedarf aktiviert werden.
SELECT-AI: Beispiele mit Seminardaten
Alle folgenden SELECT-AI-Abfragen beziehen sich auf eine Tabelle SEMINARE_TEST im Schema VECTEST. Die Tabelle enthält das Schulungsangebot eines IT-Dienstleisters mit Bezeichnung, Kategorie, Dauer, Preis, Ort und Buchungsstand.
Tabelle und Datenbasis anlegen:
-- ============================================================
-- Beispieldaten: Tabelle seminare_test
-- Schema: vectest / Oracle 26ai
-- ============================================================
-- Tabelle anlegen
CREATE TABLE seminare_test (
id NUMBER PRIMARY KEY,
bezeichnung VARCHAR2(100) NOT NULL,
kategorie VARCHAR2(50),
dauer_tage NUMBER(1),
preis NUMBER(8,2),
ort VARCHAR2(50),
max_tn NUMBER(3),
gebuchte_tn NUMBER(3) DEFAULT 0
);
-- Kommentare für SELECT AI Kontext
COMMENT ON TABLE seminare_test IS 'IT-Schulungsangebot. Ausgebucht = gebuchte_tn = max_tn.';
COMMENT ON COLUMN seminare_test.preis IS 'Preis pro Teilnehmer in Euro, ohne Mehrwertsteuer.';
COMMENT ON COLUMN seminare_test.kategorie IS 'Themenbereich: Datenbanken, Cloud, Programmierung, Security, Soft Skills.';
COMMENT ON COLUMN seminare_test.dauer_tage IS 'Kursdauer in vollen Tagen (1 bis 5).';
COMMENT ON COLUMN seminare_test.max_tn IS 'Maximale Teilnehmerkapazität des Seminars.';
COMMENT ON COLUMN seminare_test.gebuchte_tn IS 'Aktuell gebuchte Teilnehmer.';
-- Beispieldaten einfügen
INSERT INTO seminare_test VALUES (1, 'Oracle SQL Grundlagen', 'Datenbanken', 3, 1290.00, 'Paderborn', 12, 10);
INSERT INTO seminare_test VALUES (2, 'Oracle 26ai – KI in der DB', 'Datenbanken', 2, 1890.00, 'Köln', 10, 8);
INSERT INTO seminare_test VALUES (3, 'PostgreSQL für Einsteiger', 'Datenbanken', 2, 990.00, 'Berlin', 15, 15);
INSERT INTO seminare_test VALUES (4, 'AWS Cloud Practitioner','Cloud', 3, 1490.00, 'Frankfurt', 12, 9);
INSERT INTO seminare_test VALUES (5, 'Kubernetes Intensiv', 'Cloud', 4, 2390.00, 'München', 8, 6);
INSERT INTO seminare_test VALUES (6, 'Python für Data Scientists', 'Programmierung', 3, 1350.00, 'Hamburg', 12, 12);
INSERT INTO seminare_test VALUES (7, 'Java Spring Boot', 'Programmierung', 4, 1750.00, 'Paderborn', 10, 4);
INSERT INTO seminare_test VALUES (8, 'IT-Security Grundlagen', 'Security', 2, 1190.00, 'Köln', 15, 11);
INSERT INTO seminare_test VALUES (9, 'Penetration Testing', 'Security', 5, 2950.00, 'Frankfurt', 8, 7);
INSERT INTO seminare_test VALUES (10, 'Agile Führung und Kommunikation', 'Soft Skills', 1, 790.00, 'Berlin', 16, 16);
COMMIT;
SELECT AI: Direkte Abfrage (Standard)
Die natürlichsprachliche Anfrage wird an das LLM gesendet, das daraus SQL generiert und sofort ausführt. Das Ergebnis erscheint wie bei jeder normalen SQL-Abfrage als Tabelle.
SELECT AI Zeige mir die Bezeichnung der 3 teuersten Seminare in der Kategorie Datenbanken mit den Kosten und dem Ort; Seminarbezeichnung Kosten Ort ------------------------------ ---------- --------------------------------------- Oracle 26ai – KI in der DB 1890 Köln Oracle SQL Grundlagen 1290 Paderborn PostgreSQL für Einsteiger 990 Berlin
SHOWSQL prüfen vor der Ausführung
SHOWSQL ist das wichtigste Werkzeug für Entwicklung und Qualitätssicherung. Das generierte SQL wird angezeigt, ohne ausgeführt zu werden. So lässt sich prüfen, ob das LLM die Frage korrekt interpretiert hat.
SELECT AI SHOWSQL Zeige mir die Bezeichnung der 3 teuersten Seminare in der Kategorie Datenbanken mit den Kosten und dem Ort;
--Ausgabe
RESPONSE
------------------------------------------
SELECT
"BEZEICHNUNG" AS "Seminarbezeichnung",
"PREIS" AS "Kosten",
"ORT" AS "Ort"
FROM
"VECTEST"."SEMINARE_TEST"
WHERE
UPPER("KATEGORIE") = UPPER('Datenbanken')
ORDER BY
"PREIS" DESC
FETCH FIRST 3 ROWS ONLY
NARRATE-Ergebnis als lesbarer Text
NARRATE führt die SQL-Abfrage aus und übergibt das Ergebnis zurück an das LLM, das daraus eine lesbare Zusammenfassung formuliert. Geeignet für Reports, Dashboards oder automatisierte Statusmeldungen.
Wichtig: Bei NARRATE verlassen tatsächliche Datenbankwerte die Oracle-Instanz. Das Abfrageergebnis wird als Teil des Prompts an den externen LLM-Anbieter übertragen.
SELECT AI NARRATE Wie ausgelastet sind unsere Seminare pro Kategorie;
--Generiertes SQL
RESPONSE
------------------------------------
SELECT "S"."KATEGORIE" AS "Kategorie",
SUM("S"."GEBUCHTE_TN") AS "Aktuell gebuchte Teilnehmer",
SUM("S"."MAX_TN") AS "Maximale Teilnehmerkapazität"
FROM "VECTEST"."SEMINARE_TEST" "S"
GROUP BY "S"."KATEGORIE"
--Ausgabe (formuliert vom LLM):
Die Auslastung unserer Seminare pro Kategorie zeigt, wie viele Teilnehmer aktuell angemeldet sind im Vergleich zur maximalen Teilnehmerzahl, die für jedes Seminar festgelegt ist.
- In der Kategorie "Soft Skills" sind alle 16 Plätze belegt.
- Bei "Datenbanken" sind 33 von 37 Plätzen belegt.
- In der Kategorie "Programmierung" sind 16 von 22 Teilnehmern angemeldet.
- Für "Cloud" sind 15 von 20 Plätzen belegt.
- In der Kategorie "Security" sind 18 von 23 Teilnehmern angemeldet.
Diese Informationen helfen uns zu verstehen, wie gut die Seminare in den verschiedenen Themenbereichen besucht werden und ob es noch freie Plätze gibt.
CHAT: Allgemeine Fragen ohne Datenbankbezug
CHAT leitet die Anfrage direkt ans LLM weiter, ohne Datenbankstrukturen zu übertragen. Nützlich für technische Erklärungen und Konzeptfragen direkt aus SQL Developer oder SQLcl heraus.
SELECT AI CHAT Erkläre mir das Konzept von Vektordatenbanken in drei Sätzen;
Qualität durch Kommentare verbessern
Die Güte der generierten SQL-Abfragen hängt direkt von der Qualität der Metadaten im Schema ab. Oracle SELECT AI überträgt Tabellen- und Spaltenkommentare als Kontext an das LLM, je präziser die Beschreibung, desto besser die Interpretation.
Besonders wichtig sind Kommentare bei Mengenangaben und Einheiten (Euro, Tage, Stück), Statusfeldern mit festem Wertebereich ('aktiv', 'inaktiv', 'archiviert') oder Geschäftsregeln, die sich aus mehreren Spalten ergeben (z. B. 'ausgebucht = gebuchte_tn = max_tn'). Mit dem Profilattribut „comments: true“ werden alle Kommentare automatisch an das LLM übertragen.
Die vier Abfrageaktionen im Überblick
| AKTION | VERHALTEN |
| SELECT AI <Frage> | Generiert SQL, führt es aus und gibt das Ergebnis als Tabelle zurück |
| SELECT AI SHOWSQL <Frage> | Zeigt nur das generierte SQL, ohne Ausführung |
| SELECT AI NARRATE <Frage> | Führt das SQL aus und formuliert das Ergebnis als Fließtext |
| SELECT AI CHAT <Frage> | Allgemeine LLM-Konversation ohne Datenbankbezug |
Fazit
SELECT AI schließt die Lücke zwischen natürlicher Sprache und relationaler Datenbank. Fachbereichsmitarbeiter:innen, Controller:innen oder Support-Teams können damit direkt auf strukturierte Unternehmensdaten zugreifen, ohne SQL-Kenntnisse zu benötigen. Die Abfrage erfolgt so, wie man eine Frage stellen würde.
Die Qualität der generierten SQL-Abfragen ist dabei kein Zufallsprodukt. Sie lässt sich gezielt steuern: Aussagekräftige Tabellen- und Spaltenkommentare, Views mit ausgewählten Werten, eine bewusst eingegrenzte object_list im AI-Profil und die Wahl des richtigen Modells (z. B. gpt-4o statt gpt-4o-mini für komplexere Schemata) haben direkten Einfluss auf Präzision und Zuverlässigkeit.
SELECT AI ist aber kein Ersatz für geprüfte und parametrisierte SQL‑Abfragen in sicherheitskritischen Produktivsystemen. Stattdessen entfaltet es seinen Mehrwert vor allem in Self‑Service‑Analysen, der Prototypenentwicklung und bei internen Werkzeugen zur freien Datenanalyse. Die Nutzer:innen können flexibel Fragen stellen und Daten interaktiv untersuchen.
Der entscheidende Vorteil gegenüber externen KI‑Lösungen liegt dabei in der Datenhoheit. Abgesehen von der NARRATE-Funktion verbleiben die Daten in der Datenbank und das Sprachmodell erhält ausschließlich das Schema als Kontext, nicht jedoch die zugrunde liegenden Rohdaten.
Seminarempfehlungen
ORACLE 26AI – NEW FEATURES FÜR ENTWICKLER [ORA-26AI-E]
Mehr erfahrenORACLE 26AI NEW FEATURES FÜR DBAS [ORA-26AI]
Mehr erfahrenGS-Leiter / Senior Chief Consultant
Kommentare