Pro*C [pɹoʊˈsiː]/Pro*C++ [-ˈplʌs ˈplʌs] ist ein Precompiler des Unternehmens Oracle für die Programmiersprache C und C++. Mittels des Precompilers ist es möglich, SQL-Ausdrücke und normale C oder C++ Quellcode-Elemente miteinander zu vermischen. Dies gilt jedoch ausschließlich für DML-Befehle; DDL- und DCL-Befehle müssen nach wie vor beispielsweise mit dem Programm SQL*Plus ausgeführt werden. Die daraus resultierende Datei wird schließlich in gültigen Quellcode übersetzt, um diesen mit einem herkömmlichen Compiler übersetzen zu können. Intern werden die im Quellcode eingebetteten SQL-Ausdrücke durch den Precompiler in normale Oracle Funktionsaufrufe umgewandelt.
Unterstützte Konzepte
Mittels Pro*C ist es möglich, mit einer Datenbank innerhalb eines C-Programms auf verschiedenen Arten zu kommunizieren. Verglichen mit Ansätzen wie beispielsweise SQLJ ist Pro*C so eine flexible Lösung, um Datenbankanwendungen zu erstellen. Nachfolgend sind die aktuellen Eigenschaften genannt, die ein Pro*C Compiler unterstützt.
- Embedded SQL, statisch, erfordert einen Precompiler
- PL SQL, statisch, erfordert einen Precompiler
- Host Arrays
- Dynamisches SQL
Dynamisches SQL – Varianten
Dynamisches SQL wird in verschiedene Varianten aufgeteilt. Je nach Variante ist es möglich, eine richtige SQL-Abfrage auszuführen. Die geeignete Methode ermittelt man mit Hilfe eines Entscheidungsbaums.
Methode 1
Diese Methode ermöglicht es, ein Programm zu schreiben, welches dynamische SQL-Ausdrücke ausführt oder neue Ausdrücke erstellt. Jeder Ausdruck wird unmittelbar mittels des EXECUTE IMMEDIATE Befehls ausgeführt. Der SQL-Ausdruck darf allerdings keine Abfrage (SELECT Ausdruck) und keine Platzhalter für Input-Host-Variablen enthalten. Der nachfolgende Ausdruck ist ein gültiger Ausdruck für die Methode 1:
'DELETE FROM EMP WHERE DEPTNO = 20' 'GRANT SELECT ON EMP TO scott'
Wird Methode 1 benutzt, so wird der SQL-Ausdruck, der ausgeführt werden soll, bei jeder Ausführung analysiert.
Methode 2
Diese Methode ermöglicht es, ein Programm zu schreiben, welches dynamische SQL-Ausdrücke ausführt oder neue Ausdrücke erstellt. Anschließend ist es möglich, die einzelnen SQL-Ausdrücke mittels PREPARE oder EXECUTE Befehl zu verarbeiten. Der SQL-Ausdruck darf allerdings nicht eine Abfrage (SELECT Ausdruck) enthalten. Die Anzahl der Platzhalter für die Host-Variablen und deren Datentypen müssen zum Zeitpunkt der Übersetzung bekannt sein. Das nachfolgende Beispiel würde einem dynamischen SQL-Ausdruck dieser Kategorie entsprechen:
'INSERT INTO EMP (ENAME, JOB) VALUES (:emp_name, :job_title)' 'DELETE FROM EMP WHERE EMPNO = :emp_number'
Wird Methode 2 verwendet, so wird der SQL-Ausdruck nur einmal analysiert. Trotzdem kann der Ausdruck mehrmals mit unterschiedlichen Host-Variablen ausgeführt werden. SQL-DDL Ausdrücke wie beispielsweise CREATE oder GRANT werden ausgeführt, wenn diese PREPAREd, also vorbereitet werden.
Methode 3
Diese Methode ermöglicht es, ein Programm zu schreiben, welches dynamische SQL-Ausdrücke ausführt oder neue Ausdrücke erstellt. Anschließend ist es möglich, die einzelnen SQL-Ausdrücke mittels PREPARE Befehl und den Cursor-Befehlen DECLARE, OPEN, FETCH und CLOSE zu verarbeiten. Die Anzahl der Select-List-Elemente, die Anzahl der Platzhalter für die Input-Host-Variablen sowie die Datentypen der Input-Host-Variablen müssen zum Zeitpunkt der Übersetzung bekannt sein. Das nachfolgende Beispiel entspricht einem solchen SQL-Ausdruck:
'SELECT DEPTNO, MIN(SAL), MAX(SAL) FROM EMP GROUP BY DEPTNO' 'SELECT ENAME, EMPNO FROM EMP WHERE DEPTNO = :dept_number'
Methode 4
Diese Methode ermöglicht es, ein Programm zu schreiben, welches dynamische SQL-Ausdrücke ausführt oder neue Ausdrücke erstellt. Anschließend wird der SQL-Ausdruck mittel Deskriptoren verarbeitet. Die Anzahl der Select-List Elemente, die Anzahl der Platzhalter für die Input-Host-Variablen sowie die Datentypen der Input-Host-Variablen können bis zum Zeitpunkt der Ausführung unbekannt sein. Der nachfolgende Quelltext fällt in diese Kategorie:
'INSERT INTO EMP (<unknown>) VALUES (<unknown>)' 'SELECT <unknown> FROM EMP WHERE DEPTNO = 20'
Methode 4 wird für dynamische SQL-Ausdrücke benötigt, bei welchen die Anzahl der Select-List Elemente oder die Anzahl der Input-Host-Variablen unbekannt ist.