Using Select Procedures in isql
Go Up to Using Stored Procedures
A select procedure is used in place of a table or view in a SELECT statement and can return a single row or multiple rows.
The advantages of select procedures over tables or views are:
- They can take input parameters that can affect the output.
- They can contain logic not available in normal queries or views.
- They can return rows from multiple tables using
UNION.
The syntax of SELECT from a procedure is:
SELECT <col_list> from name ([param [, param …]]) WHERE <search_condition> ORDER BY <order_list>;
The procedure <name> must be specified, and in isql each <param> is a constant passed to the corresponding input parameter. All input parameters required by the procedure must be supplied. The <col_list> is a comma-delimited list of output parameters returned by the procedure, or * to select all rows.
The WHERE clause specifies a <search_condition> that selects a subset of rows to return. The ORDER BY clause specifies how to order the rows returned. For more information on SELECT, see the Language Reference.
- Note: The following code defines the procedure,
GET_EMP_PROJ,which returnsEMP_PROJ, the project numbers assigned to an employee, when it is passed the employee number,EMP_NO, as the input parameter.
CREATE PROCEDURE GET_EMP_PROJ (EMP_NO SMALLINT) RETURNS (EMP_PROJ SMALLINT) AS BEGIN FOR SELECT PROJ_ID FROM EMPLOYEE_PROJECT WHERE EMP_NO = :EMP_NO INTO :EMP_PROJ DO SUSPEND; END ;
The following statement selects from GET_EMP_PROJ in isql:
SELECT * FROM GET_EMP_PROJ(24);
The output is:
PROJ_ID ======= DGPII GUIDE
The following select procedure, ORG_CHART, displays an organizational chart:
CREATE PROCEDURE ORG_CHART RETURNS (HEAD_DEPT CHAR(25), DEPARTMENT CHAR(25), MNGR_NAME CHAR(20), TITLE CHAR(5), EMP_CNT INTEGER) AS DECLARE VARIABLE MNGR_NO INTEGER; DECLARE VARIABLE DNO CHAR(3); BEGIN FOR SELECT H.DEPARTMENT, D.DEPARTMENT, D.MNGR_NO, D.DEPT_NO FROM DEPARTMENT D LEFT OUTER JOIN DEPARTMENT H ON D.HEAD_DEPT = H.DEPT_NO ORDER BY D.DEPT_NO INTO :HEAD_DEPT, :DEPARTMENT, :MNGR_NO, :DNO DO BEGIN IF (:MNGR_NO IS NULL) THEN BEGIN MNGR_NAME = '--TBH--'; TITLE = ''; END ELSE SELECT FULL_NAME, JOB_CODE FROM EMPLOYEE WHERE EMP_NO = :MNGR_NO INTO :MNGR_NAME, :TITLE; SELECT COUNT(EMP_NO) FROM EMPLOYEE WHERE DEPT_NO = :DNO INTO :EMP_CNT; SUSPEND; END END ;
ORG_CHART is invoked from
isql as follows:
SELECT * FROM ORG_CHART;
For each department, the procedure displays the department name, the department’s “head department” (managing department), the department manager’s name and title, and the number of employees in the department.
HEAD_DEPT ================ |
DEPARTMENT =============== |
MNGR_NAME ============= |
TITLE ===== |
EMP_CNT ====== |
|
|
|
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ORG_CHART must be used as a select procedure to display the full organization. If called with EXECUTE PROCEDURE, then the first time it encounters the SUSPEND statement, the procedure terminates, returning the information for Corporate Headquarters only.
SELECT can specify columns to retrieve from a procedure. For example, if ORG_CHART is invoked as follows:
SELECT DEPARTMENT FROM ORG_CHART;
then only the second column, DEPARTMENT, is displayed.