source: liacs/db/opdr3/vb1.pc@ 6

Last change on this file since 6 was 2, checked in by Rick van der Zwet, 15 years ago

Initial import of data of old repository ('data') worth keeping (e.g. tracking
means of URL access statistics)

  • Property svn:executable set to *
File size: 4.2 KB
Line 
1/*
2 * vb1.pc
3 *
4 * Prompts the user for a branch number,
5 * then queries the branch table for the branch's
6 * address, phone and fax.
7 * 2003, Siegfried Nijssen (snijssen@liacs.nl)
8 */
9
10#include <iostream.h>
11#include <string.h>
12#include <stdlib.h>
13#include <sqlda.h>
14#include <sqlcpr.h>
15#include <sqlca.h>
16
17// Define constants for VARCHAR lengths.
18#define UNAME_LEN 20
19#define PWD_LEN 40
20
21//* Declare variables.
22
23EXEC SQL BEGIN DECLARE SECTION;
24
25VARCHAR username[UNAME_LEN];
26VARCHAR password[PWD_LEN];
27
28// Define a host structure for the output values of a SELECT statement.
29struct
30{
31 VARCHAR branch_no[10];
32 VARCHAR address[60];
33 VARCHAR phone[13];
34 VARCHAR fax[13];
35} branchrec;
36
37// Input host variable.
38VARCHAR branch_no[10];
39
40EXEC SQL END DECLARE SECTION;
41
42// Declare error handling function.
43void sql_error(char *msg)
44{
45 char err_msg[128];
46 size_t buf_len, msg_len;
47
48 EXEC SQL WHENEVER SQLERROR CONTINUE;
49 /* after executing this line, sql_error is no longer used as
50 * error handling function. In this way, infinite
51 * recursion is avoided if the next SQL statement
52 * in this function fails.
53 */
54
55 // Print the error message:
56 cout << msg << endl;
57 buf_len = sizeof (err_msg);
58 sqlglm(err_msg, &buf_len, &msg_len);
59 cout << msg_len << "*" << err_msg << endl;
60
61 // Make sure the database is consistent:
62 EXEC SQL ROLLBACK RELEASE;
63
64 // Stop the program.
65 exit(EXIT_FAILURE);
66}
67
68void main()
69{
70 char temp_char[32]; /* strings are of type VARCHAR in Oracle and not \0
71 * terminated. We use this temporary variable
72 * whenever a \0 terminated string is necessary.
73 */
74
75
76 cout << "Enter your ORACLE username: " << endl;
77 cin >> temp_char;
78
79 /* Connect to ORACLE--
80 * Copy the username into the VARCHAR.
81 */
82 strncpy((char *) username.arr, temp_char, UNAME_LEN);
83
84 // Set the length component of the VARCHAR. This is always required!
85 username.len = (unsigned short) strlen((char *) username.arr);
86
87 cout << "Enter your ORACLE password: " << endl;
88 cin >> temp_char;
89
90 // Copy the password.
91 strncpy((char *) password.arr, temp_char, PWD_LEN);
92 password.len = (unsigned short) strlen((char *) password.arr);
93
94 // Register sql_error() as the error handler. */
95 EXEC SQL WHENEVER SQLERROR DO sql_error("ORACLE error--\n");
96
97 /* Connect to ORACLE. Program will call sql_error()
98 * if an error occurs when connecting to the default database.
99 */
100 EXEC SQL CONNECT :username IDENTIFIED BY :password;
101
102 cout << "Connected to ORACLE as user: " << username.arr << endl;
103
104 /* Loop, asking for branch IDs */
105
106 do {
107
108 cout << "Enter branch number: (0 to quit) ";
109 cin >> temp_char;
110
111 if ( strcmp ( temp_char, "0" ) == 0 )
112 break; // stop the while loop
113
114 // Fill in branch_no that we will use in the query.
115 strncpy((char *) branch_no.arr, temp_char, 10);
116 branch_no.len = (unsigned short) strlen((char *) branch_no.arr);
117
118 /* Branch to the notfound label when the
119 * 1403 ("No data found") condition occurs.
120 * Although labels are required here, this does not mean that
121 * using labels in general is good programming practice!
122 * You are only allowed to use labels as target for an SQL GOTO statement.
123 */
124 EXEC SQL WHENEVER NOT FOUND GOTO notfound;
125
126 EXEC SQL SELECT branch_no, address, phone, fax
127 INTO :branchrec
128 FROM Branch
129 WHERE branch_no = :branch_no;
130
131 /* Print data.
132 * The branchrec.address VARCHAR is not \0 terminated. We have
133 * to make it \0 terminated first to print it.
134 */
135 branchrec.address.arr[branchrec.address.len] = '\0';
136 cout << "Address: " << branchrec.address.arr << endl;
137
138 branchrec.phone.arr[branchrec.phone.len] = '\0';
139 cout << "Phone: " << branchrec.phone.arr << endl;
140
141 branchrec.fax.arr[branchrec.fax.len] = '\0';
142 cout << "Fax: " << branchrec.fax.arr << endl;
143
144 // Continue the loop, the other lines in this loop are
145 // for error handling:
146 continue;
147
148notfound:
149 cout << endl << "Not a valid branch number - try again." << endl;
150
151 }
152 while ( true );
153 // continue after an invalid branch number.
154
155 // Disconnect from ORACLE.
156 EXEC SQL ROLLBACK WORK RELEASE;
157
158 exit(EXIT_SUCCESS);
159}
160
Note: See TracBrowser for help on using the repository browser.