Mit Hilfe entsprechender Pre-Compiler können C/C++ (oder auch COBOL) Programme auf die Datenbank zugreifen. Die SQL Kommandos werden hierfür mit EXEC SQL eingeleitet. Der Precompiler übersetzt alle EXEC SQL Anweisungen in C Code für den Aufruf der von ADABAS D bereitgestellten API. Das resultierende C Programm wird mit dem C Compiler übersetzt und mit den ADABAS D Bibliotheken gelinkt.
Folgendes kleines Programm lädt jede Zeile, die es von stdin liest, in eine Datenbank-Tabelle foo. Zur Vereinfachung wird die Tabelle foo jedesmal gelöscht (drop) und neu angelegt.
Da das Programm im ORACLE7 kompatiblem Mode precompiliert wird, ist der Sourcecode voll portabel zwischen ORACLE7, ORACLE6 und ADABAS D Datenbank Backends.
ld.cpc:
/* * load every line from stdin into database table foo * $Id: node9.html,v 1.1 1999/10/26 10:06:43 ronsc Exp $ */ #include <stdio.h> EXEC SQL BEGIN DECLARE SECTION; int n; /* line counter */ varchar text[256]; /* line */ EXEC SQL END DECLARE SECTION; EXEC SQL INCLUDE SQLCA.H; EXEC SQL WHENEVER SQLERROR GOTO sqlerr; void drop_foo(); main(int argc, char *argv) { char buf[256]; int connected= 0; setbuf(stdout, NULL); EXEC SQL CONNECT joe IDENTIFIED BY joe; connected= 1; drop_foo(); EXEC SQL create table foo (nr number(8), text varchar2(256)); n= 0; while (fgets(buf, sizeof(buf), stdin)) { buf[strlen(buf)-1]= '\0'; strcpy(text.arr, buf); text.len= strlen(text.arr); EXEC SQL insert into foo values (:n, :text); n++; putchar('.'); } putchar('\n'); EXEC SQL COMMIT WORK RELEASE; exit(0); sqlerr: fprintf(stderr, "SQL Error: %s\n", sqlca.sqlerrm.sqlerrmc); if (connected) { EXEC SQL ROLLBACK WORK RELEASE; } exit(1); } void drop_foo() { EXEC SQL drop table foo; return; sqlerr: /* ignored */ return; }
Zur Kompilierung unter ADABAS D kann folgendes (GNU-)Makefile verwendet werden:
# $Id: node9.html,v 1.1 1999/10/26 10:06:43 ronsc Exp $ pgm = load sources = ld.cpc CC = gcc CFLAGS = -Wall CPC = cpc CPCFLAGS = -S oracle ADALIBS = pcrlib.a pcd1lib.a pcd2lib.a pcd3lib.a libsqlrte.a libsqlptc.a \ sqlca.a SYSLIBS = -lncurses objects= $(addsuffix .o,$(basename $(sources))) $(pgm): $(objects) $(CC) $(LDFLAGS) -o $@ $(objects) \ $(addprefix $(DBROOT)/lib/,$(ADALIBS)) $(SYSLIBS) clean: rm -f $(objects) core $(pgm) %.o: %.cpc $(CPC) $(CPCFLAGS) $(basename $?)