Inhalt. Einbettungstechniken für SQL. 1. Datenbank-Programmierung. Statische Einbettung



Ähnliche Dokumente
2. Datenbank-Programmierung

Kapitel 9. Embedded SQL. Prof. Dr. Wolfgang Weber Vorlesung Datenbanken 1

Gesicherte Prozeduren

3. Stored Procedures und PL/SQL

Prozedurale Datenbank- Anwendungsprogrammierung

Dynamisches SQL. Folien zum Datenbankpraktikum Wintersemester 2009/10 LMU München

3 Embedded SQL. 3.1 Theorie Was ist Embedded SQL?

Softwareentwicklung mit JAVA EE

Universität Stuttgart Abteilung Anwendersoftware Steht für Embedded SQL in Java. - Java-Methoden als SQL Stored-Procedures

Kurzeinführung ODBC. 1 Codebeispiele. 1.1 Embedded SQL

WS 2010/11 Datenbanksysteme Fr 15:15 16:45 R Vorlesung #6. SQL (Teil 4)

Dipl. Inf. Dipl. Math. Y. Orkunoglu Datum:

Einführung in die C++ Programmierung für Ingenieure

I.1 Die Parrot Assemblersprache

Einführung in die Programmierung

Informatik 12 Datenbanken SQL-Einführung

Datenbankprogrammierung 1

Grundlagen der Programmierung Prof. H. Mössenböck. 3. Verzweigungen

Kapitel 10 Aktive DBMS

Access [basics] Aktionsabfragen per VBA ausführen. Beispieldatenbank. Aktionsabfragen. Die Execute-Methode. Datenzugriff per VBA

Leseprobe: SQL mit MySQL - Band 4 Kompendium mit Online-Übungs-DB. Kompendium zur schnellen Kurzinformation der Datenbanksprache SQL/MySQL 5.

Allgemeines. Verschiedene Sprachkonzepte C-Sprachfamilie C-ähnliche Programmiersprachen Allgemeines zu C. #include <stdio.h>

Einführung in die C-Programmierung

SQL (Structured Query Language) Schemata Datentypen

8 Access-Abfragen migrieren

AGROPLUS Buchhaltung. Daten-Server und Sicherheitskopie. Version vom b

11 Anwendungsprogrammierung

Whitepaper. Produkt: combit Relationship Manager. Einbindung externer FiBu-/Warenwirtschaftsdaten. combit GmbH Untere Laube Konstanz

Datenmanagement in Android-Apps. 16. Mai 2013

Kapitel 10: Datenbankzugriff & Pufferung 2

Datenbanken. Autor Rainer Colgen (0171)

Klausur in Programmieren

8. SQL zur Anwendungsprogrammierung (embedded SQL, ESQL)

Embedded SQL in PostgreSQL

Unterprogramme. Funktionen. Bedeutung von Funktionen in C++ Definition einer Funktion. Definition einer Prozedur

E-Commerce: IT-Werkzeuge. Web-Programmierung. Kapitel 6: Datenbankabfragen mit SQL und PHP. Stand: Übung WS 2014/2015

SQL-Injection. Seite 1 / 16

Matrix42. Use Case - Sicherung und Rücksicherung persönlicher Einstellungen über Personal Backup. Version September

Mengenvergleiche: Alle Konten außer das, mit dem größten Saldo.

SQLJ. Standardisierte Java-DB. DB-Schnittstelle. Spezifikationen. Oracle, IBM, Informix, Sybase,, Tandem, Sun, Microsoft stehen dahinter

Formeln. Signatur. aussagenlogische Formeln: Aussagenlogische Signatur

mit Musterlösungen Prof. Dr. Gerd Stumme, Dipl.-Inform. Christoph Schmitz 11. Juni 2007

Würfelt man dabei je genau 10 - mal eine 1, 2, 3, 4, 5 und 6, so beträgt die Anzahl. der verschiedenen Reihenfolgen, in denen man dies tun kann, 60!.

Historical Viewer. zu ETC5000 Benutzerhandbuch 312/15

Programmieren für mobile Endgeräte SS 2013/2014. Dozenten: Patrick Förster, Michael Hasseler

Propädeutikum. Dipl.-Inf. Frank Güttler

Informatik Repetitorium SS Volker Jaedicke

