summaryrefslogtreecommitdiff
path: root/src/interfaces/ecpg/test/complex
diff options
context:
space:
mode:
Diffstat (limited to 'src/interfaces/ecpg/test/complex')
-rw-r--r--src/interfaces/ecpg/test/complex/Makefile17
-rw-r--r--src/interfaces/ecpg/test/complex/header_test.h34
-rw-r--r--src/interfaces/ecpg/test/complex/test1.pgc203
-rw-r--r--src/interfaces/ecpg/test/complex/test2.pgc128
-rw-r--r--src/interfaces/ecpg/test/complex/test3.pgc122
-rw-r--r--src/interfaces/ecpg/test/complex/test4.pgc95
-rw-r--r--src/interfaces/ecpg/test/complex/test5.pgc108
7 files changed, 707 insertions, 0 deletions
diff --git a/src/interfaces/ecpg/test/complex/Makefile b/src/interfaces/ecpg/test/complex/Makefile
new file mode 100644
index 0000000000..4a5d709c31
--- /dev/null
+++ b/src/interfaces/ecpg/test/complex/Makefile
@@ -0,0 +1,17 @@
+subdir = src/interfaces/ecpg/test/complex
+top_builddir = ../../../../..
+include $(top_builddir)/src/Makefile.global
+include ../Makefile.regress
+
+
+TESTS = test1 test1.c \
+ test2 test2.c \
+ test3 test3.c \
+ test4 test4.c \
+ test5 test5.c
+
+all: $(TESTS)
+
+# test4 needs the -c option for the "EXEC SQL TYPE" construct
+test4.c: test4.pgc ../regression.h
+ $(ECPG) -c -o $@ -I$(srcdir) $<
diff --git a/src/interfaces/ecpg/test/complex/header_test.h b/src/interfaces/ecpg/test/complex/header_test.h
new file mode 100644
index 0000000000..85e0ff6459
--- /dev/null
+++ b/src/interfaces/ecpg/test/complex/header_test.h
@@ -0,0 +1,34 @@
+/* $PostgreSQL: pgsql/src/interfaces/ecpg/test/complex/header_test.h,v 1.1 2006/08/02 14:14:02 meskes Exp $ */
+
+#include "stdlib.h"
+
+static void
+Finish(char *msg)
+{
+ fprintf(stderr, "Error in statement '%s':\n", msg);
+ sqlprint();
+
+ /* finish transaction */
+ exec sql rollback;
+
+ /* and remove test table */
+ exec sql drop table meskes;
+ exec sql commit;
+
+ exec sql disconnect;
+
+ exit(-1);
+}
+
+static void
+warn(void)
+{
+ fprintf(stderr, "Warning: At least one column was truncated\n");
+}
+
+exec sql whenever sqlerror
+do
+ Finish(msg);
+exec sql whenever sqlwarning
+do
+ warn();
diff --git a/src/interfaces/ecpg/test/complex/test1.pgc b/src/interfaces/ecpg/test/complex/test1.pgc
new file mode 100644
index 0000000000..18cf12eb37
--- /dev/null
+++ b/src/interfaces/ecpg/test/complex/test1.pgc
@@ -0,0 +1,203 @@
+#include <stdlib.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+exec sql include ../regression;
+
+/* just a test comment */ exec sql whenever sqlerror do PrintAndStop(msg);
+exec sql whenever sqlwarning do warn();
+
+static void PrintAndStop(char *msg)
+{
+ fprintf(stderr, "Error in statement '%s':\n", msg);
+ sqlprint();
+ exit(-1);
+}
+
+static void warn(void)
+{
+ fprintf(stderr, "Warning: At least one column was truncated\n");
+}
+
+/* comment */
+exec sql define AMOUNT 6;
+exec sql define NAMELEN 8;
+
+exec sql type intarray is int[AMOUNT];
+
+typedef int intarray[AMOUNT];
+
+int
+main(void)
+{
+exec sql begin declare section;
+exec sql ifdef NAMELEN;
+ typedef char string[NAMELEN];
+ intarray amount;
+ int increment=100;
+ char name[AMOUNT][NAMELEN];
+ char letter[AMOUNT][1];
+ struct name_letter_struct
+ {
+ char name[NAMELEN];
+ int amount;
+ char letter;
+ } name_letter[AMOUNT];
+#if 0
+ int not_used;
+#endif
+exec sql endif;
+ struct ind_struct
+ {
+ short a;
+ short b;
+ short c;
+ } ind[AMOUNT];
+ char command[128];
+ char *connection="pm";
+ int how_many;
+ char *user="regressuser1";
+exec sql end declare section;
+ exec sql var name is string[AMOUNT];
+ char msg[128];
+ int i,j;
+
+ ECPGdebug(1, stderr);
+
+ strcpy(msg, "connect");
+ exec sql connect to REGRESSDB1 as main;
+
+ strcpy(msg, "connect");
+ exec sql connect to REGRESSDB2 as pm user :user;
+
+ strcpy(msg, "create");
+ exec sql at main create table "Test" (name char(NAMELEN), amount int, letter char(1));
+ exec sql create table "Test" (name char(NAMELEN), amount int, letter char(1));
+
+ strcpy(msg, "commit");
+ exec sql at main commit;
+ exec sql commit;
+
+ strcpy(msg, "set connection");
+ exec sql set connection to main;
+
+ strcpy(msg, "execute insert 1");
+ sprintf(command, "insert into \"Test\" (name, amount, letter) values ('db: ''r1''', 1, 'f')");
+ exec sql execute immediate :command;
+ printf("New tuple got OID = %ld\n", sqlca.sqlerrd[1]);
+
+ sprintf(command, "insert into \"Test\" (name, amount, letter) values ('db: ''r1''', 2, 't')");
+ exec sql execute immediate :command;
+
+ strcpy(msg, "execute insert 2");
+ sprintf(command, "insert into \"Test\" (name, amount, letter) values ('db: ''pm''', 1, 'f')");
+ exec sql at pm execute immediate :command;
+
+ strcpy(msg, "execute insert 3");
+ sprintf(command, "insert into \"Test\" (name, amount, letter) select name, amount+10, letter from \"Test\"");
+ exec sql execute immediate :command;
+
+ printf("Inserted %ld tuples via execute immediate\n", sqlca.sqlerrd[2]);
+
+ strcpy(msg, "execute insert 4");
+ sprintf(command, "insert into \"Test\" (name, amount, letter) select name, amount+?, letter from \"Test\"");
+ exec sql prepare I from :command;
+ exec sql at pm execute I using :increment;
+
+ printf("Inserted %ld tuples via prepared execute\n", sqlca.sqlerrd[2]);
+
+ strcpy(msg, "commit");
+ exec sql commit;
+
+ /* Start automatic transactioning for connection pm. */
+ exec sql at pm set autocommit to on;
+ exec sql at pm begin transaction;
+
+ strcpy(msg, "select");
+ exec sql select * into :name, :amount, :letter from "Test";
+
+ printf("Database: main\n");
+ for (i=0, how_many=j=sqlca.sqlerrd[2]; i<j; i++)
+ {
+ exec sql begin declare section;
+ char n[8], l = letter[i][0];
+ int a = amount[i];
+ exec sql end declare section;
+
+ strncpy(n, name[i], NAMELEN);
+ printf("name[%d]=%8.8s\tamount[%d]=%d\tletter[%d]=%c\n", i, n, i, a, i, l);
+ amount[i]+=1000;
+
+ strcpy(msg, "insert");
+ exec sql at pm insert into "Test" (name, amount, letter) values (:n, :amount[i], :l);
+ }
+
+ strcpy(msg, "commit");
+ exec sql at pm commit;
+
+ sprintf (command, "select * from \"Test\"");
+
+ exec sql prepare F from :command;
+ exec sql declare CUR cursor for F;
+
+ strcpy(msg, "open");
+ exec sql open CUR;
+
+ strcpy(msg, "fetch");
+ exec sql fetch :how_many in CUR into :name, :amount, :letter;
+
+ printf("Database: main\n");
+ for (i=0, j=sqlca.sqlerrd[2]; i<j; i++)
+ {
+ exec sql begin declare section;
+ char n[8], l = letter[i][0];
+ int a = amount[i];
+ exec sql end declare section;
+
+ strncpy(n, name[i], 8);
+ printf("name[%d]=%8.8s\tamount[%d]=%d\tletter[%d]=%c\n", i, n, i, a, i, l);
+ }
+
+ exec sql close CUR;
+
+ strcpy(msg, "select");
+ exec sql at :connection select name, amount, letter into :name, :amount, :letter from "Test";
+
+ printf("Database: %s\n", connection);
+ for (i=0, j=sqlca.sqlerrd[2]; i<j; i++)
+ printf("name[%d]=%8.8s\tamount[%d]=%d\tletter[%d]=%c\n", i, name[i], i, amount[i],i, letter[i][0]);
+
+ strcpy(msg, "commit");
+ exec sql commit;
+
+ strcpy(msg, "select");
+ exec sql at pm select name, amount, letter into :name_letter:ind from "Test";
+
+ printf("Database: pm\n");
+ for (i=0, j=sqlca.sqlerrd[2]; i<j; i++)
+ printf("name[%d]=%8.8s\tamount[%d]=%d\tletter[%d]=%c\n", i, name_letter[i].name, i, name_letter[i].amount,i, name_letter[i].letter);
+
+ name_letter[4].amount=1407;
+ strcpy(msg, "insert");
+ exec sql insert into "Test" (name, amount, letter) values (:name_letter[4]);
+
+ strcpy(msg, "select");
+ exec sql select name, amount, letter into :name_letter[2] from "Test" where amount = 1407;
+
+ printf("Database: main\n");
+ printf("name[2]=%8.8s\tamount[2]=%d\tletter[2]=%c\n", name_letter[2].name, name_letter[2].amount, name_letter[2].letter);
+
+ /* Start automatic transactioning for connection main. */
+ exec sql set autocommit to on;
+
+ strcpy(msg, "drop");
+ exec sql drop table "Test";
+ exec sql at pm drop table "Test";
+
+ strcpy(msg, "disconnect");
+ exec sql disconnect main;
+ exec sql disconnect pm;
+
+ return (0);
+}
diff --git a/src/interfaces/ecpg/test/complex/test2.pgc b/src/interfaces/ecpg/test/complex/test2.pgc
new file mode 100644
index 0000000000..b36471f10a
--- /dev/null
+++ b/src/interfaces/ecpg/test/complex/test2.pgc
@@ -0,0 +1,128 @@
+#include <stdlib.h>
+#include <string.h>
+
+exec sql include header_test;
+exec sql include ../regression;
+
+exec sql type c is char reference;
+typedef char* c;
+
+exec sql type ind is union { int integer; short smallint; };
+typedef union { int integer; short smallint; } ind;
+
+#define BUFFERSIZ 8
+exec sql type str is varchar[BUFFERSIZ];
+
+exec sql declare cur cursor for
+ select name, born, age, married, children from meskes;
+
+int
+main (void)
+{
+ exec sql struct birthinfo { long born; short age; };
+exec sql begin declare section;
+ struct personal_struct { str name;
+ struct birthinfo birth;
+ } personal, *p;
+ struct personal_indicator { int ind_name;
+ struct birthinfo ind_birth;
+ } ind_personal, *i;
+ ind ind_children;
+ char *query="select name, born, age, married, children from meskes where name = :var1";
+exec sql end declare section;
+
+ exec sql char *married = NULL;
+ exec sql float ind_married;
+ exec sql ind children;
+
+ exec sql var ind_married is long;
+
+ char msg[128];
+
+ ECPGdebug(1, stderr);
+
+ strcpy(msg, "connect");
+ exec sql connect to REGRESSDB1;
+
+ strcpy(msg, "create");
+ exec sql create table meskes(name char(8), born integer, age smallint, married date, children integer);
+
+ strcpy(msg, "insert");
+ exec sql insert into meskes(name, married, children) values ('Petra', '19900404', 3);
+ exec sql insert into meskes(name, born, age, married, children) values ('Michael', 19660117, 35, '19900404', 3);
+ exec sql insert into meskes(name, born, age) values ('Carsten', 19910103,10);
+ exec sql insert into meskes(name, born, age) values ('Marc', 19930907, 8);
+ exec sql insert into meskes(name, born, age) values ('Chris', 19970923, 4);
+
+ strcpy(msg, "commit");
+ exec sql commit;
+
+ strcpy(msg, "open");
+ exec sql open cur;
+
+ exec sql whenever not found do break;
+
+ p=&personal;
+ i=&ind_personal;
+ memset(i, 0, sizeof(ind_personal));
+ while (1) {
+ strcpy(msg, "fetch");
+ exec sql fetch cur into :p:i, :married:ind_married, :children.integer:ind_children.smallint;
+ printf("%8.8s", personal.name.arr);
+ if (i->ind_birth.born >= 0)
+ printf(", born %ld", personal.birth.born);
+ if (i->ind_birth.age >= 0)
+ printf(", age = %d", personal.birth.age);
+ if ((long)ind_married >= 0)
+ printf(", married %s", married);
+ if (ind_children.smallint >= 0)
+ printf(", children = %d", children.integer);
+ putchar('\n');
+
+ free(married);
+ married = NULL;
+ }
+
+ strcpy(msg, "close");
+ exec sql close cur;
+
+ /* and now a same query with prepare */
+ exec sql prepare MM from :query;
+ exec sql declare prep cursor for MM;
+
+ strcpy(msg, "open");
+ exec sql open prep using 'Petra';
+
+ exec sql whenever not found do break;
+
+ while (1) {
+ strcpy(msg, "fetch");
+ exec sql fetch in prep into :personal:ind_personal, :married:ind_married, :children.integer:ind_children.smallint;
+ printf("%8.8s", personal.name.arr);
+ if (ind_personal.ind_birth.born >= 0)
+ printf(", born %ld", personal.birth.born);
+ if (ind_personal.ind_birth.age >= 0)
+ printf(", age = %d", personal.birth.age);
+ if ((long)ind_married >= 0)
+ printf(", married %s", married);
+ if (ind_children.smallint >= 0)
+ printf(", children = %d", children.integer);
+ putchar('\n');
+ }
+
+ free(married);
+
+ strcpy(msg, "close");
+ exec sql close prep;
+
+ strcpy(msg, "drop");
+ exec sql drop table meskes;
+
+ strcpy(msg, "commit");
+ exec sql commit;
+
+ strcpy(msg, "disconnect");
+ exec sql disconnect;
+
+ return (0);
+}
diff --git a/src/interfaces/ecpg/test/complex/test3.pgc b/src/interfaces/ecpg/test/complex/test3.pgc
new file mode 100644
index 0000000000..5525fd137c
--- /dev/null
+++ b/src/interfaces/ecpg/test/complex/test3.pgc
@@ -0,0 +1,122 @@
+/****************************************************************************/
+/* Test comment */
+/*--------------------------------------------------------------------------*/
+exec sql include header_test;
+exec sql include ../regression;
+
+exec sql type str is varchar[10];
+
+#include <stdlib.h>
+#include <string.h>
+
+int
+main (void)
+{
+exec sql begin declare section;
+ typedef struct { long born; short age; } birthinfo;
+ struct personal_struct { str name;
+ birthinfo birth;
+ } personal;
+ struct personal_indicator { int ind_name;
+ birthinfo ind_birth;
+ } ind_personal;
+ int *ind_married = NULL;
+ int children, movevalue = 2;
+ int ind_children;
+ str *married = NULL;
+ char *wifesname="Petra";
+ char *query="select * from meskes where name = ?";
+exec sql end declare section;
+
+ exec sql declare cur cursor for
+ select name, born, age, married, children from meskes;
+
+ char msg[128];
+
+ ECPGdebug(1, stderr);
+
+ strcpy(msg, "connect");
+ exec sql connect to REGRESSDB1;
+
+ strcpy(msg, "create");
+ exec sql create table meskes(name char(8), born integer, age smallint, married date, children integer);
+
+ strcpy(msg, "insert");
+ exec sql insert into meskes(name, married, children) values (:wifesname, '19900404', 3);
+ exec sql insert into meskes(name, born, age, married, children) values ('Michael', 19660117, 35, '19900404', 3);
+ exec sql insert into meskes(name, born, age) values ('Carsten', 19910103, 10);
+ exec sql insert into meskes(name, born, age) values ('Marc', 19930907, 8);
+ exec sql insert into meskes(name, born, age) values ('Chris', 19970923, 4);
+
+ strcpy(msg, "commit");
+ exec sql commit;
+
+ strcpy(msg, "open");
+ exec sql open cur;
+
+ strcpy(msg, "move");
+ exec sql move :movevalue in cur;
+
+ exec sql whenever not found do break;
+
+ while (1) {
+ strcpy(msg, "fetch");
+ exec sql fetch from cur into :personal:ind_personal, :married:ind_married, :children:ind_children;
+ printf("%8.8s", personal.name.arr);
+ if (ind_personal.ind_birth.born >= 0)
+ printf(", born %ld", personal.birth.born);
+ if (ind_personal.ind_birth.age >= 0)
+ printf(", age = %d", personal.birth.age);
+ if (*ind_married >= 0)
+ printf(", married %10.10s", married->arr);
+ if (ind_children >= 0)
+ printf(", children = %d", children);
+ putchar('\n');
+
+ free(married);
+ married = NULL;
+ }
+
+ strcpy(msg, "close");
+ exec sql close cur;
+
+ /* and now a query with prepare */
+ exec sql prepare MM from :query;
+ exec sql declare prep cursor for MM;
+
+ strcpy(msg, "open");
+ exec sql open prep using :wifesname;
+
+ exec sql whenever not found do break;
+
+ while (1) {
+ strcpy(msg, "fetch");
+ exec sql fetch in prep into :personal:ind_personal, :married:ind_married, :children:ind_children;
+ printf("%8.8s", personal.name.arr);
+ if (ind_personal.ind_birth.born >= 0)
+ printf(", born %ld", personal.birth.born);
+ if (ind_personal.ind_birth.age >= 0)
+ printf(", age = %d", personal.birth.age);
+ if (*ind_married >= 0)
+ printf(", married %10.10s", married->arr);
+ if (ind_children >= 0)
+ printf(", children = %d", children);
+ putchar('\n');
+ }
+
+ free(married);
+
+ strcpy(msg, "close");
+ exec sql close prep;
+
+ strcpy(msg, "drop");
+ exec sql drop table meskes;
+
+ strcpy(msg, "commit");
+ exec sql commit;
+
+ strcpy(msg, "disconnect");
+ exec sql disconnect;
+
+ return (0);
+}
diff --git a/src/interfaces/ecpg/test/complex/test4.pgc b/src/interfaces/ecpg/test/complex/test4.pgc
new file mode 100644
index 0000000000..b4fdbccb93
--- /dev/null
+++ b/src/interfaces/ecpg/test/complex/test4.pgc
@@ -0,0 +1,95 @@
+#include <locale.h>
+#include <string.h>
+#include <stdlib.h>
+
+exec sql whenever sqlerror sqlprint;
+
+exec sql include sqlca;
+exec sql include ../regression;
+
+EXEC SQL type errtype is enum
+{
+ OK = 0,
+ ERR = 1,
+ WARN = 2
+};
+
+int
+main (void)
+{
+EXEC SQL BEGIN DECLARE SECTION;
+ struct
+ {
+ errtype e :2;
+ int code :14;
+ } error = {1, 147};
+ int i = 1;
+ int *did = &i;
+ int a[10] = {9,8,7,6,5,4,3,2,1,0};
+ char text[25] = "klmnopqrst";
+ char *t = (char *)malloc(10);
+ double f;
+ bool b = true;
+EXEC SQL END DECLARE SECTION;
+
+ strcpy(t, "0123456789");
+ setlocale(LC_ALL, "de_DE");
+
+ ECPGdebug(1, stderr);
+
+ EXEC SQL CONNECT TO REGRESSDB1;
+
+ EXEC SQL SET AUTOCOMMIT = ON;
+
+ EXEC SQL BEGIN WORK;
+
+ EXEC SQL CREATE TABLE test (f float, i int, a int[10], text char(10), b bool, t int, err int);
+
+ EXEC SQL INSERT INTO test(f,i,a,text,b,t,err) VALUES(404.90,3,'{0,1,2,3,4,5,6,7,8,9}','abcdefghij','f',0,0);
+
+ EXEC SQL INSERT INTO test(f,i,a,text,b,t,err) VALUES(140787.0,2,:a,:text,'t',2,14);
+
+EXEC SQL IFDEF BIT_FIELD_IS_NOT_ACCESSIBLE;
+ EXEC SQL INSERT INTO test(f,i,a,text,b,t,err) VALUES(14.07,:did,:a,:t,:b,:error);
+EXEC SQL ELSE;
+ EXEC SQL INSERT INTO test(f,i,a,text,b,t,err) VALUES(14.07,:did,:a,:t,:b,1,147);
+ error.code=0;
+EXEC SQL ENDIF;
+
+ EXEC SQL COMMIT;
+
+ EXEC SQL BEGIN WORK;
+
+ EXEC SQL SELECT f,text,b
+ INTO :f,:text,:b
+ FROM test
+ WHERE i = 1;
+
+ printf("Found f=%f text=%10.10s b=%d\n", f, text, b);
+
+ f=140787;
+ EXEC SQL SELECT a,text
+ INTO :a,:t
+ FROM test
+ WHERE f = :f;
+
+ for (i = 0; i < 10; i++)
+ printf("Found a[%d] = %d\n", i, a[i]);
+
+ printf("Found text=%10.10s\n", t);
+
+ EXEC SQL SELECT a
+ INTO :text
+ FROM test
+ WHERE f = :f;
+
+ printf("Found text=%s\n", text);
+
+ EXEC SQL DROP TABLE test;
+
+ EXEC SQL COMMIT;
+
+ EXEC SQL DISCONNECT;
+
+ return (0);
+}
diff --git a/src/interfaces/ecpg/test/complex/test5.pgc b/src/interfaces/ecpg/test/complex/test5.pgc
new file mode 100644
index 0000000000..dd0f5b8d33
--- /dev/null
+++ b/src/interfaces/ecpg/test/complex/test5.pgc
@@ -0,0 +1,108 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+EXEC SQL include ../regression;
+
+EXEC SQL typedef long mmInteger;
+EXEC SQL typedef char mmChar;
+EXEC SQL typedef short mmSmallInt;
+
+EXEC SQL BEGIN DECLARE SECTION;
+struct TBempl
+{
+ mmInteger idnum;
+ mmChar name[21];
+ mmSmallInt accs;
+ mmChar byte[20];
+};
+EXEC SQL END DECLARE SECTION;
+
+int
+main (void)
+{
+ EXEC SQL BEGIN DECLARE SECTION;
+ struct TBempl empl;
+ char *data = "\\001\\155\\000\\212";
+ union
+ {
+ mmSmallInt accs;
+ char t[2];
+ } a;
+ EXEC SQL END DECLARE SECTION;
+ int i;
+
+ ECPGdebug (1, stderr);
+
+ empl.idnum = 1;
+ EXEC SQL connect to REGRESSDB1;
+ if (sqlca.sqlcode)
+ {
+ printf ("connect error = %ld\n", sqlca.sqlcode);
+ exit (sqlca.sqlcode);
+ }
+
+ EXEC SQL create table empl
+ (idnum integer, name char (20), accs smallint, byte bytea);
+ if (sqlca.sqlcode)
+ {
+ printf ("create error = %ld\n", sqlca.sqlcode);
+ exit (sqlca.sqlcode);
+ }
+
+ EXEC SQL insert into empl values (1, 'first user', 320,:data);
+ if (sqlca.sqlcode)
+ {
+ printf ("insert error = %ld\n", sqlca.sqlcode);
+ exit (sqlca.sqlcode);
+ }
+
+ EXEC SQL select name, accs, byte
+ into :empl.name, :empl.accs, :empl.byte
+ from empl
+ where idnum =:empl.idnum;
+ if (sqlca.sqlcode)
+ {
+ printf ("select error = %ld\n", sqlca.sqlcode);
+ exit (sqlca.sqlcode);
+ }
+ printf ("name=%s, accs=%d byte=%s\n", empl.name, empl.accs, empl.byte);
+
+ EXEC SQL DECLARE C CURSOR FOR select name, accs, byte from empl where idnum =:empl.idnum;
+ EXEC SQL OPEN C;
+ EXEC SQL FETCH C INTO:empl.name,:empl.accs,:empl.byte;
+ if (sqlca.sqlcode)
+ {
+ printf ("fetch error = %ld\n", sqlca.sqlcode);
+ exit (sqlca.sqlcode);
+ }
+
+ printf ("name=%s, accs=%d byte=%s\n", empl.name, empl.accs, empl.byte);
+
+ memset(empl.name, 0, 21L);
+ memset(empl.byte, '#', 20L);
+ EXEC SQL DECLARE B BINARY CURSOR FOR select name, accs, byte from empl where idnum =:empl.idnum;
+ EXEC SQL OPEN B;
+ EXEC SQL FETCH B INTO :empl.name,:a.accs,:empl.byte;
+ if (sqlca.sqlcode)
+ {
+ printf ("fetch error = %ld\n", sqlca.sqlcode);
+ exit (sqlca.sqlcode);
+ }
+
+ EXEC SQL CLOSE B;
+
+ i=a.t[0];
+ a.t[0]=a.t[1];
+ a.t[1]=i;
+
+ printf ("name=%s, accs=%d byte=", empl.name, a.accs);
+ for (i=0; i<20; i++)
+ {
+ if (empl.byte[i] == '#')
+ break;
+ printf("(%o)", (unsigned char)empl.byte[i]);
+ }
+ printf("\n");
+ EXEC SQL disconnect;
+ exit (0);
+}