File: stat9.e

package info (click to toggle)
firebird3.0 3.0.13.ds7-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 42,632 kB
  • sloc: ansic: 374,403; cpp: 319,973; sql: 14,691; pascal: 14,532; yacc: 7,557; fortran: 5,645; sh: 5,336; makefile: 1,041; perl: 194; sed: 83; awk: 76; xml: 19; csh: 15
file content (165 lines) | stat: -rw-r--r-- 3,536 bytes parent folder | download | duplicates (16)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
/*
 *  Program type:   Embedded Static SQL
 *
 *  Description:
 *		This program executes a stored procedure and selects from
 *		a stored procedure.  First, a list of projects an employee
 *		is involved in is printed.  Then the employee is added to
 *		another project.  The new list of projects is printed again.
 * The contents of this file are subject to the Interbase Public
 * License Version 1.0 (the "License"); you may not use this file
 * except in compliance with the License. You may obtain a copy
 * of the License at http://www.Inprise.com/IPL.html
 *
 * Software distributed under the License is distributed on an
 * "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express
 * or implied. See the License for the specific language governing
 * rights and limitations under the License.
 *
 * The Original Code was created by Inprise Corporation
 * and its predecessors. Portions created by Inprise Corporation are
 * Copyright (C) Inprise Corporation.
 *
 * All Rights Reserved.
 * Contributor(s): ______________________________________.
 */

#include "example.h"
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

EXEC SQL INCLUDE SQLCA;

void select_projects (short emp_no);
void get_params (short *emp_no, char* proj_id);
void pr_error (long status);
void add_emp_proj (short emp_no,char * proj_id);



int main (void)
{
	BASED_ON employee.emp_no	emp_no;
	BASED_ON project.proj_id	proj_id;

	/*
	 *	Add employee with id 8 to project 'MAPDB'.
	 */
	get_params(&emp_no, proj_id);

	/*
	 *	Display employee's current projects.
	 */
	printf("\nCurrent projects for employee id: %d\n\n", emp_no);
	select_projects(emp_no);

	/*
	 *	Insert a new employee project row.
	 */
	printf("\nAdd employee id: %d to project: %s\n", emp_no, proj_id);
	add_emp_proj(emp_no, proj_id);

	/*
	 *	Display employee's new current projects.
	 */
	printf("\nCurrent projects for employee id: %d\n\n", emp_no);
	select_projects(emp_no);

}


/*
 *	Select from a stored procedure.
 *	Procedure 'get_emp_proj' gets employee's projects.
 */
void select_projects(BASED_ON employee.emp_no emp_no)
{
	BASED_ON project.proj_id	proj_id;

	EXEC SQL
		WHENEVER SQLERROR GO TO SelError;

	/* Declare a cursor on the stored procedure. */
	EXEC SQL
		DECLARE projects CURSOR FOR
		SELECT proj_id FROM get_emp_proj (:emp_no)
		ORDER BY proj_id;

	EXEC SQL
		OPEN projects;
	
	/* Print employee projects. */
	while (SQLCODE == 0)
	{
		EXEC SQL
			FETCH projects INTO :proj_id;

		if (SQLCODE == 100)
			break;

		printf("\t%s\n", proj_id);
	}

	EXEC SQL
		CLOSE projects;
	
	EXEC SQL
		COMMIT RETAIN;

SelError:
	if (SQLCODE)
		pr_error((long)gds__status);
}


/*
 *	Execute a stored procedure.
 *	Procedure 'add_emp_proj' adds an employee to a project.
 */
void add_emp_proj(BASED_ON employee.emp_no emp_no, BASED_ON project.proj_id proj_id)
{
	EXEC SQL
		WHENEVER SQLERROR GO TO AddError;

	EXEC SQL
		EXECUTE PROCEDURE add_emp_proj :emp_no, :proj_id;

	EXEC SQL
		COMMIT;

AddError:
	if (SQLCODE) 
		pr_error((long)gds__status);
}


/*
 *	Set-up procedure parameters and clean-up old data.
 */
void get_params(BASED_ON employee.emp_no *emp_no, BASED_ON project.proj_id proj_id)
{
	*emp_no = 8;
	strcpy(proj_id, "MAPDB");

	EXEC SQL
		WHENEVER SQLERROR GO TO CleanupError;

	/* Cleanup:  delete row from the previous run. */
	EXEC SQL
		DELETE FROM employee_project
		WHERE emp_no = 8 AND proj_id = "MAPDB";

CleanupError:
	return;
}


/*
 *	Print an error message.
 */
void pr_error(long status)
{
	isc_print_sqlerror(SQLCODE, gds__status);
}