Datenbanksysteme 2 Frühjahr-/Sommersemester Mai 2014

Dokumentation. Black- und Whitelists. Absenderadressen auf eine Blacklist oder eine Whitelist setzen. Zugriff per Webbrowser

So gehts Schritt-für-Schritt-Anleitung

Verschlüsseln von Dateien mit Hilfe einer TCOS-Smartcard per Truecrypt. T-Systems International GmbH. Version 1.0 Stand

5 DATEN Variablen. Variablen können beliebige Werte zugewiesen und im Gegensatz zu

7. Übung - Datenbanken

Erwin Grüner

Professionelle Seminare im Bereich MS-Office

P.A. Bernstein, V. Hadzilacos, N. Goodman

Datenbanken Kapitel 2

Erweiterung der Aufgabe. Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen:

Einführung in die Scriptsprache PHP

Excel Funktionen durch eigene Funktionen erweitern.

ROFIN App Benutzerhandbuch. Version 1.0

Stand: Adressnummern ändern Modulbeschreibung

Funktionen Häufig müssen bestimmte Operationen in einem Programm mehrmals ausgeführt werden. Schlechte Lösung: Gute Lösung:

Übersicht Programmablaufsteuerung

Installation OMNIKEY 3121 USB

5. Übung: PHP-Grundlagen

Graphic Coding. Klausur. 9. Februar Kurs A

Datenbanken Microsoft Access 2010

Programmieren in C. Macros, Funktionen und modulare Programmstruktur. Prof. Dr. Nikolaus Wulff

Java Kurs für Anfänger Einheit 4 Klassen und Objekte

Access Grundlagen für Anwender. Andrea Weikert 1. Ausgabe, 1. Aktualisierung, Juli inkl. zusätzlichem Übungsanhang ACC2010-UA

Datenbanksysteme I. Klausur zum Praktikum. Mehrere Professoren prüfen mit genau einem Beisitzer genau einen Studenten.

teamsync Kurzanleitung

Felder, Rückblick Mehrdimensionale Felder. Programmieren in C

Universität Duisburg-Essen Informationssysteme Prof. Dr.-Ing. N. Fuhr. Praktikum Datenbanken / DB2 Woche 8: Trigger, SQL-PL

Datenbanksysteme I Datenbankprogrammierung Felix Naumann

Datenbanken (Bachelor) (SPO2007) WS 2011/12

1. Einführung. 2. Alternativen zu eigenen Auswertungen. 3. Erstellen eigener Tabellen-Auswertungen

Ein Blick voraus. des Autors von C++: Bjarne Stroustrup Conrad Kobsch

Anleitung für die Teilnahme an den Platzvergaben "Studio II, Studio IV und Studio VI" im Studiengang Bachelor Architektur SS15

Embedded SQL mit C und PostgreSQL

Kundenspezifische Preise im Shop WyRu Online-Shop

Übung 7 DBMS-FUNKTIONALITÄTEN UND DATENIMPORT

Bedienungsanleitung: Onlineverifizierung von qualifiziert signierten PDF-Dateien

Anlegen eines Speicherbereichs mit DB, DW eleganter in Kombination mit EQU, Timer-Interrupt

Zur drittletzten Zeile scrollen

1 Vom Problem zum Programm

Nutzung des Retain-Archivs

Dokumentation zur Anlage eines JDBC Senders

Auswahlabfragen mit ACCESS

Whitepaper. Produkt: combit Relationship Manager. Einbindung externer FiBu-/Warenwirtschaftsdaten. combit GmbH Untere Laube Konstanz

Folgendes PL/SQL Codefragment zeigt das grundlegende Statement für diesen Test: Java.

Einführung in die Programmierung

Grundlagen der Programmierung Prof. H. Mössenböck. 14. Schrittweise Verfeinerung

Views in SQL. 2 Anlegen und Verwenden von Views 2

mobilepoi 0.91 Demo Version Anleitung Das Software Studio Christian Efinger Erstellt am 21. Oktober 2005

WinWerk. Prozess 6a Rabatt gemäss Vorjahresverbrauch. KMU Ratgeber AG. Inhaltsverzeichnis. Im Ifang Effretikon

C# - Einführung in die Programmiersprache Arbeiten mit ADO.NET. Leibniz Universität IT Services Anja Aue

How-to: Webserver NAT. Securepoint Security System Version 2007nx

