Pro*C

aus Wikipedia, der freien Enzyklopädie

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.

Datei:Proc-precompiler-process.png
Schema des Prozesses, wie er notwendig ist um ein Pro*C-Programm zu erstellen.

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 sehr flexible Lösung um Datenbankanwendungen zu erstellen. Nachfolgend sind die aktuellen Eigenschaften genannt, die ein Pro*C Compiler unterstützt.

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.

Datei:Proc-dynamicsql-decission-tree.png
Entscheidungsbaum, der hilft, zu entscheiden welche dynamische SQL Methode zu benutzen ist.

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.

Literatur

  • Simon Watt: Pro*C/C++ Programmer's Guide, 11g Release 2 (11.2). Oracle Corporation, 2009 (PDF EPUB HTML – E10825-01).