1/*
2REM
3REM q14.pc
4REM
5REM For each laptop made by manufacturer 'E', add one inch to
6REM screen size and subtract $100 from the price.
7REM
8*/
9
10#include <stdio.h>
11#include <sqlca.h>
12
13#define UNAME_LEN 32
14#define PWD_LEN 16
15
16VARCHAR username[UNAME_LEN]; /* VARCHAR is an Oracle-supplied struct */
17VARCHAR password[PWD_LEN]; /* varchar can be in lower case also. */
18
19char u_name[UNAME_LEN];
20char pwd[PWD_LEN];
21
22struct {
23 char model[6];
24 int speed;
25 int ram;
26 float hd;
27 float screen;
28 int price;
29} laptop;
30
31void connect_to_oracle();
32void sql_error();
33
34void main(int argc, char* argv[]) {
35 connect_to_oracle();
36
37 EXEC SQL
38 UPDATE Laptop
39 SET screen = screen + 1,
40 price = price - 100
41 WHERE model IN (SELECT L.model
42 FROM Product P, Laptop L
43 WHERE P.model=L.model
44 AND P.maker='E');
45
46 EXEC SQL DECLARE c CURSOR FOR
47 SELECT *
48 FROM Laptop;
49
50 EXEC SQL OPEN c;
51
52 EXEC SQL WHENEVER NOT FOUND DO BREAK;
53
54 printf("\nmodel\tspeed\tram\thd\tscreen\tprice\n");
55 for(;;) {
56 EXEC SQL FETCH c INTO :laptop;
57 printf("%s\t%d\t%d\t%f\t%f\t%d\n", laptop.model,
58 laptop.speed,
59 laptop.ram,
60 laptop.hd,
61 laptop.screen,
62 laptop.price);
63 }
64
65 EXEC SQL CLOSE c;
66
67 EXEC SQL COMMIT WORK RELEASE;
68
69 exit(0);
70}
71
72
73void sql_error(char* msg) {
74 char err_msg[128];
75 int buflen, msglen;
76
77 EXEC SQL WHENEVER SQLERROR CONTINUE;
78
79 printf("%s \n", msg);
80 buflen = sizeof(err_msg);
81 sqlglm(err_msg, &buflen, &msglen);
82 printf("%.*s \n", msglen, err_msg);
83 exit(1);
84}
85
86
87void connect_to_oracle() {
88 /* get your username/passwd from "user_pwd.txt" file */
89
90 FILE *in_file;
91 in_file = fopen("user_pwd.txt", "r");
92 fscanf(in_file, "%s", u_name);
93 fscanf(in_file, "%s", pwd);
94
95 strncpy((char *) username.arr, u_name, UNAME_LEN);
96 username.len = strlen((char *) username.arr);
97
98 strncpy((char *) password.arr, pwd, PWD_LEN);
99 password.len = strlen((char *) password.arr);
100
101 EXEC SQL WHENEVER SQLERROR DO sql_error ("ORACLE error-- ");
102 EXEC SQL CONNECT :username IDENTIFIED BY :password;
103
104 printf("connected to oracle - \n");
105}
106void main(int argc, char* argv[]) {
107 connect_to_oracle();
108
109 EXEC SQL
110 UPDATE Parts
111 SET color='Yellow',
112 weight=weight+5,
113 city='NULL'
114 WHERE pn = 'P02';
115
116 EXEC SQL DECLARE c CURSOR FOR
117 SELECT *
118 FROM Parts;
119
120 EXEC SQL OPEN c;
121
122 EXEC SQL WHENEVER NOT FOUND DO BREAK;
123
124 printf("\npn\tpname\tcolor\tweight\tcity\n");
125 for(;;) {
126 EXEC SQL FETCH c INTO :parts;
127 printf("%s\t%s\t%s\t%d\t%s\n", parts.pn,
128 parts.pname,
129 parts.color,
130 parts.weight,
131 parts.city);
132 }
133
134 EXEC SQL CLOSE c;
135
136 EXEC SQL COMMIT WORK RELEASE;
137
138 exit(0);
139}