Arbeiten mit UMLed und Delphi

Transkript:

Vorbemerkungen Inhalt Einbettungstechniken für SQL 1. Datenbankprogrammierung auf der Client-Seite: Embedded SQL, JDBC und SQLJ 2. Datenbankprogrammierung auf der Server-Seite: Stored Procedures 3. Erweiterbarkeit von Datenbanksystemen: UDFs, UDTs und LOBs 4. Zugriffsstrukturen für komplexe Objekte 5. Anfrageübersetzung und -optimierung 6. Aktive Datenbanksysteme, Trigger prozedurale Schnittstelle / call-schnittstelle Dem Programmierer wird eine Bibliothek von Prozeduren zur Verfügung gestellt, die den Zugriff und die Manipulation der Datenbank gewährleisten. Eine eigenständige Datenbanksprache wird nicht direkt eingesetzt. ODBC, JDBC, SQL/CLI (call level interface) Einbettung in eine Wirtssprache SQL wird als eigenständige Sprache in eine existierende Sprache (Wirtssprache, z.b. C) eingebettet und somit direkt eingesetzt. Die Syntax und der Compiler der Wirtssprache wird nicht modifiziert. Embedded SQL, SQLJ Spracherweiterungen / Sprachentwicklungen Existierende Programmiersprachen werden um Datenbankfunktionalität erweitert bzw. es werden neue dedizierte Sprachen entwickelt. Im folgenden untersuchen wir den Ansatz der Einbettung von SQL in eine Wirtssprache. Datenbanksysteme: Weiterf ührende Konzepte FH Bonn-Rhein-Sieg, SS 07 11 Datenbanksysteme: Weiterf ührende Konzepte FH Bonn-Rhein-Sieg, SS 07 24 1. Datenbank-Programmierung Ansätze der Datenbank-Programmierung 1. Datenbank-Programmierung Statische Einbettung SQL ist eingeschränkt bezüglich der algorithmischen Mächtigkeit, z.b. Berechnung einer transitiven Hülle ist nicht möglich. Die Einschränkung ist von Bedeutung für die Terminierung, die Endlichkeit von Ergebnissen und die Optimierbarkeit. Für Datenbank-Anwendungen braucht man oft die vollständige Mächtigkeit einer Programmiersprache. Ansätze hierfür: Einbettung von SQL in eine Wirtssprache Erweiterung von SQL um Kontrollstrukturen Erweiterung existierender Programmiersprachen zu persistenten Programmiersprachen SQL-Anweisungen werden in den Programmtext eingestreut und syntaktisch gekennzeichnet. Ein Precompiler ersetzt die SQL-Anweisungen in Anweisungen für eine prozedurale Schnittstelle der Wirtssprache. Das vom Precompiler generierte Programm kann von einem gewöhnlichen Compiler für die Wirtssprache übersetzt werden. Die SQL-Anweisungen müssen zur Übersetzungszeit feststehen. Nur Werte in Ausdrücken der Where-Klausel sind variabel. Datenbanksysteme: Weiterf ührende Konzepte FH Bonn-Rhein-Sieg, SS 07 23 Datenbanksysteme: Weiterf ührende Konzepte FH Bonn-Rhein-Sieg, SS 07 25

Dynamische Einbettung Cursor SQL-Anweisungen können zur Laufzeit konstruiert werden. Aus Sicht der Wirtssprache werden die SQL-Anweisungen in Form von Zeichenketten zur Verfügung gestellt. Eine syntaktische und semantische Analyse der SQL-Anweisung findet ebenfalls erst zur Laufzeit statt. Vom Datenbanksystem werden spezifische Prozeduren für die Behandlung variabler Ergebnisrelationen bereitgestellt. Ein Cursor stellt eine Art Zeiger auf die Zeilen einer Ergebnisrelation dar. Ein gutes Bild ist es, sich den Cursor als einzeiliges Fenster auf die Ergebnisrelation vorzustellen. Dieses Fenster wird schrittweise über die Ergebnisrelation geschoben. Anwendungsprogramm C++ Cursor Datenbank SQL Anfrage Ergebnisrelation Datenbanksysteme: Weiterf ührende Konzepte FH Bonn-Rhein-Sieg, SS 07 26 Datenbanksysteme: Weiterf ührende Konzepte FH Bonn-Rhein-Sieg, SS 07 28 Cursor-Konzept Cursor-Anweisungen DECLARE CURSOR: Mit einer Cursordeklaration wird u.a. der Name des Cursors und die zugehörige Cursortabelle (Ergebnisrelation) definiert. Gewöhnliche Programmiersprachen bieten zwar Strukturen aber keine Mengen als Datentyp an. Eine Ergebnisrelation in SQL ist aber eine Menge von Tupeln. Das Ergebnis einer SQL-Anfrage kann nicht direkt in einen Wert eines Datentyps der Wirtssprache abgebildet werden (impedance mismatch). Das Konzept des Cursors bietet eine abstrakte Sichtweise auf eine Ergebnisrelation. DECLARE Cursorname [SCROLL] CURSOR [WITH HOLD] FOR Abfrageausdruck [ORDER BY-Klausel] [Modifikationsklausel] Modifikationsklausel: FOR READ ONLY UPDATE [OF Spaltenname {, Spaltenname}] declare caddr cursor for select customer_id, name where address = Stanford Der Abfrageausdruck (Cursorformel) ist der wichtigste Bestandteil einer Cursor- Anweisung. Er legt die Cursortabelle fest. Datenbanksysteme: Weiterf ührende Konzepte FH Bonn-Rhein-Sieg, SS 07 27 Datenbanksysteme: Weiterf ührende Konzepte FH Bonn-Rhein-Sieg, SS 07 29

Durch SCROLL stehen zusätzliche Positionierungsmöglichkeiten des Cursors bei FETCH INTO zur Verfügung. Nur in Zusammenhang mit READ ONLY möglich. Ohne SCROLL: nur sequentieller Durchlauf WITH HOLD: Cursor bleibt über ein COMMIT hinaus im geöffneten Zustand. OPEN CURSOR: Berechnung der Ergebnisrelation OPEN Cursoname FETCH INTO: Positioniert den Cursor auf ein bestimmtes Tupel der Cursortabelle und überträgt die Attributwerte dieses Tupels in Variablen der Wirtssprache. FETCH [[FETCH-Orientierung] FROM] Cursoname INTO Zielspez {, Zielspez } FETCH-Orientierung: NEXT PRIOR FIRST LAST ABSOLUTE wert RELATIVE wert Embedded SQL (C und C++) Syntaktische Auszeichnung von SQL-Anweisungen Alle eingebetteten SQL-Anweisungen müssen mit dem Schlüsselwort exec sql beginnen, um vom Precompiler erkannt zu werden. Weiterhin müssen die SQL-Anweisungen mit einem Semikolon abgeschlossen werden. Beispiel: Cursor-Deklaration exec sql declare caddr cursor for select customer_id, name where address = Stanford ; Deklaration von Host-Variablen Variablen, die sowohl in SQL-Anweisungen als auch in der Wirtssprache verwendet werden, heißen Host-Variablen (host variables). Datenbanksysteme: Weiterf ührende Konzepte FH Bonn-Rhein-Sieg, SS 07 30 Datenbanksysteme: Weiterf ührende Konzepte FH Bonn-Rhein-Sieg, SS 07 32 fetch caddr into :cid, :name UPDATE CURRENT: Ändern des aktuellen Tupels UPDATE Relationenname SET-Klausel WHERE CURRENT OF Cursorname DELETE CURRENT: Löschen des aktuellen Tupels DELETE FROM Relationenname WHERE CURRENT OF Cursorname CLOSE: Freigabe der Ergebnisrelation CLOSE Cursorname Sie müssen in einem separaten Deklarationsblock (declare section) deklariert werden. exec sql begin declare section; long customer_id; exec sql end declare section; Verwendung von Host-Variablen Host-Variablen können in SQL-Anweisungen wie Konstanten benutzt werden. Sie werden durch einen vorangestellten Doppelpunkt gekennzeichnet: exec sql delete where customer_id = :customer_id; Die den SQL-Datentypen entsprechenden Programmiersprachen-Datentypen hängen von der jeweiligen Wirtssprache ab. Datenbanksysteme: Weiterf ührende Konzepte FH Bonn-Rhein-Sieg, SS 07 31 Datenbanksysteme: Weiterf ührende Konzepte FH Bonn-Rhein-Sieg, SS 07 33

Behandlung von Ergebnisrelationen Ist garantiert, daß eine Anfrage höchstens ein Tupel liefert, so kann die into- Klausel benutzt werden, um das Ergebnis der Anfrage in Host-Variablen abzulegen. exec sql select name, address into :name, :address where customer_id = :customer_id; Zur Behandlung von Nullwerten können Indikator-Variablen verwendet werden. Indikator-Variablen sind Host-Variablen vom Datentyp int oder short. In der SQL-Anweisung werden sie direkt hinter der Host-Variablen für die Aufnahme des Wertes angegeben. Ist die Indikator-Variable mit einem negativen Wert belegt, wird dadurch ein Nullwert angezeigt. Fehlerbehandlung Um Fehlersituationen zu erkennen, wird die sogenannte SQL Communication Area (SQLCA) in ein Anwendungsprogramm eingebunden: exec sql include sqlca; In der SQLCA ist u.a. die Variable sqlcode definiert, die den Status der letzten Ausführung eines SQL-Befehls angibt: sqlcode Bedeutung 0 OK < 0 Fehler 100 Kein Tupel gefunden > 0, 100 Warnung Die whenever-anweisung ermöglicht eine flexible Reaktion auf Fehler: exec sql whenever Bedingung Aktion; Datenbanksysteme: Weiterf ührende Konzepte FH Bonn-Rhein-Sieg, SS 07 34 Datenbanksysteme: Weiterf ührende Konzepte FH Bonn-Rhein-Sieg, SS 07 36 Beispiel: Nicht gespeicherte Adressen erkennen: exec sql select name, address into :name, :address:addiv where customer_id = :customer_id; Cursor Das Öffnen eines Cursors erfolgt mit einer open-anweisung: exec sql open caddr; Für die Übertragung der Tupelwerte in die Hostvariablen dient die fetch- Anweisung: exec sql fetch caddr into :cid, :name; Bei Bedarf sind Indikatorvariablen zu verwenden. Mit der close-anweisung wird ein Cursor geschlossen: exec sql close caddr; Als Bedingungen sind definiert: not found, sqlwarning, sqlerror Die Aktion ist entweder continue oder goto label. Öffnen und Schließen einer Datenbank-Verbindung Dieser Aspekt ist nicht standardisiert. Üblicherweise werden hierzu die Befehle: und exec sql connect Datenbank; exec sql disconnect Datenbank; verwendet. Transaktionssteuerung Zum Commit einer Transaktion benutzt man: exec sql commit work; Datenbanksysteme: Weiterf ührende Konzepte FH Bonn-Rhein-Sieg, SS 07 35 Datenbanksysteme: Weiterf ührende Konzepte FH Bonn-Rhein-Sieg, SS 07 37

Das Zurücksetzen einer Transaktion geschieht mit: exec sql rollback work; exec sql set transaction isolation level serializable; Diese Schritte sind rein prinzipieller Natur. Die Erstellung von Anwendungsprogrammen bei der Verwendung von Embedded SQL ist in keinster Weise standardisiert! Je nach Datenbanksystem gibt es Unterschiede in der Einbindung zusätzlicher include-dateien, den Namen und den Option des Precompilers, den verwendeten Fehlercodes, der Verbindung der übersetzten SQL-Statements mit einer Datenbank, den einzubindenden Bibliotheken, etc. Darüberhinaus gibt es deutliche Unterschiede zwischen den SQL-Dialekten. Datenbanksysteme: Weiterf ührende Konzepte FH Bonn-Rhein-Sieg, SS 07 38 Datenbanksysteme: Weiterf ührende Konzepte FH Bonn-Rhein-Sieg, SS 07 40 Weiterhin können Transaktionsattribute (Zugriffsart, Isolationsstufe) gesetzt werden: Schritte zur Erstellung eines Anwendungsprogramms bei der Verwendung von Embedded SQL: 1. Precompiler 2. Compiler 3. Linker Quelldatei C Datei Objekt Datei Programm Precompiler C Compiler Linker meinprog.sqc sqlprep meinprog.sqc datenbank meinprog.c cc c I/usr/IBMdb2/V7.1/include meinprog.c meinprog.o meinprog Bibliotheken cc o meinprog L/usr/IBMdb2/V7.1/lib meinprog.o ldb2 Wieviele Tupel enthält die Tabelle words in einer Datenbank? (DB2) #include <stdio.h> #include <string.h> #include <sqlenv.h> EXEC SQL INCLUDE SQLCA; int main( int argc, char * argv[] ) { EXEC SQL BEGIN DECLARE SECTION; char db[9]; long nwords; EXEC SQL END DECLARE SECTION; memset( db, 0, sizeof( db ) ); strcpy( db, argv[1] ); EXEC SQL CONNECT TO :db; if ( sqlca.sqlcode!= 0 ) { fprintf( stderr, "db2: %s (%d)\n", sqlca.sqlerrmc, sqlca.sqlcode ); exit( 1 ); } Datenbanksysteme: Weiterf ührende Konzepte FH Bonn-Rhein-Sieg, SS 07 39 Datenbanksysteme: Weiterf ührende Konzepte FH Bonn-Rhein-Sieg, SS 07 41

} EXEC SQL SELECT count(*) INTO :nwords FROM words; if ( sqlca.sqlcode!= 0 ) fprintf( stderr, "db2: %s (%d)\n", sqlca.sqlerrmc, sqlca.sqlcode ); else printf( "%ld\n", nwords ); EXEC SQL DISCONNECT :db; Dynamic SQL Bisher müssen alle SQL-Anweisungen vor der Compilierung feststehen. Nur die Belegung der Host-Variablen ist modifizierbar. Somit ist es beispielsweise nicht möglich, die Bedingungen im where-teil der Anfrage erst zur Laufzeit festzulegen. Um derartiges zur Laufzeit zu ermöglichen wurde Dynamic SQL entwickelt. In Dynamic SQL werden SQL-Anfragen als Zeichenketten in Host-Variablen abgelegt. Spezielle SQL-Variablen enthalten die übersetze und optimierte Anfrage. Die Struktur der Tupel einer Resultatsmenge kann mit einer SQL Descriptor Area (SQLDA) ermittelt werden. Dynamic SQL ist in keinster Weise standardisiert. Aufgaben by Dynamic SQL: Vorbereiten einer SQL-Anweisung Datenbanksysteme: Weiterf ührende Konzepte FH Bonn-Rhein-Sieg, SS 07 42 Datenbanksysteme: Weiterf ührende Konzepte FH Bonn-Rhein-Sieg, SS 07 44 Der Programmtext liege in der Datei first.sqc. Erzeugen und Ausführen des Programms: $ sqlprep first.sqc testdb... LINE MESSAGES FOR first.sqc ------ -------------------------------------------------------------------- SQL0060W The "C" precompiler is in progress. SQL0091W Precompilation or binding was ended with "0" errors and "0" warnings. Erhalten einer Beschreibung der Struktur der Ergebnistupel Ausführen einer vorbereiteten SQL-Anweisung zeilenweises Lesen der Ergebnismenge $ cc -c first.c -I/usr/IBMdb2/V7.1/include $ cc -o first -L/usr/IBMdb2/V7.1/lib first.o -ldb2 $ first testdb 45407 Datenbanksysteme: Weiterf ührende Konzepte FH Bonn-Rhein-Sieg, SS 07 43 Datenbanksysteme: Weiterf ührende Konzepte FH Bonn-Rhein-Sieg, SS 07 45

prepare Erzeugung eines Zugriffsplans für eine SQL-Anweisung und Übersetzung dieser Anweisung in eine ausführbare Form: exec sql prepare s1 from :anweisung; exec sql prepare q1 from :anfrage; describe Ermitteln einer Beschreibung der Datentypen der Ergebnismenge: exec sql describe q1 into :sqlda; execute Ausführen einer vorbereiteten SQL-Anweisung; nur möglich, wenn die Anweisung keine Resultatsmenge liefert exec sql execute s1; Dynamische Cursor-Deklaration Deklaration eines Cursors für eine Anfrage exec sql declare c1 cursor for q1; Dynamisches Open Öffnen des dynamischen Cursors Datenbanksysteme: Weiterf ührende Konzepte FH Bonn-Rhein-Sieg, SS 07 46 exec sql open c1; Dynamisches Fetch Ablegen eines Ergebnistupels in der SQL Descriptor Area exec sql fetch c1 using descriptor :sqlda; Datenbanksysteme: Weiterf ührende Konzepte FH Bonn-Rhein-Sieg, SS 07 47