17.07.2015 Views

Oracle Rdb7 SQLプログラミングのためのガイド, リリース ... - 日本オラクル

Oracle Rdb7 SQLプログラミングのためのガイド, リリース ... - 日本オラクル

Oracle Rdb7 SQLプログラミングのためのガイド, リリース ... - 日本オラクル

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

<strong>Oracle</strong> <strong>Rdb7</strong>SQL 7.02001 12 : J03807-01


<strong>Oracle</strong> <strong>Rdb7</strong> SQL , 7.0 : J03807-01<strong>Oracle</strong> <strong>Rdb7</strong> Guide to SQL Programming Release7.0A42867-1Copyright © 1996, 2001, <strong>Oracle</strong> Corporation. All rights reserved.Printed in Japan.* <strong>Oracle</strong> Corporation <strong>Oracle</strong> CorporationRestricted Rights Legend Restricted Rights LegendPrograms delivered subject to the DOD FAR Supplement are "commercial computer software" and use,duplication and disclosure of the Programs shall be subject to the licensing restrictions set forth in theapplicable <strong>Oracle</strong> license agreement. Otherwise, Programs delivered subject to the Federal AcquisitionRegulations are "restricted computer software" and use, duplication and disclosure of the Programs shallbe subject to the restrictions in FAR 52.227-14, Rights in Data -- General, including Alternate III (June1987). <strong>Oracle</strong> Corporation, 500 <strong>Oracle</strong> Parkway, Redwood City, CA 94065.


......................................................................................................................................................................... xiii ....................................................................................................................................... xiii ................................................................................................................................................................... xiii ................................................................................................................................................... xiv ........................................................................................................................................................ xvSQL ................................................................................................................................................................... xv .................................................................................................................................................................... xv .......................................................................................................................................... xvii I SQL 1 SQL 1.1 2 SQL ........................................................................................... 1-21.1.1 SQL ............................................................................................................. 1-21.1.2 SQL ............................................................................................................................. 1-31.2 ..................................................................................................... 1-31.3 ................................................................................................. 1-5 II SQL 2 SQL 2.1 ......................................................................................... 2-22.2 ..................................................................................................................... 2-22.3 ............................................................................................................................. 2-32.4 ......................................................................................................................................... 2-3i


2.5 ..................................................................... 2-52.6 ......................................................................................................... 2-63 SQL 3.1 SQL : ........................................ 3-23.2 SQL ....................................................................................... 3-43.2.1 SQL ..................................................................... 3-63.2.2 .................................................................................................................................. 3-63.2.3 dialect .......................................................................................................... 3-73.2.4 ...................................................................... 3-73.2.5 .......................................................... 3-83.2.6 ...................................................................................................................................... 3-93.2.7 ...................................................................................................................................... 3-93.2.8 Authorization Identifier ............................................................................. 3-103.2.9 ................................................................................................................................ 3-103.2.10 .................................................................................................. 3-113.2.11 DECLARE ......................................................................................... 3-113.3 SQL ............................................ 3-123.4 SQL ............................................. 3-143.5 SQL ................................................................................. 3-144 SQL 4.1 SQL ................................................................................................... 4-24.2 SQL ........................................................................... 4-34.2.1 .............................................................................................................................. 4-34.2.2 ...................................................................................................... 4-44.2.3 .................................................................. 4-54.2.4 .......................................................................... 4-94.2.5 ............................................................................................................ 4-104.2.6 LANGUAGE .......................................................................... 4-114.2.7 LANGUAGE .................................................. 4-124.2.8 ................................ 4-134.2.9 ........................ 4-144.3 SQL ................................................................................................ 4-144.4 ....................................................................................... 4-15ii


4.5 SQL ......................................................................................................... 4-165 SQL 5.1 SQL ........................................................................................................... 5-25.2 SQL ....................................................................................... 5-35.3 ..................................................................................... 5-45.4 SQL ...................... 5-45.5 SQL ....................................................................... 5-55.6 SQL ............................................................................................................... 5-66 SQL 6.1 ............................................................................................................. 6-26.2 SQL .................................................................................................. 6-36.3 ..................................................................................................................................... 6-66.4 ............................................................................... 6-106.5 ....................................... 6-106.6 ............................................................................................... 6-116.6.1 DECLARE MODULE ................................................................................................. 6-116.6.2 SQL ............................................................... 6-126.7 SQL ............................................................. 6-136.7.1 Ada SQL ................................................................................. 6-146.7.2 Ada ................................................................................................... 6-146.7.3 C SQL ...................................................................................... 6-166.7.4 COBOL SQL ........................................................................... 6-186.7.5 FORTRAN SQL ..................................................................... 6-206.7.6 Pascal SQL .............................................................................. 6-226.7.7 PL/I SQL ................................................................................ 6-237 7.1 ......................................................................................................... 7-27.2 OpenVMS Linker ....................................................................................................................... 7-27.2.1 OpenVMS VAX Compaq Tru64 C ....................................................................................................................................... 7-37.2.2 .............................................................. 7-37.2.3 Ada ................................................................................................................. 7-4iii


7.3 ................................................................................................................................. 7-57.3.1 .......................... 7-67.3.2 .............................. 7-77.4 ............................................................................................................... 7-107.5 CompaqTru64 UNIX .................................................................................... 7-107.5.1 ............................................................................ 7-117.6 SQL ............ 7-127.7 ........................................................................................................................................... 7-127.8 SQL ................................................................................................. 7-138 8.1 ............................................................................................................. 8-28.2 ..................................................................................................................................................... 8-38.3 ................................................................................................................. 8-38.4 ......................................................................................................................... 8-58.5 ......................................................................... 8-88.6 SQL INCLUDE ....................................................................................................................... 8-88.6.1 SQL INCLUDE FROM DICTIONARY ...................................................................... 8-98.6.2 INCLUDE SQLCA ...................................................................................................... 8-108.6.3 INCLUDE SQLD SQLDA2 ...................................................................... 8-118.6.4 INCLUDE .................................................................................................... 8-118.7 SQL FROM path-name ........................................................................... 8-118.8 COPY INCLUDE .................................................................................... 8-128.9 ....................................................................................................... 8-128.9.1 ................................................................................................................ 8-138.9.2 ........................................................................................................ 8-158.10 ......................................................................................... 8-188.10.1 .................................................................................................. 8-188.10.2 .......................................................................................... 8-208.10.3 .............................................................................................. 8-218.10.4 .......................................................................................... 8-228.11 ................................................................................. 8-248.11.1 SQL .................................................................................... 8-268.11.2 SQL ............................................................................. 8-268.12 ................................................................................. 8-278.12.1 Ada ......................................... 8-27iv


8.12.2 C .............................................. 8-278.12.3 COBOL ................................... 8-308.12.4 FORTRAN ............................. 8-308.12.5 Pascal ...................................... 8-318.12.6 PL/I ........................................ 8-318.12.7 SQL ............. 8-319 9.1 ......................................................................................................... 9-29.2 ............................................................................................. 9-39.2.1 .......................................................................... 9-49.2.2 SQL ................................................................. 9-59.2.3 SQL ................................................................. 9-89.3 ................................................................................... 9-129.4 ................................................................................................... 9-139.5 DATE VMS ....................................................................... 9-149.5.1 OpenVMS DATE VMS ..................................... 9-159.5.2 DATE VMS .......................................................... 9-159.6 SQL ............................................................................................ 9-179.6.1 CAST ........................................................................... 9-179.6.2 SQL .................................................................. 9-19 III 10 10.1 SQL ................................................................................................................................ 10-210.2 SQL ............................................................................................................... 10-410.2.1 SQLSTATE .................................................................................................................... 10-510.2.2 SQLCODE ...................................................................................................................... 10-610.2.3 WHENEVER ........................................................................................................... 10-1010.2.4 sql_get_message_vector RDB$LU_STATUS ..................................... 10-1310.2.5 SQL ........................................................................................... 10-1810.3 ....................................................................................................................... 10-2710.3.1 sql_signal ......................................................................................................................... 10-2710.3.2 sql_get_error_text ........................................................................................................... 10-28v


10.3.3 ........................................................................ 10-3010.3.4 SQL .................................................................. 10-3010.4 ............................................................................................................... 10-3110.4.1 .................................................................................... 10-3110.4.2 ................................................................................................................................ 10-3210.5 ....................................................................................................... 10-3210.5.1 ............................................................................................................ 10-3210.5.2 ........................................................................................................ 10-3410.6 ........................................... 10-3510.7 ........................................................................... 10-3611 SQL11.1 SQL ........................................................................................................................................... 11-211.1.1 SQL ............................................................................................ 11-211.1.2 SQL SQL .......................................................................................... 11-411.1.3 SQL SQL .................................................................................................. 11-511.2 SELECT SQL ......................................................... 11-511.3 ..................................................................................... 11-811.3.1 SQLDA SQLDA2 ..................................................................................... 11-911.3.2 SQLDA SQLDA2 ........................................................................................... 11-1011.4 SELECT SQL ....................................................... 11-1311.5 SELECT ...................................................................................................................... 11-1711.6 SELECT ...................................................................................................................................... 11-1911.6.1 SELECT : ........................................................................................................................... 11-1911.6.2 SELECT ....................................................................... 11-2211.6.3 SQLDA2 SQLERRD SELECT ..... 11-2911.7 SQL ............................................................................................................. 11-3211.7.1 ........................................................................................................ 11-3211.7.2 SELECT SQL ..................................................................................... 11-3311.7.3 SELECT ............................................................................................................... 11-3511.8 ........................................................................... 11-39vi


IV 12 SQL 12.1 ................................................................................................................................................. 12-212.2 ......................................................................................................... 12-212.3 ................................................................................................................................................. 12-312.3.1 .......................................................................................................................... 12-412.3.2 IF ................................................................................................................................. 12-612.3.3 CASE .......................................................................................................................... 12-812.3.4 LOOP .......................................................................................................................... 12-912.3.5 FOR ........................................................................................................................... 12-1012.3.6 ........................................................................................................ 12-1212.3.7 LEAVE ..................................................................................................................... 12-1312.3.8 ................................................................ 12-1412.4 ........................................................................................................................... 12-1512.5 ....................................................................................................... 12-1712.6 ................................................................................................................................... 12-1812.7 ....................................................................................................................................... 12-1812.8 ....................................................................................................................... 12-2112.9 ....................................................................................................................... 12-2212.9.1 ................................................................................................................................ 12-2212.9.2 ................................................................................................................................ 12-2313 13.1 ..................................................................................................................... 13-213.2 ................................................................................................. 13-213.3 ..................................................................................................................... 13-313.3.1 ...................................................................................................... 13-513.3.2 .................................................................................................. 13-713.3.3 .......................................................... 13-913.4 ............................................................................................................... 13-1013.5 ........................................................................................................... 13-1213.6 ....................................................................................................................... 13-1213.7 ....................................................................................................... 13-1313.7.1 ........................................................................................................ 13-15vii


13.7.2 ............................................................................................ 13-1613.7.3 ................................................................................................ 13-1713.8 ................................................................................................................... 13-1813.9 ............................................................................................................... 13-2013.9.1 ............................................................................ 13-2113.9.2 .................... 13-2214 14.1 ..................................................................................................................................... 14-214.2 ..................................................................................................................................... 14-314.3 ............................................................................................................................. 14-414.3.1 ...................................................................................................................... 14-414.3.2 .......................................................................................................... 14-614.4 ................................................................................................................. 14-814.5 ..................................................................................................................................... 14-914.5.1 .............................................................................. 14-914.5.2 ............................................................................................ 14-1214.5.3 .................................................................... 14-1614.5.4 ........................................................ 14-2314.6 ............................................................................................... 14-2514.6.1 OpenVMS VAX ...................................... 14-2614.6.2 OpenVMS Alpha .................................... 14-2714.7 Compaq Tru64 UNIX ................................................................... 14-2914.8 ................................................................................................................................... 14-3014.8.1 ................................................................................................................................ 14-3014.8.2 .................................................................................................... 14-3114.8.3 ................................................................................................................ 14-3214.9 ....................................................................................................................... 14-3214.10 ......................................................................................... 14-3414.11 ............................................................................................. 14-3614.12 ..................................................................... 14-3814.12.1 Ada ............................................................................................. 14-3814.12.2 C .................................................................................................. 14-3914.12.3 COBOL ....................................................................................... 14-4014.12.4 FORTRAN ................................................................................. 14-4014.12.5 Pascal .......................................................................................... 14-40viii


14.13 ......................................................................................................................... 14-4114.14 ..................................................................................................................... 14-4214.15 ................................................................................................................. 14-4314.16 ............................................................................................. 14-4414.17 ..................................................................................................... 14-45 V 15 15.1 ......................................................................................................................... 15-115.1.1 .............................. 15-115.1.2 ...................................................................................................................... 15-215.1.3 .................................................................. 15-315.2 ............................................................................................. 15-415.2.1 USER USING ...................................... 15-615.2.2 ...................................................................... 15-715.2.3 .............................................................................. 15-815.2.4 .............................. 15-815.2.5 RDB$REMOTE .................... 15-915.2.6 UCX ......................................................... 15-1015.3 ........................................................................................................... 15-1115.4 ............................................................................... 15-1115.4.1 ............................................ 15-1115.4.2 .................................................................... 15-1115.5 ................................................................................................................... 15-1215.6 ........................................................................................................................... 15-1516 16.1 ......................................................................................................................... 16-216.1.1 .................................................................................................................. 16-216.1.2 .......................................................................................... 16-416.2 SQL ....................................................................... 16-516.2.1 ...................................................................................... 16-616.2.2 / ............................................................................. 16-816.2.3. ..................................................................................... 16-8ix


16.2.4 RESERVING ............................................................................................................ 16-1016.2.5 ............................................................................................ 16-1216.2.6 ............................................................................................................................ 16-1416.2.6.1 ............................................................................. 16-1516.2.6.2 ................................................................. 16-1516.2.6.3 ................................................................. 16-1716.2.7 ................................................................................................ 16-1916.2.8 1 ....................................................................................................................................... 16-2116.3 ....................................................................................... 16-2116.4 ........................................................................................................... 16-2416.5 ........................................................................................................... 16-2516.5.1 .................................................................................................................................... 16-2516.5.2 .................................................................................................................................... 16-2616.5.3 .................................................................................................................................... 16-2816.5.4 ................................................ 16-3016.5.5 ............................................................ 16-3016.5.6 ........................................................................................................................ 16-3116.6 I/O ....................................................................................... 16-3316.7 ........................................................................................................... 16-3916.7.1 ........................................................................................................ 16-4016.7.2 ............................................................................ 16-4116.8 ....................................................................................... 16-4217 17.1 ................................................................................................................................................. 17-217.1.1 .............................................................................................................................. 17-217.1.2 .................................................................................................................. 17-317.1.3 .......................................................................................................................................... 17-417.2 ......................................................................................................................... 17-517.2.1 .......................................................................................................................................... 17-517.2.2 .......................................................................................... 17-617.2.3 .................................................................. 17-717.2.4 .......................................................................................................................... 17-817.2.5 ...................................................................................................................................... 17-917.2.6 ........................................................................................................................................ 17-10x


17.3 ............................................................................................... 17-1017.4 ........................................................................................... 17-1117.4.1 ................................................ 17-1117.4.2 ................................................ 17-1117.5 ................................................................................................... 17-11 VI 18 18.1 ......................................................................................................................................... 18-218.1.1 .................................................................................................................................. 18-218.1.2 .................................................................................................................. 18-518.1.3 ...................................................................................................................... 18-518.2 ............................................................................................................................................. 18-618.3 ..................................................................................................... 18-818.4 ................................................................................................................. 18-918.5 ................................................................................................................... 18-1118.6 ................................................................................................................... 18-1318.7 ................................................................................... 18-1518.8 ........................................................................................................................... 18-1718.9 ................................................................................................................... 18-1819 19.1 ................................................................................................................................. 19-219.2 ......................................................................................................................................................... 19-219.2.1 INSERT...VALUES ................................................................................................... 19-219.2.2 INSERT...SELECT ..................................................................................................... 19-319.3 ......................................................................... 19-419.4 ......................................................................................................................................................... 19-519.4.1 UPDATE ........................................................................................................ 19-519.4.2 UPDATE ................................................................................................... 19-619.4.3 UPDATE...RETURNING ......................................................................................... 19-719.5 ......................................................................................................................................................... 19-819.6 ................................................................................................................................. 19-919.7 ................................................................................. 19-9xi


20 20.1 ................................................................................................. 20-220.2 SQL ............................... 20-320.2.1 SQL ............................................................................................. 20-320.2.2 SQL C ........ 20-420.3 SQL ............................................... 20-620.3.1 SQL ......................................................................... 20-720.3.2 .................................. 20-8ASQL A.1 ............................................................................................................................ A-2A.2 ................................................................................................................................................ A-3A.3 ........................................................................................................................................ A-3A.4 <strong>Oracle</strong> Rdb .......................................................................................... A-4xii


SQL (Structured Query Language: ) <strong>Oracle</strong> Rdb SQL ■■■1 SQL SQL <strong>Oracle</strong> <strong>Rdb7</strong> Introduction to SQLSQL xiii


SQL 1 1-1 SQL SQL 2 2-1 SQL 3 3-1 SQL 4 4-1 SQL SQL 5 5-1 SQL 6 6-1 SQL SQL 7 7-1 8 8-1 9 9-1 10 10-1 11 11-1 SQL 12 12-1 13 13-1 14 14-1 15 15-1 xiv


16 16-1 17 17-1 SQL 18 18-1 19 19-1 20 20-1 AA-1 SQL <strong>Oracle</strong>Rdb <strong>Oracle</strong> Rdb ■ <strong>Oracle</strong> <strong>Rdb7</strong> Introduction to SQL■<strong>Oracle</strong> <strong>Rdb7</strong> SQL Reference Manual<strong>Oracle</strong> <strong>Rdb7</strong> Release Notes<strong>Oracle</strong> Rdb SQL SQL (DDL) (DML) SQL <strong>Oracle</strong> Rdb SQL SQL ANSI X3.135-1992ISO 9075:1992 ANSI/ISO SQL SQL92 <strong>Oracle</strong> Rdb <strong>Oracle</strong> Rdb for OpenVMS <strong>Oracle</strong> Rdb 7.0 V7.0 <strong>Oracle</strong> CDD/Repository xv


<strong>Oracle</strong> Rdb 6.0 7.0 ■■■■■■SQL DECLARE CURSOR WITH HOLD SQL 18.5 18-111 SQL <strong>Oracle</strong> Rdb 1 13 13-1SQL RETURN 13.3.2 13-7 CALL CALL CALL 12.3.812-14 SIGNAL SIGNAL SIGNAL SQLSTATE 1 SQLSTATE 12.9 12-22SQL SQL C FORTRAN 3GL 14 14-1xvii


■■■■■■■■DROP MODULE CASCADE 13.6 13-1213.6 13-12 14.4 14-8 DEFAULTCONSTANTUPDATABLE 12.3.1 12-4 Compaq Tru64 C SQL SQL 6.7.3 6-16C sql_sqlda.h C SQLDA SQLDA2 SQL EXEC SQL INCLUDE SQLDA EXEC SQL INCLUDE SQLDA2 11.3.2 11-10SQLCA C SQL SQLCA EXTERNAL EXEC SQL INCLUDESQLCA 8.6.2 8-10SQL SQL SQL SET FLAGS SETFLAGS 12.7 12-18SQL_ALTERNATE_SERVICE_NAME SQL_ALTERNATE_SERVICE_NAME TCP/IP OpenVMS Compaq Tru64 UNIX TCP/IP OpenVMS 15.2.6 15-10 6.1 ■Compaq Tru64 UNIX SQL Compaq Tru64 UNIX CompaqTru64 UNIX SQL xviii


1SQL <strong>Oracle</strong> Rdb SQL ■■■ SQL SQL SQL <strong>Oracle</strong> Rdb SQL SQL 2 SQL 1-1


1.3 1-6 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


IISQL 2 SQL ■■■■■■SQL SQL SQL SQL


2SQL SQL SQL SQL SQL ■■■■■■SQL 2-1


2.1 2.1 2-12-2 2.1 15 243NU-2539A-RA2.2 SQL 2-2 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


2.4 <strong>Oracle</strong> Rdb 2.3 SQL ■■■■■■ SQL SHOW SELECT 2.4 SQL SQL SQL SQL 2-3


2.4 ■■■■ SQL SQL EDIT SQL SQL 2-22-4 2-2 SQL SQLSQL . . .SQL> SELECT.....SQL.SELECT....SQL.EXEC SQL SELECT....SQL<strong>Oracle</strong> RdbSQL<strong>Oracle</strong> RdbNU-2406A-RA2-4 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


2.5 2.5 SQL 1 SQL ■■■■■■ SQL NULL 8 8-110 10-1 SQL SQL <strong>Oracle</strong> <strong>Rdb7</strong> SQL Reference ManualSQL 2-5


2.6 2.6 1. 2. 3. 4. SQL 3 3-1 5 5-1SQL 66-12-6 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


3SQL SQL SQL SQL ■■■■■SQL SQL SQL SQL SQL 3-1


3.1 SQL : 3.1 SQL : SQL 1 SQL 1 SQL 3GL <strong>Oracle</strong> Rally SQL 3-13-3SQL 1. SQL SQL SQL SQL 1 1 SQL SQL 2. SQL SQL SQL SQL SQL <strong>Oracle</strong> <strong>Rdb7</strong> SQL Reference Manual3. SQL SQL SQL • C ompa q Tru64 UNIX4. OpenVMS OpenVMS SQL CompaqTru64 UNIX Compaq Tru64 CCompaq Tru64 UNIX CCompaqTru64 COBOLCompaq Tru64 FORTRAN Compaq Tru64 Pascal SQL 5. 3-2 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


3.1 SQL : 6. 7. SQL 8. 9. 1 3-1 SQL 142536YesNoNo Yes789YesYes9NoNU-2542A-RASQL 3-3


3.2 SQL 3.2 SQL SQL SQL SQL SQL SQL ■■■■■■■■■■■MODULE DIALECT CHARACTER SET LANGUAGE CATALOG SCHEMA AUTHORIZATION ALIAS ■DECLARE ■ 1 SQL 1 SQL 1 3.2.1 3-6 3.2.11 3-11SQL 4 4-1SQL 3-13-4 SQL 3-1 SQL -- The procedures in this SQL module are called by the C program (1)3-6-- sql_intro_load_empl_h.c.--------------------------------------------------------------------------------- Header Information Section-----------------------------------------------------------------------------3-4 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


3.2 SQL (2)3-6MODULE INTRO_LOAD_EMPL_C -- Module nameDIALECTSQL92LANGUAGE C -- Language of calling programAUTHORIZATION SAMPLE_USER -- Authorization IDALIAS RDB$DBHANDLE -- Default aliasPARAMETER COLONS-- Parameters are prefixed by colons------------------------------------------------------------------------------- DECLARE Statements Section------------------------------------------------------------------------------- Declare the alias using the file name.DECLARE ALIAS FOR FILENAME intro_personnel (3)3-6------------------------------------------------------------------------------- Procedure Section-- In every procedure, declare SQLCODE, a parameter that stores a value-- that represents the execution status of SQL statements.------------------------------------------------------------------------------- This procedure uses the executable statement, SET TRANSACTION, to start-- a transaction. The EMPLOYEES, JOB_HISTORY, and DEPARTMENTS tables are-- reserved because they are used in constraint checking.PROCEDURE SET_TRANS (4)3-6(SQLCODE);SET TRANSACTION READ WRITE RESERVINGEMPLOYEES FOR EXCLUSIVE WRITE,JOB_HISTORY FOR SHARED READ,DEPARTMENTS FOR SHARED READ;-- This procedure inserts the employee data into the EMPLOYEES table.PROCEDURE INSERT_DATA (4)3-6(SQLCODE-- Declare the parameters by which the values are passed between the SQL-- module and the host language.:EMPLOYEE_RECORD RECORDP_EMPLOYEE_ID CHAR(5),P_LAST_NAME CHAR(14),P_FIRST_NAME CHAR(10),P_MIDDLE_INITIAL CHAR(1),P_ADDRESS_DATA CHAR(25),P_CITYCHAR(20),P_STATECHAR(2),P_POSTAL_CODE CHAR(5),P_BIRTHDAY CHAR(10),P_SEXCHAR(1)END RECORD);-- The list of names that follows the INSERT clause identifies the columns-- in the table that are to be used for the insert operation.-- The list of names in the VALUES clause corresponds to the variables-- declared in the procedure.SQL 3-5


3.2 SQL INSERT INTO EMPLOYEES(EMPLOYEE_ID, LAST_NAME, FIRST_NAME, MIDDLE_INITIAL,ADDRESS_DATA, CITY, STATE, POSTAL_CODE, BIRTHDAY, SEX )VALUES(:EMPLOYEE_RECORD.P_EMPLOYEE_ID, :EMPLOYEE_RECORD.P_LAST_NAME,:EMPLOYEE_RECORD.P_FIRST_NAME, :EMPLOYEE_RECORD.P_MIDDLE_INITIAL,:EMPLOYEE_RECORD.P_ADDRESS_DATA, :EMPLOYEE_RECORD.P_CITY,:EMPLOYEE_RECORD.P_STATE, :EMPLOYEE_RECORD.P_POSTAL_CODE,CAST(:EMPLOYEE_RECORD.P_BIRTHDAY AS DATE ANSI),:EMPLOYEE_RECORD.P_SEX );... 3-13-4(1) (2) (3) (4) 3.3 3-12 SQL 3-13-4 SQL sql_intro_load_empl_c.sqlmod 3.2.1 SQL 3.2.2 (--) SQL 3-13-4SQL MODULE MSDB_MOD MODULE MSDB_MOD -- Module nameSQL SQL_MODULE MODULE 1 3-6 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


3.2 SQL SQL SQL 3.2.3 dialectDIALECT ■■■■■■■"DATE CURRENT_TIMESTAMP VMS ANSI/ISO SQL92 DIALECT SQL92 -- Set the dialect.DIALECT 1 SQL92SQL89MIA SQLV40 SQLV40 SQL92 MIA <strong>Oracle</strong> <strong>Rdb7</strong> SQL Reference Manual SET DIALECT DIALECT SQL 3.2.4 SQL ■SQL 3-7


3.2 SQL ■■■ASCII NCHAR NCHAR VARYING <strong>Oracle</strong> <strong>Rdb7</strong> SQL Reference Manual KANJI DEFAULT CHARACTER SET KANJI -- Set the default character setSQL SET MIA DEC_MCS MIA 3.2.5 LANGUAGE ADABASICCCOBOLFORTRANPASCALPLI (PL/I ) GENERAL 1 LANGUAGE C -- Language of calling program SQL SQL LANGUAGE GENERAL 3-8 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


3.2 SQL 3.2.6 CATALOG SQL CATALOG SQL RDB$CATALOGRDB$CATALOG SQL ADMINISTRATION CATALOG CATALOG ADMINISTRATIONPERSONNEL EMPLOYEESSELECT * FROM PERSONNEL.EMPLOYEES;SCHEMA 3.2.7 3-9 SQL SQL CATALOG 3.2.7 SCHEMA SQL SCHEMA SQL AUTHORIZATION SQL SCHEMA SQL 3-9


3.2 SQL SQL ADMINISTRATION PERSONNEL CATALOG ADMINISTRATIONSCHEMA PERSONNELADMINISTRATION PERSONNEL EMPLOYEES SELECT * FROM EMPLOYEES;SCHEMA 3.2.8 Authorization Identifier AUTHORIZATION SQL RIGHTS SQL RIGHTS SQL ANSI/ISO SQL AUTHORIZATION SAMPLE_USER -- Authorization IDSCHEMA ALIAS 3.2.9 ALIAS SQL AUTHORIZATIONSQL RDB$DBHANDLE 2 ALIAS 3-10 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


3.2 SQL ALIAS RDB$DBHANDLE -- Default alias<strong>Oracle</strong> Rdb SQL SQL AUTHORIZATION RDB$DBHANDLE RDB$DBHANDLE SQL 3.2.10 SQL PARAMETER COLONS :PARAMETER COLONS-- Parameters are prefixed by colonsSQL ANSI/ISO SQL <strong>Oracle</strong> Rdb PARAMETER COLONS SQL92 PARAMETER COLONS SQL 3.2.11 DECLARE SQL DECLARE ■■DECLARE ALIAS 1 DECLARE ALIAS SQL$DATABASE SQL_DATABASE DECLARE ALIAS 15.1 15-1DECLARE CURSOR DECLARE CURSOR DECLARE CURSOR 18 18-1SQL 3-11


3.3 SQL ■■■DECLARE STATEMENT SQL SQL 1111-1DECLARE TABLE SQL SQL SQL DECLARETABLE DECLARE TRANSACTION SQL SET TRANSACTION DECLARE TRANSACTION 16 16-1SQL DECLARE ;3.3 SQL SQL 3-23-12C sql_intro_load_empl_h.c 3-13-4 SQL sql_intro_load_empl_c.sqlmod 3-2 SQL .../*This structure represents the record to be inserted into the database.Character strings are one character longer to hold the null value thatterminates the string. */3-12 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


3.3 SQL struct Employee_struct {char employee_id[6];char last_name[15];char first_name[11];char middle_initial[2];char address_data[26];char city[21];char state[3];char postal_code[6];char ascii_birthdate[11];char sex[2];};/* This structure represents the format of each record in the stream file. */struct Employee_struct_buf {char employee_id[5];char last_name[14];char first_name[10];char middle_initial[1];char address_data[25];char city[20];char state[2];char postal_code[5];char ascii_birthdate[10];char sex[1];char linefeed[1];};/* Return status and SQLCODE variables for error handling. */int return_status;long sqlcode;/* Function prototypes */void SET_TRANS (long *sqlcode);void INSERT_DATA (long *sqlcode, struct Employee_struct *employee_rec_prt);void COMMIT_TRANS (long *sqlcode);.../* Start the transaction by calling the SQL module language procedureSET_TRANS in sql_intro_empl_h.sqlmod. If the call to SET_TRANS returnsa value other than 0, use sql_signal to display the error. */SET_TRANS(&sqlcode);if (sqlcode != 0){printf("¥nStart transaction failed.¥n");sql_signal();}...SQL 3-13


3.4 SQL /* Invoke the INSERT_DATA procedure to insert a row in the EMPLOYEES table.The date is converted from text to binary by the CAST function in the SQLprocedure. If the call to INSERT_DATA returns a value other than 0,use sql_signal to display the error. */INSERT_DATA (&sqlcode, &employee_rec);if (sqlcode != 0) sql_signal();}/* Commit the transaction by calling the SQL module language procedure.COMMIT_TRANS. */COMMIT_TRANS(&sqlcode);...3.4 SQL 1 SQL SQL SQL ANSI/ISO SQL ANSI/ISO <strong>Oracle</strong> Rdb FLAG_NONSTANDARD -std SQL SQL 3.5 SQL SQL ■■■■■ 4 4-1 SQL SQL 5 5-1SQL 7 7-1SQL SQL about_sql_examples.txt <strong>Oracle</strong> <strong>Rdb7</strong> SQL Reference ManualSQL 3-14 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


4SQL SQL SQL SQL 3 3-1■■■■■SQL SQL SQL SQL SQL 4-1


4.1 SQL 4.1 SQL SQL SQL SQL ■■■■■ PROCEDURE1 1 SQL 1 SQL 4.2 4-32 ■ SQL SET_TRANS / PROCEDURE SET_TRANS(SQLSTATE);SET TRANSACTION READ WRITE;4.3 4-14■ 1 SQL SQL IF FOR 2 INSERT PROCEDURE INSERT_DATA-- Declare the parameters by which the values are passed between the SQL-- module and the host language.(SQLSTATE,:P_EMPLOYEE_ID CHAR(5),:P_LAST_NAME CHAR(14),:P_FIRST_NAME CHAR(10),:P_JOB_CODE CHAR(4),:P_DEPARTMENT_CODE CHAR(4));BEGININSERT INTO EMPLOYEES4-2 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


4.2 SQL (EMPLOYEE_ID, LAST_NAME, FIRST_NAME)VALUES(:P_EMPLOYEE_ID, :P_LAST_NAME, :P_FIRST_NAME);INSERT INTO JOB_HISTORY(EMPLOYEE_ID, JOB_CODE, JOB_START, DEPARTMENT_CODE)VALUES(:P_EMPLOYEE_ID, :P_JOB_CODE, CURRENT_TIMESTAMP, :P_DEPARTMENT_CODE);END;4.4 4-1512 12-14.2 SQL ■■■■■PROCEDURE SQL SQL BY DESCRIPTOR 4.2.1 SQL PROCEDURE SQL SQL SQL 1 SQL 4-3


4.2 SQL C ompa q Tru64 UNIXCompaqTru64 UNIX CompaqTru64 UNIX SQL SQL C SQL C ■■ SQL -lc_proc 4.2.2 SQL SQL ■ 1 ■■■SQLCODESQLCASQLSTATE<strong>Oracle</strong> Rdb SQLSTATE SQLSTATE SQLCODE ANSI/ISO SQL SQLCA ANSI/ISO SQL 10 10-1■■■ WHERE HAVING 4.2.5 4-10 NULL NULL 8.10 8-184-4 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


4.2 SQL ■■ SQLDASQLDASQL SQL SQL SQLDA SQLDA 11 11-1 SQLDA2SQLDA2SQL 2SQLDA SQLDA2 SQL SQLDA SQLDA2 ■■■ 30 8 CHARCHAR VARYINGCHARACTERCHARACTERVARYINGVARCHAR LONG VARCHAR 8 65,535 SQL SQLDA2 SQLDA2 11 11-1SQL SQLSTATESQLCODESQLCASQLDA SQLDA2SQL ANSI/ISO <strong>Oracle</strong> Rdb :, 1 ;4.2.3 SQL ■SQL DECLAREALIAS SQL SQL DECLARE ALIAS SQL 4-5


4.2 SQL 4-14-6sql_insert_degrees_module.sqlmod 4-1 SQL -- This SQL module accepts the database name at run time.---------------------------------------------------------------------- Header Information Section--------------------------------------------------------------------MODULE sql_insert_degrees_mod_param -- Module nameLANGUAGE COBOL -- Language of calling programAUTHORIZATION RDB$DBHANDLE-- Authorization identifierPARAMETER COLONS-- Use colons----------------------------------------------------------------------- DECLARE statement section---------------------------------------------------------------------DECLARE ALIAS FOR COMPILETIME FILENAME personnelRUNTIME FILENAME :DB_NAME----------------------------------------------------------------------- PROCEDURE SECTION---------------------------------------------------------------------PROCEDURE INSERT_DEGREES(:DB_NAME CHAR(80),SQLCODE,:P_EMPLOYEE_ID CHAR(5),:P_COLLEGE_CODE CHAR(4),:P_YEAR_GIVEN SMALLINT,:P_DEGREE CHAR(3),:P_DEGREE_FIELD CHAR(15));INSERT INTO DEGREES(EMPLOYEE_ID, COLLEGE_CODE, YEAR_GIVEN,DEGREE, DEGREE_FIELD)VALUES(:P_EMPLOYEE_ID, :P_COLLEGE_CODE, :P_YEAR_GIVEN,:P_DEGREE, :P_DEGREE_FIELD);PROCEDURE START_TRANS(:DB_NAME CHAR(80),SQLCODE);SET TRANSACTION READ WRITE;PROCEDURE COMMIT(:DB_NAME CHAR(80),SQLCODE);COMMIT; SQL 4-24-7 SQL 4-6 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


4.2 SQL sql_insert_degrees_program.cob 4-2 SQL ...* Declare the database name.01 P_DB_NAME PIC X(80)....GET_DATABASE.DISPLAY " Enter the database name".ACCEPT P_DB_NAME....CALL "START_TRANS" USING P_DB_NAME, SQLCODE.CALL "INSERT_DEGREES" USING P_DB_NAME, SQLCODE, P_EMPLOYEE_ID,P_COLLEGE_CODE, P_YEAR_GIVEN, P_DEGREE, P_DEGREE_FIELD.CALL "COMMIT" USING P_DB_NAME, SQLCODE.■COMMIT ROLLBACK DECLARE ALIAS SQLCODESQLCA SQLSTATE PROCEDURE COMMIT_TRANSACTION(SQLCODE);COMMIT;■■DECLARE CURSOR OPEN OPEN DECLARECURSOR SQL DECLARE CURSOR 4-34-7OPEN DECLARE CURSOR 4-34-7 4-3 DECLARE ID_AND_NAME CURSOR FORSELECT EMPLOYEE_ID, FIRST_NAME, MIDDLE_INITIAL, LAST_NAMESQL 4-7


4.2 SQL ■■FROM EMPLOYEESWHERE EMPLOYEE_ID = :INPUT_IDPROCEDURE OPEN_ID_AND_NAME(SQLCODE,:INPUT_ID CHAR(5));OPEN ID_AND_NAME; 4-34-7WHERE DECLARECURSOR SQL DECLARE CURSOR 1 OPEN FETCH INTO PROCEDURE FETCH_ID_AND_NAME(SQLCODE,:ID_VARCHAR(5),:FIRST_NAME_VAR CHAR(10),:MIDDLE_INIT_VAR CHAR(1),:MIDDLE_INIT_IND SMALLINT),:LAST_NAME_VAR CHAR(14);FETCH EMP_ROW_CURSOR INTO:ID_VAR,:FIRST_NAME_VAR,:MIDDLE_INIT_VAR :MIDDLE_INIT_IND,:LAST_NAME_VAR; INSERTUPDATE DELETE PROCEDURE UPDATE_JH(SQLSTATE,:JOB_END_DATE_BIN DATE,:INPUT_EMP_ID CHAR(5));UPDATE JOB_HISTORYSET JOB_END = :JOB_END_DATE_BINWHERE EMPLOYEE_ID = :INPUT_EMP_ID;PROCEDURE DELETE_JH(:INPUT_ID CHAR(5),:INPUT_DB_FILE CHAR(20),SQLSTATE);DELETE FROM JOB_HISTORYWHERE EMPLOYEE_ID = :INPUT_ID;4-8 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


4.2 SQL sql_all_datatypes_ada.sqlmod FETCH UPDATE 4.2.4 SQL SQL SQL SQL SQL SQL 2 2 4-14-9SQL C 4-1 Clong SQLCODE;char char_var[11];float real_var;short int real_ind; CHAR_COL CHAR(10)int integ_var; REAL_COL REALchar date_var[11]; INTEGER_COL INTEGERDATE_COL DATESQLupdate_data PROCEDURE UPDATE_DATA(&SQLCODE,(SQLCODE,char_var, :P_CHAR CHAR(10),&real_var, :P_REAL_INT REAL,&real_ind, :P_IND SMALLINT,&integ_var, :P_INTEGER INTEGER,date_var :P_DATE_CHAR CHAR(10)); );UPDATE TAB_A SETCHAR_COL = :P_CHAR,REAL_COL = :P_REAL_INTINDICATOR :P_IND,INTEGER_COL = :P_INTEGER,DATE_COL = CAST(:P_DATE_CHAR AS DATE)WHERE CURRENT OF CURSOR_A;NU-3164A-RA 4-14-9char_var date_var 1 C4.5 4-16SQL 4-9


4.2 SQL SQL 4-14-91 1 BY DESCRIPTOR CHECK BY DESCRIPTOR CHECK 4.2.8 4-134.2.5 SQL <strong>Oracle</strong> <strong>Rdb7</strong> SQL Reference Manual3 (SQLSTATE,-- Status parameter. No data type specified.:LAST_NAME_VAR CHAR(14), -- Character data type.:EMP_ID ID_DOM) -- Data type based on the domain ID_DOM.■■SQL ■ SQL ■4-10 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


4.2 SQL ■ SQL <strong>Oracle</strong> Rdb DATE 4-14-9date_var P_DATE_CHAR DATE_COL :<strong>Oracle</strong> <strong>Rdb7</strong> SQL Reference Manual SQL 4.2.6 LANGUAGE SQL 4.2.2 4-4SQL LANGUAGE SQL SQL BIGINT PL/I ■■ BIGINT forms 8 8 SQL BIGINT SQL forms 8 BIGINT SQL 4-11


4.2 SQL SQL SQL LANGUAGE8 8-1SQL <strong>Oracle</strong> <strong>Rdb7</strong> SQL Reference ManualGENERAL SQL SQL 4.2.7 LANGUAGE SQL GENERAL SQLGENERAL SQL SQL ■■ SQL LANGUAGE GENERAL SQL SQL 4-12 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


4.2 SQL : SQL Ada SQL SQL LANGUAGE ADA SQL SQL Ada Ada SQL SQL SQL 4.2.8 4-134.2.8 BY DESCRIPTOR SQL SIZE_PARAMETERINTEGER BY DESCRIPTORBY DESCRIPTOR LANGUAGE LANGUAGE SQL SQL BY DESCRIPTOR■SQL SQL 4-13


4.3 SQL ■■ CHECK SQL 4.2.94-14SQL SQL SQL SQL 4.2.9 SQL SQL BYDESCRIPTOR CHECK SQL BY DESCRIPTORCHECK SIZE_PARAMETER INTEGER BY DESCRIPTOR CHECK4.3 SQL SQL 1 SQL ; 2 1 2 SQL PROCEDURE FETCH_REPORT_RECORD -- Procedure name( -- Beginning parenthesisSQLSTATE,-- Status parameter with no data type:P_EMPLOYEE_ID CHAR(5), -- Parameters prefixed by colons:P_LAST_NAME CHAR(14), -- and separated by commas:P_FIRST_NAME CHAR(10),:P_JOB_CODE CHAR(4),:P_DEPARTMENT_CODE CHAR(4),:P_SALARY_AMOUNT REAL4-14 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


4.4 ); -- Ending parenthesis and semicolonFETCH REPORT_CURSOR INTO -- Simple statement:P_EMPLOYEE_ID, :P_LAST_NAME,:P_FIRST_NAME, :P_JOB_CODE,:P_DEPARTMENT_CODE, :P_SALARY_AMOUNT; -- Ending semicolon4.4 1 SQL SQL 1 1 1 SQL ; IF FOR PROCEDURE salary_inc-- Procedure name( -- Beginning parenthesisSQLSTATE,-- Status parameter with no data type:inc REAL,-- Parameters prefixed by colons:min_count SMALLINT,-- and separated by commas:max_count SMALLINT); -- Ending parenthesis and semicolonBEGIN-- Beginning of compound statementSET :min_count = 0;-- Assignment statementsSET :max_count = 0;-- FOR statement.-- The :jobrec variable represents a record that holds columns from the-- selected row.FOR :jobrecAS EACH ROW OF TABLE CURSOR JOB_CURSOR FOR-- The select expression.SELECT MINIMUM_SALARY, MAXIMUM_SALARY FROM JOBSWHERE MINIMUM_SALARY < 20000DO-- Update the current row in the JOB_CURSORUPDATE JOBSSET MINIMUM_SALARY = MINIMUM_SALARY + (MINIMUM_SALARY * :inc)SQL 4-15


4.5 SQL WHERE CURRENT OF JOB_CURSOR;SET :min_count = :min_count +1;-- Nested IF statement.-- If the minimum salary is now greater than the maximum salary, increase the-- maximum salary.IF :jobrec.MINIMUM_SALARY > :jobrec.MAXIMUM_SALARYTHENUPDATE JOBSSET MAXIMUM_SALARY = MAXIMUM_SALARY * :incWHERE CURRENT OF JOB_CURSOR;SET :max_count = :max_count +1;END IF;-- End of IF statement, terminated by semicolonEND FOR;-- End of FOR statement, terminated by semicolonEND;-- End of compound statement, terminated by-- semicolon12 12-14.5 SQL SQL SQL ■■■■SQL 1 WHENEVER WHENEVER SQL WHENEVER SQL SQL SQL SQL SQL SQLSTATE SQLCODE SQL CREATE DATABASE DECLARE TABLE DECLARE TABLE CREATEDATABASE SQL SQL$DATABASE CREATE STORAGE MAP SQL4-16 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


4.5 SQL CREATE STORAGE MAP ■■SQL INCLUDE SQL FROM INCLUDE COPY LANGUAGE C SQL C NULL SQL NULL SQL NULL SQL NULL NULL SQL C C NULL SQL C SQL GENERAL C GENERAL 8.6 8-88.12.2 8-27 10.2 10-4SQL 4-17


4.5 SQL 4-18 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


5SQL SQL ■■■■■■SQL SQL SQL SQL SQL SQL 5-1


5.1 SQL 5.1 SQL SQL SQL SQL SQL .sqlmod C ompa q Tru64 UNIXCompaqTru64 UNIX sqlmod SQL my_program.sqlmod $ sqlmod my_program.sqlmodSQL .o OpenVMS DCL SQL $ SQLMOD :== $SQL$MOD SQLMOD SQL $ SQLMOD my_program.sqlmod$ SQLMODINPUT FILE> my_programSQL OpenVMS Linker .obj SQL 5.5 5-5SQL <strong>Oracle</strong> <strong>Rdb7</strong> SQL Reference ManualC ompa q Tru64 UNIX -o CompaqTru64 UNIX -list $ sqlmod -list my_program.lis -o my_mod_program.objSQL 5-2 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


5.2 SQL OpenVMS Alpha SQL OpenVMS VAX CompaqTru64 UNIX .obj 5.2 SQL SQL 4 1. SQL 5.1 5-2 SQL SQL 2. 3. SQL 4. C ompa q Tru64 UNIXBourne CompaqTru64 UNIX $ # Invoke the SQL module processor.$ sqlmod my_sql_module$$ # Define a global symbol for the SQL libraries.$ SQLLIBS='-lrdbsql -lrdbshr -lcosi -lots'$ export SQLLIBS$$ # Invoke the Digital C compiler and link together the SQL module object$ # file, the host language object file, and the SQL libraries.$ cc -o my_calling_module my_calling_module.c my_sql_module ${SQLLIBS}$ # Run the application.$ my_calling_moduleOpenVMS $ ! Define a symbol to invoke the module processor.$ SQLMOD :== $SQL$MOD$ ! Invoke the SQL module processor.$ SQLMOD my_sql_module$ ! Invoke the Pascal compiler.$ PASCAL my_calling_moduleSQL 5-3


5.3 $ ! Link the files.$ LINK my_calling_module, my_sql_module$ ! Run the application.$ RUN my_calling_module LNK$LIBRARY SQL$USER.OLB SQL Ada AdaAda 7 7-15.3 [NO]PARAMETER_CHECK SQL SQL■■PARAMETER_CHECKNOPARAMETER_CHECKSQL NOPARAMETER_CHECK 5.4 SQL SQL SQL 3 SQL 2 15.1.3 15-33 ■DECLARE ALIAS COMPILETIME 5-4 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


5.5 SQL ■■DECLARE ALIAS COMPILETIME <strong>Oracle</strong> Rdb DECLARE TABLE SQL SQL DECLARE TABLE DECLARE TABLE : DECLARE TABLE <strong>Oracle</strong> <strong>Rdb7</strong> SQL ReferenceManual SQL DECLARE TABLE <strong>Oracle</strong> <strong>Rdb7</strong> SQL Reference Manual SQL DECLARE ALIAS5.5 SQL SQL SQL DECLARE SQL 1 SQL SQL SQL DECLARE ;;SQL SQL SQL 2 1 2 dialect test dialcet SQL92 MIA test-sql92 DECLARE MODULE DECLARE MODULEDIALECT SQL92 test-mia DECLARE MODULE SQL 5-5


5.6 SQL DECLARE MODULEDIALECT MIAtest test SQL92 test-sql92 test 2 $ SQLMODINPUT FILE> test test-sql92test MIA test-mia $ SQLMODINPUT FILE> test test-mia5.6 SQL 2 2 SQL SQL SQL ■SQL 1 SQL 1 1 SQL SQL 3.2.5 4.2.7 4.2.8 ■ SQL 1 1 SQL 1 SQL 1 1 5-6 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


6 SQL SQL ■■■■■■■SQL SQL SQL SQL SQL SQL 6-1


6.1 6.1 SQL SQL 6-16-2 SQL 6-1 SQL SQL 1NoYes22345?NoYes6NU-2733A-RA 6-16-21. SQL SQL EXEC SQL 2. SQL SQL 3. 4. 7 7-16-2 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


6.2 SQL 5. 6. SQL C ompa q Tru64 UNIXCompaqTru64 UNIX Bourne my_program.sc C $ # Invoke the SQL precompiler and specify the language as C.$ sqlpre -l cc my_program.sc$$ # Define a global symbol for linking.$ SQLLIBS='-lrdbsql -lrdbshr -lcosi -lots'$ export SQLLIBS$$ # Invoke the DEC C compiler and link the object file.$ cc -o my_program my_program.o ${SQLLIBS}$ # Run the application.$ my_programOpenVMS my_program.sc C $ ! Invoke the SQL precompiler and specify the language as C.$ SQLPREINPUT FILE> my_program /CC$ ! Link the file.$ LINK my_program$ ! Run the application.$ RUN my_programOpenVMS LNK$LIBRARY SQL$USER : 7 7-16.2 SQL SQL SQL ■ SQL SQL 1 SQL C SQL 6-3


6.2 SQL EXEC SQL SQL EXEC SQL UPDATE DEPARTMENTSSET MANAGER_ID = :mgridWHERE DEPARTMENT_CODE = 'SALE';■1 SQL BEGIN END SQL IF FOR SQL EXEC SQL ; SQL 12 12-1SQL SQL SQL ■■■■ SQL EXEC SQL EXEC SQL SQL SQL EXEC SQL SQL SQL SQL 1 EXEC SQL SQL EXEC SQL IF SQL 1 SQL INCLUDE INCLUDE SQLCAINCLUDE FROM INCLUDE INCLUDE FILE.DAT 05 FIELD1 PIC X(10).05 FIELD2 PIC X(10). COBOL INCLUDE WORKING-STORAGE SECTION.6-4 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


6.2 SQL ■■■■01 DEPT_REC PIC X(24).01 COMMAREAEXEC SQL INCLUDE 'FILE.DAT' END-EXEC. DECLARE DECLARE ALIASDECLARE TABLE DECLARE TRANSACTION DECLARE DECLARE ALIAS DECLARE TABLE OPEN DECLARE SETTRANSACTION DECLARE CURSOR OPEN CREATE DATABASE DECLARE TABLEDECLARE TABLE CREATE DATABASE SQL SQL$DATABASE CREATE STORAGE MAP CREATE STORAGE MAP SQL SQL C SQL C SQL SQL SQL ■■SQL _COBOL END-EXEC ANSI/ISO SQL END-EXEC END_EXEC SQL SQLCODESQLSTATESQLCASQLDA SQLDA2 SQL C SQLCODESQLSTATESQLCASQLDA SQLDA2 SQL 6-5


6.3 ■ 6-16-6SQL 6-1 SQL AdaCCOBOLFORTRANPascalPL/ISQL ; SQL ; SQL END-EXEC *1 SQL SQL 1 END-EXEC SQL END-EXEC FORTRAN SQL SQL Pascal IF-THEN-ELSE SQL ;ELSE SQL SQL BEGIN-END SQL ;; SQL *1 SQL END-EXEC .COBOL 6.7 6-13SQL 6.3 SQL C ompa q Tru64 UNIXCompaq Tru64 UNIX sqlpre -l C-l cc$ sqlpre -l cc my_program.sc'-l fortran='-extend_source'6-6 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


6.3 SQL OpenVMS SQL DCL SQL $ SQLPRE :== $SQL$PREC SQL SQLPRE /CC $ SQLPREINPUT_FILE> my_program.sc /CC 6-26-7 6-2 SQL OpenVMSCompaqTru64 UNIXOpenVMSCompaqTru64 UNIXAda .sqlada /ADA .ada .ada .obj C .sc /CC -l cc .c .c .obj .oCOBOL .sco /COBOL -l cobol .cob .cob .obj .oFORTRAN .sfo /FORTRAN -l fortran .for .for .obj .oPascal .spa /PASCAL -l pascal .pas .pas .obj .oPL/I .spl /PLI .pli .pli .obj OpenVMS SQL COBOL $ SCOB :== $SQL$PRE/COBSQL COBOL/DEBUG COBOL @cob_proc Ada Ada 6.7.2 6-14 SQL 6-7


6.3 [NO]OBJECT [NO]G_FLOATG_FLOAT $ MYC :== CC /GFLOAT$ MYSQL :== SQLPRE/CC$ MYSQL FILE_A[NO]OBJECT [NO]G_FLOAT SQL SQL C ompa q Tru64 UNIXCompaq Tru64 UNIX SQL ■ -list■■-match-form ansiCOBOL -form ansi -ansi $ sqlpre -l cobol="-ansi" -form ansiSQL 2 ■■ SQL 6-26-7SQL SQL SQL 6.6.2 6-12SQL 6-8 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


6.3 ■■SQL SQL <strong>Oracle</strong> <strong>Rdb7</strong> SQL Reference Manual SQL 255 : SQL SQL SQL OpenVMS VAX 1. 2 ■■SQL .marSQL 2. .mob3. 1 .mar .mob Ada Ada 6.7.2 6-14OpenVMS Alpha 1 SQL 6-9


6.4 C ompa q Tru64 UNIXCompaq Tru64 UNIX 1 6.4 SQL <strong>Oracle</strong> <strong>Rdb7</strong> SQL Reference ManualSQL SQL sqlerr.log LIST -list : SQL sqlerr.log sqlerr.log sqlerr.log myprog.sfo myprog.for 6.5 SQL 3 2 15.1.3 15-33 6-10 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


6.6 ■■■DECLARE ALIAS COMPILETIME DECLARE ALIAS COMPILETIME <strong>Oracle</strong> Rdb DECLARE TABLE SQL SQL DECLARE TABLE 1 SQL INCLUDE file-spec DECLARE TABLE : DECLARE TABLE DECLARE ALIAS <strong>Oracle</strong><strong>Rdb7</strong> SQL Reference Manual SQL 6.6 SQL DECLARE MODULE ANSI/ISO SQL <strong>Oracle</strong> <strong>Rdb7</strong>SQL Reference Manual6.6.1 DECLARE MODULE DECLARE MODULE SQL 6-16-11DECLARE MODULE 6-1 EXEC SQL DECLARE MODULE employee_moduleDIALECT SQL92NAMES ARE DEC_KANJINATIONAL CHARACTER SET KANJICATALOG ADMINISTRATION SQL 6-11


6.6 SCHEMA ACCOUNTINGDEFAULT CHARACTER SET DEC_KANJIAUTHORIZATION RDB$DBHANDLECHARACTER LENGTH OCTETSALIAS RDB$DBHANDLE;DECLARE MODULE ■■■■DIALECT 1 1 <strong>Oracle</strong> <strong>Rdb7</strong> SQL Reference ManualALIAS RIGHTS DIALECT <strong>Oracle</strong> <strong>Rdb7</strong> SQL Reference ManualDECLARE MODULE 6.6.2 SQL SQL DECLARE SQL OpenVMS test.sco COBOL test_declares.sql DECLARE $ SQLPRE/COBOL test test_declares 6-26-12 test_declares.sql 6-2 SQL DECLARE ALIAS FILENAME pers;DECLARE TRANSACTION READ WRITERESERVING EMPLOYEES FOR PROTECTED WRITE,JOB_HISTORY FOR PROTECTED WRITE,6-12 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


6.7 SQL DEPARTMENTS FOR SHARED READ,JOBS FOR SHARED READ;DECLARE MODULE employee_moduleDIALECT SQL92NAMES ARE DEC_KANJINATIONAL CHARACTER SET KANJICATALOG ADMINISTRATIONSCHEMA ACCOUNTINGDEFAULT CHARACTER SET DEC_KANJIAUTHORIZATION RDB$DBHANDLECHARACTER LENGTH OCTETSALIAS RDB$DBHANDLE;2 1 SQL 2 1 2 dialecttest SQL DECLARE EXEC SQL SQL ; DECLARE TABLE DECLARE STATEMENT DECLARE DECLARE6.7 SQL SQL AdaCCOBOLFORTRANPascalPL/I SQL 6-13


6.7 SQL 6.7.1 Ada SQL Ada Ada 6.7.2 6-14 7.2.3 7-4Ada 8.12.1 8-27Ada 27 Ada 31 SQL "SQL_" Ada SQL Ada SQL SQL Ada Ada SQLCODE SQL SQL Ada Ada1 1 SQL ANSI/ISO 6.7.2 Ada Ada SQL Ada Ada 6-36-15Ada SQL 6-14 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


6.7 SQL Ada SQL Ada Ada DEC Ada ACS CREATE LIBRARY SET LIBRARY ACS Ada SQL 1 .ada Ada .ada 1 SQL Ada SQL _ .ada Ada Ada Ada SQL Ada SQL SQL _ .obj -$_1 ACS COPY FOREIGN Ada ACS LINK 6-36-15Ada 6-3 Ada .sqlada .ada .objSQL SQL Ada Ada Ada .ada Ada .sqlada Ada SQL 6-15


6.7 SQL 6-3 Ada sql_ .mar *1sql_ .objsql_ .adaSQL .sqlada SQL SQL$KEEP_PREP_FILES .mar .obj Ada ACS LINK .mar SQL Ada *1 OpenVMS VAX 6-36-16my_program.sqlada Ada 6-3 Ada $ ! Create an Ada library:$ ACS CREATE LIBRARY [.ADALIB]$ ! Enable the library:$ ACS SET LIBRARY [.ADALIB]%ACS-I-CL_LIBIS, Current program library is DVD15:[PROGRAMS.ADALIB]$ ! Invoke the SQL precompiler:$ SQLPREINPUT FILE> my_program.sqlada/ADAAda 7.2.3 7-46.7.3 C SQL C C 8.12.2 8-27C SQL C SQL C NULL SQL NULL 6-16 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


6.7 SQL SQL NULL SQL NULL NULLSQL C SQL C SQL $SQL_VARCHAR $SQL_VARCHAR C SQL SQL C C SQLCODE SQL C C D NOG_FLOAT SQL <strong>Oracle</strong> Rdb G C D OpenVMS VAX VAXCRTLG C C SQL SQL SQL C SQL <strong>Oracle</strong> Rdb sql_rdb_headers.h SQL 10.3.4 10-30:VAX C C ompa q Tru64 UNIXCompaq Tru64 UNIX :VAX C sqlpre -l cc="migrate -vaxc" SQL 6-17


6.7 SQL 6.7.4 COBOL SQL COBOL COBOL SQL 2 ■■ANSI/ISO SQL '-" ANSI/ISO SQL COBOL COBOL SQL COBOL ANSI/ISO ANSI/ISO ANSI_FORMAT -form ansi COBOL SQL COBOL SQL 1 SQL COBOL SQLCODE 1 1 SQLCODE INCLUDE SQLCA SQLCODE SQLCODE SQL SQL SQLCODE SQL SQL SQLCODE SQL 6-26-19* SQLCODE SQL B END PROGRAM SQL 6-18 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


6.7 SQL 6-2 SQLCODE COBOLSQLCODECOBOLAA B*B CCSQLNU-2722A-RASQLCODE SQL 6-36-19 A B C A SQLCODE AB C SQL D SQL A END PROGRAM 6-3 SQL COBOLASQLCODEA *BB CCA DDSQLCOBOLNU-2723A-RA COBOL SQL COBOL 1 SQL VARCHAR(n) 1 VARCHAR(32)01 STRUCTURE. SQL 6-19


6.7 SQL 49 STRUCT_LENGTH PIC S9(4) COMP.49 STRUCT_STRING PIC X(32).6.7.5 FORTRAN SQL FORTRAN 1 FORTRAN FORTRAN EXTEND_SOURCE -extend_source SQL 1 72 1 132 6 C ompa q Tru64 UNIXCompaq Tru64 UNIX -extend_source sqlpre -l fortran='-extend_source' -extend_source test.sfoVAX FORTRAN 99CONTINUATIONS 19 DECFORTRAN 99 SQL FORTRAN FORTRAN CONTINUATIONS FORTRAN 99 .for 1 SQL FORTRAN FORTRAN INCLUDE SQLCA SQL SQL 6 SQL SQLCODE SQLCODSQLERRD SQLERR SQLCA FORTRAN SQL SQLCA 6 RDB$MESSAGE_VECOR 6-20 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


6.7 SQL INCLUDE SQLCA FORTRAN SQLCOD FOTRAN IF SQL FORTRAN SQL IFIF...THEN...END_IF IF IF IF < > < >SQL SQL IF SQL FOTRAN DO SQL SQL FORTRAN DO SQL WHENEVER SQL 1 IF IF FOTRAN DO SQL WHENEVER SQL IF SQL DO END DO CONTINUE END FORTRAN SQL FORTRAN SQL 1 SQL FORTRAN SQLCOD 1 1 SQLCOD 1 INCLUDE SQLCA SQLCOD SQLCOD SQL SQL SQLCOD SQL SQL SQLCOD SQL 6-46-22* SQLCOD SQLB END SQL SQL 6-21


6.7 SQL 6-4 SQL FORTRANBSQLCODEFORTRANAA B*B CCSQLNU-2724A-RA SQL FORTRAN 1 SQL VARCHAR(n) 1 STRUCTURE /struct_nameINTEGER*2CHARACTER*32END STRUCTURElengthstring6.7.6 Pascal SQL Pascal INCLUDE FROM DICTIONARY Pascal SQL SQL Pascal Pascal SQLCODE SQL SQL Pascal SQL Pascal ■SQL Pascal HIDDEN 6-22 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


6.7 SQL ■■SQL 1 SQL 6.7.7 PL/I SQL PL/I PL/I SQL PL/I SQL SQLCODE SQL PL/I SQLCODE INCLUDE SQLCA 1 SQL SQLCODE SQL SQLCODE 6-56-23* SQLCODE SQL B END SQL 6-5 SQLCODE PL/IBSQLCODEPL/IA A B *B CCSQLNU-2725A-RASQLCODE SQL 6-66-24 A B C A SQLCODE AB C SQL SQL 6-23


6.7 SQL D SQL A END SQL D SQL 6-6 SQL PL/IASQLCODEPL/IA *BB CCA DDSQLNU-2726A-RA6-24 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


71 1 ■■■■■■■■OpenVMS OpenVMS Compaq Tru64 UNIX SQL SQL : 7-1


7.1 7.1 1 <strong>Oracle</strong> Rdb 1 7.2 OpenVMS Linker : Ada Ada 7.2.3 7-4SQL ■■SQL$USER $ LINK main_sql_mod, SQL$USER/LIBRARY/LIBRARY SYS$SHARE:SQL$USER.OLB SQL$USER <strong>Oracle</strong> Rdb LNK$LIBRARY LNK$LIBRARY_1 SQL$USER SQL$USER LINK SQL 7-2 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


7.2 OpenVMS Linker SQL$USER 1 $ LINK my_program3 my_main_program.exe 1$ LINK my_main_program, my_called_program, prog_messages : SQL OpenVMS Linker 7.2.1 OpenVMS VAX Compaq Tru64 C OpenVMS VAX Compaq Tru64 C PSECTSQL SQL LINK-W-MULPSC LINK PSECT_ATTR $ LINK/EXE=SQL$IVPC -SQL$IVPC, -SQL$USER/LIB, -SYS$INPUT/OPTPSECT_ATTR = RDB$MESSAGE_VECTOR,NOSHR,NOPIC7.2.2 /SHAREABLE 7-17-4 project3.opt 7-3


7.2 OpenVMS Linker 7-1 MOD1,MOD7,LIB3/LIBRARY,-LIB4/LIBRARY/INCLUDE=(MODX,MODY,MODZ),-MOD12/SELECTIVE_SEARCHSTACK=75SYMBOL=JOBCODE,5$ LINK/MAP/CROSS_REFERENCE PROGA, PROGB, PROGC, project3/OPTIONSLINK LINK SYS$INPUT DCL LINK linkprog.com $ LINK, MAIN, SUB1, SUB2, SYS$INPUT:/OPTIONSMYPROG/SHAREABLESYS$LIBRARY:APPLPCKGE/SHAREABLESTACK=757.2.3 Ada 7.2 7-2Ada ■■■Ada DCL LINK ACS LINK Ada .obj ACS LINK Ada ACS LINK SQL Ada SQL_filename.obj SQL_filename.ada Ada 2 ■ACS COPY FOREIGN Ada $ ACS SET LIBRARY [.ADALIB]%ACS-I-CL_LIBIS, Current program library is DVD15:[PROGRAMS.ADALIB]$ ACS COPY FOREIGN SQL_filename.obj■.obj ACS LINK 2 7-4 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


7.3 $ ACS LINK main_procedure_name SQL_filename.obj LNK$LIBRARY SQL$USER SQL Ada LINK SQL $ ACS LINK main_procedure_name SQL_filename.obj, SQL$USERMY_PROGRAM Ada sql_my_program.obj ACS COPY .obj $ ! This LINK command requires that the logical name$ ! LNK$LIBRARY is defined as SQL$USER.OLB$ !$ ! The name MY_PROGRAM, immediately following the word LINK,$ ! is a procedure name, not a file name.$ !$ ACS LINK MY_PROGRAM sql_my_program.objACS LINK OpenVMS Linker Ada 7.3 OpenVMS Linker ■■■ 1 OpenVMS VAX OpenVMS Alpha 7-5


7.3 /SHAREABLE SQL$USER PSECTPSECT nowrite 7.3.1 7-6 SQL CONNECT 7.3.2 7-7SQL CONNECT SQL 7.3.1 SQL 7-27-6 7-2 $ LINK/SHAREABLE=MYSHARE.EXE MYVECTORS, MYSHARE, SQL$USER/LIB, SYS$INPUT/OPTIONSPSECT_ATTR=RDB$DBHANDLE,NOSHR,LCLPSECT_ATTR=MYALIAS,NOSHR,LCL7-6 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


7.3 PSECT_ATTR=RDB$MESSAGE_VECTOR, NOSHR,LCLPSECT_ATTR=RDB$TRANSACTION_HANDLE, NOSHR,LCLPSECT_ATTR=SQLCA,NOSHR,LCLPSECT_ATTR=SQLDA,NOSHR,LCLPSECT_ATTR=SQL$CALLER_PC,NOSHR,LCL$NOSHR,LCL NOSHR 2 2 7.3.2 SQL SQL OpenVMS Linker SQL PSECT 1 DECLAREALIAS GLOBAL DECLARE MYALIAS GLOBAL ALIAS FOR FILENAME mf_personnelEXTERNAL NOEXTERNAL_GLOBAL SQLOPTIONS=NOEXTERNAL_GLOBAL DECLARE ALIAS GLOBAL EXTERNAL 7-7


7.3 myshare.exe myshare.sc SQL GLOBAL MYALIAS DECLARE ALIAS SQL NOEXTERNAL_GLOBAL SQL myshare.objOpenVMS VAX myvectors.obj 7-3 7-8 7-3 OpenVMS VAX $ LINK/SHAREABLE=myshare.exe MYSHARE, SQL$USER/LIB, SYS$INPUT/OPTIONSCLUSTER=TRANSFER_VECTOR,,,MYVECTORSCLUSTER=SQL_PSECTSCOLLECT=SQL_PSECTS, RDB$DBHANDLE, MYALIAS, RDB$MESSAGE_VECTOR,-RDB$TRANSACTION_HANDLE, SQL$CALLER_PC, SQL$TRANSACTION_PTR,-SQLCA, SQLDAPSECT_ATTR=RDB$DBHANDLE,NOSHR,GBLPSECT_ATTR=MYALIAS,NOSHR,GBLPSECT_ATTR=RDB$MESSAGE_VECTOR, NOSHR,GBLPSECT_ATTR=RDB$TRANSACTION_HANDLE, NOSHR,GBLPSECT_ATTR=SQL$CALLER_PC,NOSHR,GBLPSECT_ATTR=SQL$TRANSACTION_PTR, NOSHR,GBLPSECT_ATTR=SQLCA,NOSHR,GBLPSECT_ATTR=SQLDA,NOSHR,GBL$OpenVMS Alpha 7-47-8 7-4 OpenVMS Alpha $ LINK/SHAREABLE=myshare.exe MYSHARE, SQL$USER/LIB, SYS$INPUT/OPTIONSCLUSTER=SQL_PSECTSCOLLECT=SQL_PSECTS, RDB$DBHANDLE, MYALIAS, RDB$MESSAGE_VECTOR,-RDB$TRANSACTION_HANDLE, SQL$CALLER_PC, SQL$TRANSACTION_PTR,-SQLCA, SQLDAPSECT_ATTR=RDB$DBHANDLE,NOSHR,GBLPSECT_ATTR=MYALIAS,NOSHR,GBLPSECT_ATTR=RDB$MESSAGE_VECTOR, NOSHR,GBLPSECT_ATTR=RDB$TRANSACTION_HANDLE, NOSHR,GBLPSECT_ATTR=SQL$CALLER_PC,NOSHR,GBLPSECT_ATTR=SQL$TRANSACTION_PTR. NOSHR,GBLPSECT_ATTR=SQLCA,NOSHR,GBL7-8 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


7.3 PSECT_ATTR=SQLDA,NOSHR,GBLSYMBOL_VECTOR = ( -RDB$DBHANDLE=PSECT, -MYALIAS=PSECT, -RDB$MESSAGE_VECTOR=PSECT, -RDB$TRANSACTION_HANDLE=PSECT, -SQLCA=PSECT, -SQLDA=PSECT, -MYSHAREDPROC=PROCEDURE -SQL_PSECTS SQLDA SQLCA SQLDA SQL_PSECT NOSHR GBL ANOTHER_DB COLLECT=SQL_PSECTS ANOTHER_DB PSECT_ATTR=ANOTHER_DB,NOSHR,GBLOpenVMS Alpha ANOTHER_DB=PSECT■■ EXTERNAL GLOBAL EXTERNAL NOEXTERNAL_GLOBAL SQL 7-9


7.4 ■ SQL COBOL $ SQLPREINPUT_FILE> mymain.sco /COB /SQLOPTIONS=(NOEXTERNAL_GLOBAL) 7-57-10 mymain 7-5 $ LINK mymain, SQL$USER/LIB, SYS$INPUT/OPTIONSPSECT_ATTR=RDB$DBHANDLE,NOSHR,GBLPSECT_ATTR=MYALIAS,NOSHR,GBLPSECT_ATTR=RDB$MESSAGE_VECTOR, NOSHR,GBLPSECT_ATTR=RDB$TRANSACTION_HANDLE, NOSHR,GBLPSECT_ATTR=SQLCA,NOSHR,GBLPSECT_ATTR=SQLDA,NOSHR,GBLMYSHARE/SHARE$7.4 OpenVMS Install INSTALL /SHARE OpenVMS Install <strong>Oracle</strong> Rdb <strong>Oracle</strong> <strong>Rdb7</strong>Installation and Configuration Guide7.5 CompaqTru64 UNIX C ompa q Tru64 UNIXCompaqTru64 UNIX SQL ■■SQL SQL SQL SQL 7-10 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


7.5 CompaqTru64 UNIX SQL SQLLIBS-lrdbsql -lrdbshr -lcosi -lotsBourne $ SQLLIBS='-lrdbsql -lrdbshr -lcosi -lots'$ export SQLLIBSSQL SQL SQL 1 SQL SQL SQL test_mod.o C test_h.c $ cc -o test_h test_h.c test_mod.o ${SQLLIBS}SQL 5.2 5-3 SQL SQL SQL C SQL test.o $ cc -o test test.o ${SQLLIBS}SQL 6.3 6-6<strong>Oracle</strong> Rdb /usr/lib/sqllibs.make makefile SQLLIBSsqllibs.make 4 7.5.1 C ompa q Tru64 UNIXSQL SQL SQL 2 SQL CompaqTru64 UNIX 7-11


7.6 SQL 2 CompaqTru64 UNIX SQL <strong>Oracle</strong> Rdb 1 1 DECLARE ALIAS GLOBAL DECLARE MYALIAS GLOBAL ALIAS FOR FILENAME mf_personnelEXTERNAL -noextern -s'-noextern' GLOBAL GLOBAL EXTERNAL 7.6 SQL SQL OpenVMS CompaqTru64 UNIX SQL 2 1 1 SQL SQL RDB$< > < > SQL DECLARE MODULE 7.7 C ompa q Tru64 UNIXOpenVMS DCL RUN $ RUN MYPROGRAMCompaqTru64 UNIX $ myprogram7-12 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


7.8 SQL 10 10-1 : <strong>Oracle</strong> <strong>Rdb7</strong> SQLReference Manual7.8 SQL SQL ■ SQL SQL SQL SQL ■■■■■ 1 OpenVMS /DEBUG FORTRANPascal Ada /DEBUG /NOOPTIMIZE FORTRANPascal Ada SET IMAGEOpenVMS 7-13


7.8 SQL : SQL SQL 7-14 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


8 SQL ■■■■■■■■■ SQL 13 13-1 8-1


8.1 8.1 SQL SQL ■■SQL SQL SQL SQL SQL SQL SQL SQL SQL SQL SQL 4-14-9SQL SQL SQL DML ■■ SQL ■SQL : <strong>Oracle</strong> <strong>Rdb7</strong> SQL Reference ManualSQL -_8-2 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


8.3 8.2 ■■SQL SQL SQL SQL SQL SQL SQL SQL SQL 1 FORTRAN SQL SQL 8.3 SQL SQL SQL ■■■■SQL INCLUDE SQL SQL FROM path-name 8-3


8.3 ■ INCLUDE COPY ■ NULL■■SQL INCLUDE SQL ■ COPY INCLUDE ■SQL ■■■■SQLSTATE SQLSTATE <strong>Oracle</strong> <strong>Rdb7</strong> SQL Reference Manual 10 10-1 SQLSTATE SQLCODE FORTRAN SQLCOD INCLUDE SQLCA SQL SQLCODE COPY INCLUDE SQL <strong>Oracle</strong> <strong>Rdb7</strong> SQL Reference Manual SQL Communications AreaSQLCASQLCODE SQLCA INCLUDE SQLCA SQL 8.6 8-810 10-1■ SQL ■8-4 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


8.4 ■■■ INCLUDE SQLCA INCLUDE SQLDA2 SQL COPY INCLUDE SQL C SQL_SQLDA2.H 11.3.2 11-10 SQL : 11 11-1 SQL <strong>Oracle</strong> <strong>Rdb7</strong> SQL ReferenceManualINCLUDE SQLDA INCLUDE SQLDA2 SQL Descriptor AreasSQLDA SQLDA28.6 8-8SQL INCLUDE SQL SQL SQL SQL FORTRAN SQL 8.4 SQL SQL SQL 2 ■■ SQL SQL ■■ 8-5


8.4 10 D-Floating G-Floating UPDATE INSERT FETCH SELECT 1 SQL <strong>Oracle</strong> Rdb <strong>Oracle</strong> Rdb SQL SQL SQL : SQL<strong>Oracle</strong> <strong>Rdb7</strong> SQL Reference Manual G-Floating D-Floating SQL 8-6 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


8.4 SQL SQL SQL SQL : SQL 1 DATE VMS DATE DATE DATE SQL 8 4 DATE DATE DATE 8 16 9 9-1SQL CHECK SQL 4.2.4 4-9SQL 4.2.2 4-44.2.9 4-14<strong>Oracle</strong> Rdb <strong>Oracle</strong> <strong>Rdb7</strong> SQL Reference Manual 8-7


8.5 8.5 SQL SQL SQL SQL INCLUDE FROM path-name ■■■8.6 SQL INCLUDE SQL SQL INCLUDE SQL SQL COPY INCLUDE SQL SQL INCLUDE SQL SQL COPY INCLUDE SQL INCLUDE ■■■■SQL INCLUDE FROM DICTIONARY INCLUDE INCLUDE SQLCA INCLUDE SQLDA INCLUDE SQLDA2 SQL SQL INCLUDE OpenVMS SQL 8-8 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


8.6 SQL INCLUDE : <strong>Oracle</strong> <strong>Rdb7</strong> SQL Reference Manual SQL INCLUDE 8.6.1 SQL INCLUDE FROM DICTIONARY SQL INCLUDE FROM DICTIONARY ■■CREATE DATABASE INTEGRATE SQL WARREN DEPARTMENTS 'EXEC SQL INCLUDE FROM DICTIONARY'DISK3:[DEPT32.CDD]WARREN.PERSONNEL.RDB$RELATIONS.DEPARTMENTS' CREATE DATABASE INTEGRATE RDB$RELATIONS INCLUDEFROM DICTIONARY 'EXEC SQL INCLUDE FROM DICTIONARY'DISK3:[DEPT32.CDD]WARREN.PERSONNEL.DEPARTMENTS'C SQL SQL NULL SQL C 8.12.2 8-27 8-9


8.6 SQL INCLUDE 8.6.2 INCLUDE SQLCA INCLUDE SQLCA SQL SQLCODE RDB$MESSAGE_VECTOR INCLUDE SQLCA SQLERRD SQLCA EXEC SQL INCLUDE SQLCASQL C INCLUDE SQLCA 1 EXTERNAL INCLUDE SQLCA SQLCA EXTERNAL SQLCA OpenVMS SQLCA 1 SQLCA SQLCA INCLUDE SQLCA EXTERNAL SQLCA CompaqTru64UNIX SQLCA 1 SQLERRD 2 3 SQLERRD 2 SQL SELECT SQL SQLERRD PREPARE EXECUTE SQLCA SQLERRD 3 FETCHINSERTUPDATE DELETE FETCH SQLERRD INCLUDE SQLCA SQLCODE INCLUDE SQLCA RDB$MESSAGE_VECTOR RDB$MESSAGE_VECTOR INCLUDE SQLCA SQLCODE RDB$MESSAGE_VECTOR 10 10-18-10 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


8.7 SQL FROM path-name 8.6.3 INCLUDE SQLD SQLDA2 INCLUDE SQLDA INCLUDE SQLDA2 SQL SQL SQLDA SQLDA2 EXEC SQL INCLUDE SQLDAEXEC SQL INCLUDE SQLDA2SQLDA SQLDA2 11.3.2 11-108.6.4 INCLUDE INCLUDE file-spec SQL COBOL 2 INCLUDE 1 SQL SQL EXEC SQL INCLUDE dcls_for_depts_table.cob8.7 SQL FROM path-name SQL FROM path-name SQL FROM path-name SQL PROCEDURE store_proc(SQLCODE,emp_rec RECORDFROM cddplus.records.employees END RECORD); 8-11


8.8 COPY INCLUDE SQL FROM path-name SQL 8.8 8-12 COPY INCLUDE : SQL C SQL NULL SQL C 8.12.2 8-278.8 COPY INCLUDE SQL COPY INCLUDE SQL SQL COPY INCLUDE SQL SQL SQL COPY INCLUDE COPY INCLUDE 8.9 SQL SQL :SQL SQL SQL SQL :■<strong>Oracle</strong> Rdb : PARAMETER COLONS SQL 8-12 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


8.9 <strong>Oracle</strong> Rdb ■ PARAMETER COLONS SQL ■■■INSERT VALUES UPDATE SET WHERE ■■■■■UPDATE DELETE 1 1 SELECT SELECT 1 SELECT ■SELECT FETCH INTO 8.9.1 SQL SQL SQL SQL COBOL EMPLOYEE_RECORD 01 EMPLOYEE_RECORD.05 EMP_ID_P PIC X(5).05 L_NAME_P PIC X(15). 8-13


8.9 05 F_NAME_P PIC X(11).05 M_INIT_P PIC X(1).05 ADDRESS_1_P PIC X(25).05 ADDRESS_2_P PIC X(20).05 CITY_P PIC X(20).05 STATE_P PIC X(2).05 POSTAL_CODE_P PIC X(5).05 SEX_P PIC X(1).05 BIRTH_DATE_P PIC X(23).05 STATUS_P PIC X(1).SQL EMPLOYEE_RECORD PROCEDURE fetch_record(:emp_rec RECORDemp_id_p char(5),l_name_p char(15),f_name_p char(11),m_init_p char(1),address_1_p char(25),address_2_p char(20),city_p char(20),state_p char(2),postal_code_p char(5),sex_p char(1),birth_date_p char(23),status_p char(1)END RECORDSQLCODE);:COBOL 01 EMP_ID_P PIC S9(4) COMP.01 L_NAME_P PIC S9(4) COMP.01 F_NAME_P PIC S9(4) COMP.01 M_INIT_P PIC S9(4) COMP.01 ADDRESS_1_P PIC S9(4) COMP.01 ADDRESS_2_P PIC S9(4) COMP.01 CITY_P PIC S9(4) COMP.01 STATE_P PIC S9(4) COMP.01 POSTAL_CODE_P PIC S9(4) COMP.01 SEX_P PIC S9(4) COMP.8-14 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


8.9 01 BIRTH_DATE_P PIC S9(4) COMP.01 STATUS_P PIC S9(4) COMP.SQL 4.2.3 4-58.9.2 8.9.1 8-13 EMPLOYEE_RECORD EMPLOYEES EMPLOYEE_RECORD (name of structure)EMP_ID_P (1st field)L_NAME_P (2nd field)F_NAME_P (3rd field)M_INIT_P (4th field)ADDRESS_1_P (5th field)ADDRESS_2_P (6th field)CITY_P (7th field)STATE_P (8th field)POSTAL_CODE_P (9th field)SEX_P(10th field)BIRTH_DATE_P (11th field)STATUS_P (12th field)SQL SQL SQL NULL personnel EMPLOYEES NULL NULL 8.10 8-18■FETCH EMPLOYEE_RECORD DECLARE EMPLOYEES_CURSOR CURSOR FORSELECT EMPLOYEE_ID, LAST_NAME, FIRST_NAME, MIDDLE_INITIAL,ADDRESS_DATA_1, ADDRESS_DATA_2, CITY, STATE,POSTAL_CODE, SEX, BIRTHDAY, STATUS_CODEFROM EMPLOYEESWHERE STATUS_CODE = 1 8-15


8.9 OPEN EMPLOYEES_CURSORFETCH EMPLOYEES_CURSOR INTO :EMPLOYEE_RECORDEMPLOYEE_RECORD FETCHFETCH EMPLOYEES_CURSOR INTO :EMP_ID_P, :L_NAME_P, :F_NAME_P, :M_INIT_P,:ADDRESS_1_P, :ADDRESS_2_P, :CITY_P, :STATE_P,:POSTAL_CODE_P, :SEX_P, :BIRTH_DATE_P, :STATUS_P18 18-1■1 1 SELECT 1 SELECT 2 2 FETCH 1 SELECT EMPLOYEE_RECORD SELECT EMPLOYEE_ID, LAST_NAME, FIRST_NAME, MIDDLE_INITIAL,ADDRESS_DATA_1, ADDRESS_DATA_2, CITY, STATE, POSTAL_CODE,SEX, BIRTHDAY, STATUS_CODEINTO :EMPLOYEE_RECORDFROM EMPLOYEESWHERE EMPLOYEE_ID = :INPUT_ID1 SELECT SELECT EMPLOYEE_ID, LAST_NAME, FIRST_NAME, MIDDLE_INITIAL,ADDRESS_DATA_1, ADDRESS_DATA_2, CITY, STATE, POSTAL_CODE,SEX, BIRTHDAY, STATUS_CODEINTO:EMP_ID_P, :L_NAME_P, :F_NAME_P, :M_INIT_P,:ADDRESS_1_P, :ADDRESS_2_P, :CITY_P, :STATE_P, :POSTAL_CODE_P,:SEX_P, :BIRTH_DATE_P, :STATUS_PFROM EMPLOYEESWHERE EMPLOYEE_ID = :INPUT_ID1 SELECT <strong>Oracle</strong> <strong>Rdb7</strong> Introduction to SQL<strong>Oracle</strong><strong>Rdb7</strong> SQL Reference Manual■SQL INSERT INTO EMPLOYEES (EMPLOYEE_ID, LAST_NAME, FIRST_NAME, MIDDLE_INITIAL,ADDRESS_DATA_1, ADDRESS_DATA_2, CITY, STATE,POSTAL_CODE, SEX, BIRTHDAY, STATUS_CODE)VALUES(:EMPLOYEE_RECORD)8-16 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


8.9 INSERT INSERT INTO EMPLOYEES (EMPLOYEE_ID, LAST_NAME, FIRST_NAME, MIDDLE_INITIAL)VALUES(:EMP_ID_P, :L_NAME_P, :F_NAME_P, :M_INIT_P)INSERT NULL ■INPUT_ID ID DELETE FROM EMPLOYEES WHERE EMPLOYEE_ID = :INPUT_ID■SQL INPUT_ID DECLARE FIND_EMPLOYEE CURSOR FORSELECT LAST_NAME, ADDRESS_DATA_1, ADDRESS_DATA_2,CITY, STATE, POSTAL_CODEFROM EMPLOYEESWHERE EMPLOYEE_ID = :INPUT_IDOPEN FIND_EMPLOYEEFETCH FIND_EMPLOYEE INTO :L_NAME_P, :ADDRESS_1_P, :ADDRESS_2_P,:CITY_P, :STATE_P, :POSTAL_CODE_PUPDATE EMPLOYEESSETLAST_NAME = :L_NAME_P,ADDRESS_DATA_1 = :ADDRESS_1_P,ADDRESS_DATA_2 = :ADDRESS_2_P,CITY= :CITY_P,STATE= :STATE_P,POSTAL_CODE = :POSTAL_CODE_PWHERE CURRENT OF FIND_EMPLOYEESQL DECLARE CURSOR FETCH UPDATE INPUT_ID SQL 4.2.3 4-58.10 8-18 NULL 8-17


8.10 8.10 1 NULL NULL SQL NULL SQL SQL SQL92 SQLSTATE SQL 1 NULL MINMAXAVG SUM NULL COUNT NULL 0 COUNT 8.10.1 1 8.9.1 8-13 EMPLOYEE_RECORDIND_ITEM 12 COBOL 01 IND_ARRAY.05 IND_ITEM OCCURS 12 TIMES8-18 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


8.10 PIC S9(9) COMP.SQL SQL PROCEDURE proc_1(:ind_array RECORDINDICATOR ARRAY OF 12 INTEGEREND RECORD,SQLCODE); COBOL SQL EMPLOYEE_RECORD 12 01 EMP_ID_IND PIC S9(9) COMP.01 L_NAME_IND PIC S9(9) COMP.01 F_NAME_IND PIC S9(9) COMP.01 M_INIT_IND PIC S9(9) COMP.01 ADDRESS_1_IND PIC S9(9) COMP.01 ADDRESS_2_IND PIC S9(9) COMP.01 CITY_IND PIC S9(9) COMP.01 STATE_IND PIC S9(9) COMP.01 POSTAL_CODE_IND PIC S9(9) COMP.01 SEX_IND PIC S9(9) COMP.01 BIRTH_DATE_IND PIC S9(9) COMP.01 STATUS_IND PIC S9(9) COMP.SQL SQL PROCEDURE proc_1(:EMP_ID:EMP_ID_IND:L_NAME:L_NAME_IND:F_NAME:F_NAME_IND:M_INIT:M_INIT_IND:ADDRESS_1:ADDRESS_1_IND:ADDRESS_2:ADDRESS_2_INDCHAR(5),INTEGER,CHAR(15),INTEGER,CHAR(11),INTEGER,CHAR(1),INTEGER,CHAR(25),INTEGER,CHAR(20)INTEGER, 8-19


8.10 :CITY:CITY_IND:STATE:STATE_IND:POSTAL_CODE:POSTAL_CODE_IND:SEX:SEX_IND:BIRTH_DATE:BIRTH_DATE_IND:STATUS:STATUS_INDCHAR(20),INTEGER,CHAR(2),INTEGER,CHAR(5),INTEGER,CHAR(1),INTEGER,CHAR(23),INTEGER,CHAR(1),INTEGER);8.10.2 8.10.1 8-18SQL UPDATE WHERE INSERT INTO EMPLOYEESVALUES (:EMPLOYEE_RECORD INDICATOR :IND_ITEM); EMPLOYEE_RECORD EMPLOYEES EMPLOYEE_RECORD NULL EMPLOYEES MIDDLE_INITIAL NULL M_INIT_PEMPLOYEE_RECORD M_INIT_IND UPDATE EMPLOYEESSET MIDDLE_INITIAL = :M_INIT_P INDICATOR :M_INIT_IND M_INIT_IND SQL 8-20 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


8.10 NULL SQL M_INIT_P EMPLOYEES M_INIT_IND IND_ITEM SQLM_INIT_P 0 SQL M_INIT_P SQLM_INIT_P NULL 8.10.3 1. SQL FETCH EMPLOYEES_CURSOR INTO :EMP_ID_P :EMP_ID_IND,:L_NAME_P :L_NAME_IND,:F_NAME_P :F_NAME_IND,:M_INIT_P :M_INIT_IND,:ADDRESS_1_P :ADDRESS_1_IND,:ADDRESS_2_P :ADDRESS_2_IND,:CITY_P :CITY_IND,:STATE_P :STATE_IND,:POSTAL_CODE_P :POSTAL_CODE_IND,:SEX_P :SEX_IND,:BIRTH_DATE_P :BIRTH_DATE_IND,:STATUS_P :STATUS_IND SQL FETCH EMPLOYEES_CURSORINTO :EMPLOYEE_RECORD :IND_ITEM2. NULL NULL 8-21


8.10 FETCH SELECT SQL SQL NULL -1SQL SQL SQL 16 16 SQL 16 SQL 0 3. 0 -1 8.10.4 1. 02. NULL 3. -1NULL4. UPDATE INSERT INSERT ■■■4 MIDDLE_INITIAL NULL 6 ADDRESS_DATA_2 INSERT ADDRESS_DATA_2 NULL INSERT INTO EMPLOYEES(8-22 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


8.10 EMPLOYEE_ID, LAST_NAME, FIRST_NAME, MIDDLE_INITIAL,ADDRESS_DATA_1, CITY, STATE, POSTAL_CODE,SEX, BIRTHDAY, STATUS_CODE)VALUES(:EMPLOYEE_ID_P, :LAST_NAME_P, :FIRST_NAME_P,:MIDDLE_INITIAL_P :INDICATOR :MIDDLE_INITIAL_IND,:ADDRESS_1_P, :CITY_P, :STATE_P, :POSTAL_CODE_P,:SEX_P, :BIRTH_DATE_P, :STATUS_P)INSERT IND_ITEM 6 06 -1NULLMIDDLE_INITIAL_P NULL 4 0 -1 SQL EMPLOYEE_RECORD INSERT INTO EMPLOYEES(EMPLOYEE_ID, LAST_NAME, FIRST_NAME,MIDDLE_INITIAL, ADDRESS_DATA_1,ADDRESS_DATA_2, CITY, STATE,POSTAL_CODE, SEX, BIRTHDAY, STATUS_CODE)VALUES( :EMPLOYEE_RECORD:IND_ITEM )SQL 0 SQLSQL SQL 0 SQL 8-23


8.11 : A=NULL A NULL 8.11 SQL SQL SQL ■SQL ■SQL EMPLOYEES ADDRESS_DATA_2 (ADDRESS_2_P) NULL SQL ADDRESS_DATA_2 ADDRESS_DATA_2 ADDRESS_2_P SQL SQL ADDRESS_2_P CITY CITY_P STATE ■■■SQL SQL SQL *8-24 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


8.11 ■■■SQL SQL SQL SQL 2 2 NULL SQL SQL SQL YEAR_PMONTH_P DAY_P DATE_GROUP DATE_GROUP 1 DATE_GROUP 3 SQL DATE_GROUP 3 3 SQL 1 2 samples 1 1 2 8-25


8.11 samples <strong>Oracle</strong> <strong>Rdb7</strong> SQL Reference Manual8.11.1 SQL SQL 8.11 8-24SQLCODE INCLUDE SQLCA SQLCODE 2 SQL SQLCA INCLUDE SQLCA SQLCODE 8.11.2 SQL SQL SQL SQL SQL 2 1 SQL ■■SQL CHAR(n) n DECIMAL(n) SQL n 10 DECIMAL(n) n <strong>Oracle</strong> Rdb 10 DECIMAL SQL SQL 10 SQL <strong>Oracle</strong> <strong>Rdb7</strong> SQL Reference ManualSQL ■<strong>Oracle</strong> Rdb SQL : PARAMETER COLONS 8-26 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


8.12 ■SQL PARAMETER COLONS SQL SQL 8.12 samples sql_all_datatypes SQL SQL 8.12.1 Ada Ada 6.7.1 6-14Ada SQL Ada SQL_STANDARD Ada SQL <strong>Oracle</strong> <strong>Rdb7</strong> SQL Reference ManualAda $ SQL$ RDB$ Ada $_RDB$LU_STATUS RDB_LU_STATUS 8.12.2 C C 6.7.3 6-16SQLCODE SQLSTATE SQL SQLCODE SQLSTATESQL SQL SQLCODE SQLSTATE 8-27


8.12 SQLCODE SQLCODE longword C 32 64 longwordSQL 32 longword 64 longword SQL SQLCODE SQL SQLCODE longword -lsqlcode LONG_SQLCODE SQL C SQL LANGUAGE C ALIGN_RECORDS C FLOAT=D_FLOAT SQLCA OpenVMS Alpha SQL C C SQL SQL SQLCA SQLCA C #pragma nomember_alignment SQL INCLUDE SQL C SQL C SQL C NULL SQL NULL SQL NULL SQL NULL NULL SQL C SQL CSQL 8-28 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


8.12 $SQL_VARCHAR C SQL GENERALSQL C SQL INCLUDE SQL FROMDICTIONARY CompaqTru64 UNIX C ompa q Tru64 UNIXCompaqTru64 UNIX OpenVMS longword CompaqTru64 UNIX C 3 short (int)intlong (int)16 32 64 C SQL ANSI/ISO longword INTEGER SQL C SQL INTEGER C "long" -int32 SQL C "int" -int INTEGER 4 8 salary_amount INTEGER is 4 BYTESSQL SMALLINT VAX C SMALLINT(2)SQL 3 SQLDECLARE my_cursor CURSOR FORSELECT X, Y, ZFROM MYTABLE 8-29


8.12 WHERE W = IN_DATA...PROCEDURE FETCH_EMSQLCODEA CHAR(5)B CHAR(10)C REAL; -- Corresponds to column Z of type SMALLINT(2)FETCH my_cursor INTO A, B, C;C FETCH_EM ...static char in[5] = "0001";static char out_a[6];static char out_b[11];static float out_c;...FETCH_EM(&sqlcode, out_a, out_b, &out_c);if (sqlcode == 100)break;if (sqlcode < 0)...REAL 8.12.3 COBOL SQL COBOL SQL 6.7.4 6-188.12.4 FORTRAN SQL FORTRAN SQL 6.7.5 6-208-30 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


8.12 8.12.5 Pascal SQL Pascal SQL 6.7.6 6-228.12.6 PL/I SQL PL/I SQL 6.7.7 6-238.12.7 SQL SQL 4 4-14.2.4 4-9samples sql_all_datatypes_ada.sqlmod SQL samples Ada sql_all_datatypes.ada sql_all_datatypes_ada.sqlmod 8-31


8.12 8-32 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


9<strong>Oracle</strong> Rdb ANSI/ISO SQL ■■■■■■■DATE VMS DATE VMS SQL corporate_data : <strong>Oracle</strong> <strong>Rdb7</strong>Introduction to SQL<strong>Oracle</strong> <strong>Rdb7</strong> Guide to DatabaseDesign and Definition<strong>Oracle</strong> <strong>Rdb7</strong> SQL Reference Manual 9-1


9.1 9.1 2 ■■ 2 INTERVAL '12:30' HOUR(4) TO MINUTEINTERVAL '0012:30' HOUR(4) TO MINUTE 9-19-2corporate_data DAILY_HOURS 9-1 SQL> INSERT INTO ADMINISTRATION.ACCOUNTING.DAILY_HOURS1> (EMPLOYEE_ID, START_TIME, END_TIME)2> VALUES ('00415',3> TIMESTAMP '1995-07-15 07:30:45.33',4> TIMESTAMP '1995-07-15 17:15:22.18');1 row insertedSQL>SQL> SELECT * FROM ADMINISTRATION.ACCOUNTING.DAILY_HOURS;EMPLOYEE_ID START_TIME END_TIME00415 1995-07-15 07:30:45.33 1995-07-15 17:15:22.181 row selectedSQL>SQL> CREATE TABLE DATE_TABLE1> ( CHAR_VAR CHAR(20),2> COL_DATE TIMESTAMP(0)3> CHECK (COL_DATE BETWEEN TIMESTAMP '1995-1-1 00:00:00'4> AND TIMESTAMP '1996-1-1 00:00:00') NOT DEFERRABLE,5> COL_YEAR_TO_MONTH INTERVAL YEAR TO MONTH6> CHECK (COL_YEAR_TO_MONTH >= INTERVAL '00-00' YEAR TO MONTH)7> NOT DEFERRABLE,8> COL_DAY_TIME INTERVAL HOUR TO SECOND);INSERT TIMESTAMP(2) 9-2 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


9.2 TIMESTAMP(0) COL_DATE SQLSQL> INSERT INTO DATE_TABLE (COL_DATE)1> VALUES ( TIMESTAMP '1995-6-12 16:12:32.05' );%SQL-F-UNSDATASS, Unsupported date/time assignment from to COL_DATE-SQL-F-DATESCANEQ, Date/time expressions with different fractional secondsprecision are not comparableYEAR TO MONTH SQL> INSERT INTO DATE_TABLE (COL_YEAR_TO_MONTH)1> VALUES (INTERVAL '26512-10' YEAR(4) TO MONTH);%SQL-F-DATCONERR, Data conversion error for string '26512-10'-COSI-F-IVTIME, invalid date or timeSQL SQL> INSERT INTO DATE_TABLE1> VALUES ('STRING',2> TIMESTAMP '1995-6-12 16:12:32',3> INTERVAL '265-10' YEAR(3) TO MONTH,4> INTERVAL '73:23:34' HOUR(4) TO SECOND);9.2 SQL SQL <strong>Oracle</strong> Rdb DATE ANSI yyyy 4 nn 2 dd 2 yyyy-nn-dd<strong>Oracle</strong> <strong>Rdb7</strong> SQL Reference ManualDATE CURRENT_TIMESTAMP ANSI/ISO DECLARE MODULE DEFAULT DATE FORMAT CURRENT_TIMESTAMP <strong>Oracle</strong> <strong>Rdb7</strong> SQL Reference Manual 9-3


9.2 9.2.1 <strong>Oracle</strong> Rdb <strong>Oracle</strong> Rdb 9-29-4 <strong>Oracle</strong> Rdb SQL SQL 4 4 9-2 SQL -- This procedure converts a character string to the DATE ANSI format.PROCEDURE CVT_TO_DATETIME(SQLCODE,:CHAR_VAR CHAR(23),:DT_VAR DATE ANSI);BEGINSET :DT_VAR = CAST(:CHAR_VAR AS DATE ANSI); (1)9-4END;-- This procedure converts a character string to the INTERVAL format.PROCEDURE CVT_TO_INTERVAL(SQLCODE,:CHAR_VAR CHAR(23),:DT_VAR INTERVAL DAY(6) TO SECOND);BEGINSET :DT_VAR = CAST(:CHAR_VAR AS INTERVAL DAY(6) TO SECOND); (2)9-4END;-- This procedure converts a binary value to a character string.PROCEDURE CVT_INTERVAL_TO_CHAR(SQLCODE,:CHAR_VAR CHAR(23),:DT_VAR INTERVAL DAY(6) TO SECOND);BEGINSET :CHAR_VAR = CAST (:DT_VAR AS VARCHAR(23)); (3)9-4END; 9-29-4(1) CAST DATE ANSI 8 (2) CAST DAY TO SECOND (3) CAST DAY TO SECOND 9-4 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


9.2 C 9-39-5 4 char[8] 9-3 C char int_ds_string[24],date_ansi_string[24];int sql_return_status;struct {charemployee_id[6];charlast_name[21];charq_date_ansi[8];charq_date_vms[8];charq_time[8];charq_timestamp[8];charq_int_ym[8];charq_int_ds[8];}date_rec;main(){strcpy(date_ansi_string,"1995-9-12¥0");cvt_to_datetime(&sql_return_status,date_ansi_string,date_rec.q_date_ansi);strcpy(int_ds_string,"-12:10:35:59.05¥0");cvt_to_interval(&sql_return_status,int_ds_string,date_rec.q_int_ds);}9.2.2 SQL SQL SQL SQL DATETIMETIMESTAMPINTERVAL <strong>Oracle</strong> Rdb SQL SQL SQL COBOL 01 P_DATE SQL_DATE.01 P_DATE_V SQL_DATE_VMS.01 P_TIME SQL_TIME(0).01 P_TIMESTAMP SQL_TIMESTAMP(2).01 P_INTER_1 SQL_INTERVAL (YEAR TO MONTH).01 P_INTER_2 SQL_INTERVAL (DAY TO HOUR). 9-5


9.2 9-49-6SQL 9-4 SQL #include main(){char str_var[24];long SQLCODE;struct {charemployee_id[6];charlast_name[21];SQL_DATE_ANSImy_date_ansi;SQL_DATE_VMSmy_date_vms; (1)9-6SQL_TIMEmy_time;SQL_TIMESTAMP(1)my_timestamp;SQL_INTERVAL(YEAR(3) TO MONTH)my_int_yr32mo;SQL_INTERVAL(DAY(4) TO SECOND (2)) my_int_d42s2;}date_rec;strcpy(str_var,"33-4¥0");EXEC SQL DECLARE ALIAS FILENAME personnel;/* Conversion from a string to a date-time format. */EXEC SQL BEGINSET :date_rec.my_int_yr32mo = CAST(:str_var AS INTERVAL YEAR TO MONTH);END;/* Conversion from date-time format to a string. */EXEC SQL BEGINSET :str_var = CAST(:date_rec.my_int_yr32mo AS CHAR(24)); (2)9-6END;} 9-49-6(1) SQL (2) CAST SQL <strong>Oracle</strong> <strong>Rdb7</strong> SQL ReferenceManualsamples sql_all_datatypes_date 9-59-7 corporate_data SQL C 9.2.3 9-8 SQL 9-6 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


9.2 9-5 SQL C #include #include /* Include the SQLCA. */EXEC SQL INCLUDE SQLCA;/* Declare the alias. */EXEC SQL DECLARE ALIAS FILENAME corporate_data;main(){/* Declare return status variable for error handling. */int sql_return_status;/* Variables for program use. */char start_date[11],end_date[11];char emp_id[6],last_name[21],hours_worked[12];int hours,min;float hr_rate,wages,sec;printf("Enter START DATE (YYYY-MM-DD):");gets(start_date);printf("Enter END DATE (YYYY-MM-DD):");gets(end_date);/* Declare a cursor. */EXEC SQL DECLARE WEEKLY_HRS_CURSOR CURSOR FORSELECT E.EMPLOYEE_ID, LAST_NAME, HOURLY_RATE,CAST(SUM(HOURS_WORKED) AS CHAR(12)),EXTRACT(HOUR FROM SUM(HOURS_WORKED)),EXTRACT(MINUTE FROM SUM(HOURS_WORKED)),EXTRACT(SECOND FROM SUM(HOURS_WORKED))FROM ADMINISTRATION.ACCOUNTING.DAILY_HOURS D,ADMINISTRATION.PERSONNEL.HOURLY_HISTORY H,ADMINISTRATION.PERSONNEL.EMPLOYEES EWHERE (H.EMPLOYEE_ID = D.EMPLOYEE_ID)AND (E.EMPLOYEE_ID = H.EMPLOYEE_ID)AND CAST(START_TIME AS DATE ANSI)BETWEEN CAST('1995-07-01' AS DATE ANSI) ANDCAST('1995-07-19' AS DATE ANSI)GROUP BY E.EMPLOYEE_ID, LAST_NAME,HOURLY_RATE;/* Open the cursor. */EXEC SQL OPEN WEEKLY_HRS_CURSOR;printf("%20s WEEKLY PAYROLL ( %s - %s)¥n¥n"," ",start_date,end_date);printf("Emp Id Last Name %11s Hours %14s Rate %9s Wages¥n¥n"," "," "," ");/* Get data for employees until end of file. */while (SQLCA.SQLCODE == 0) 9-7


9.2 }{EXEC SQL FETCH WEEKLY_HRS_CURSOR INTO:emp_id, :last_name, :hr_rate,:hours_worked, :hours, :min, :sec;if (SQLCA.SQLCODE != 0 && SQLCA.SQLCODE != 100){sql_signal();EXEC SQL ROLLBACK;}elseif (SQLCA.SQLCODE != 100){if (hours < 40)wages = (float)hours * hr_rate +(float)min/60 * hr_rate +(float)sec/3600 * hr_rate;elsewages = 40.00 * hr_rate +(float)(hours - 40) * hr_rate * 1.5 +(float)min/60 * hr_rate * 1.5 +(float)sec/3600 * hr_rate * 1.5;printf("%s %25s %10s %15.2f %15.2f¥n",emp_id,last_name,hours_worked,hr_rate,wages);}}EXEC SQL ROLLBACK;9.2.3 SQL CAST EXTRACT 40 5 9-69-8 SQL mod_weekly_pay.sqlmod 9-6 SQL ----------------------------------------------------------------------------- The module illustrates how to use SQL module language to use a cursor to-- fetch columns of date-time data type.----------------------------------------------------------------------------- Header Information Section---------------------------------------------------------------------------MODULE MOD_WEEKLY_PAY -- Module nameLANGUAGE C -- Language of calling programALIASRDB$DBHANDLE9-8 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


9.2 PARAMETER COLONS----------------------------------------------------------------------------- DECLARE Statements Section---------------------------------------------------------------------------DECLARE ALIAS FILENAME corporate_data -- Declaration of the databaseDECLARE WEEKLY_HRS_CURSOR CURSOR FOR (1)9-10SELECT E.EMPLOYEE_ID, LAST_NAME, HOURLY_RATE,CAST(SUM(HOURS_WORKED) AS CHAR(12)), (2)9-10EXTRACT(HOUR FROM SUM(HOURS_WORKED)), (3)9-10EXTRACT(MINUTE FROM SUM(HOURS_WORKED)),EXTRACT(SECOND FROM SUM(HOURS_WORKED))FROM ADMINISTRATION.ACCOUNTING.DAILY_HOURS D,ADMINISTRATION.PERSONNEL.HOURLY_HISTORY H,ADMINISTRATION.PERSONNEL.EMPLOYEES EWHERE ((H.EMPLOYEE_ID = D.EMPLOYEE_ID)AND (E.EMPLOYEE_ID = H.EMPLOYEE_ID)AND (CAST(D.START_TIME AS DATE ANSI) (4)9-10BETWEEN CAST(:DATE1 AS DATE ANSI) AND (5)9-10CAST(:DATE2 AS DATE ANSI)))GROUP BY E.EMPLOYEE_ID, LAST_NAME, HOURLY_RATE----------------------------------------------------------------------------- Procedure Section----------------------------------------------------------------------------- This procedure opens the cursor that has been declared for the-- WEEKLY_PAY table.PROCEDURE OPEN_CURSOR(SQLCODE,:DATE1 CHAR(10),:DATE2 CHAR(10));OPEN WEEKLY_HRS_CURSOR;-- This procedure fetches the data from the opened cursor.PROCEDURE FETCH_WEEKLY_HOURS(SQLCODE,:EMP_IDCHAR(5),:LAST_NAMECHAR(20),:HRLY_RATEREAL,:HRS_WORKED CHAR(11),:WEEK_HOURS INTEGER,:WEEK_MININTEGER,:WEEK_SECREAL);FETCH WEEKLY_HRS_CURSOR INTO :EMP_ID, :LAST_NAME, :HRLY_RATE,:HRS_WORKED, :WEEK_HOURS,:WEEK_MIN, :WEEK_SEC;-- This procedure rolls back the transaction.PROCEDURE ROLLBACK_TRANSACTION(SQLCODE);ROLLBACK; 9-9


9.2 9-69-8(1) (2) CAST SUM(HOURS_WORKED) DAY TO SECOND (3) EXTRACT HOURMINUTESECOND (4) CAST START_TIME TIMESTAMP DATE ANSI 2 CAST START_TIME (5) CAST YYYY-MM-DD DATEANSI 9-79-10mod_weekly_pay.sqlmod C mod_datetime_c.c 9-7 C /* ABSTRACT:This sample C program is used with mod_weekly_pay.sqlmod to demonstratethe retrieval of date-time data types. Note the use of the CAST andEXTRACT functions to convert to and from a date-time format.This application prompts the user for a START_DATE and END_DATE. Thetotal hours worked for each employee during this time period are returnedalong with the employee's hourly rate. Weekly pay is calculated assumingtime and a half after 40 hours.*/#include #include main(){/* Declare return status variable for error handling. */int sql_return_status;/* Variables for program use. */char start_date[11], (1)9-12end_date[11];char emp_id[6],last_name[21],hours_worked[12];int hours,min;9-10 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


9.2 float hr_rate,wages,sec; (2)9-12printf("Enter START DATE (YYYY-MM-DD):");gets(start_date);printf("Enter END DATE (YYYY-MM-DD):");gets(end_date);/* Open the cursor. */open_cursor(&sql_return_status,start_date,end_date);if (sql_return_status < 0){sql_signal();rollback_transaction(&sql_return_status);}printf("%20s WEEKLY PAYROLL ( %s - %s)¥n¥n"," ",start_date,end_date);printf("Emp Id Last Name %11s Hours %14s Rate %9s Wages¥n¥n"," "," "," ");/* Get data for employees until end of file. */while (sql_return_status == 0){fetch_weekly_hours(&sql_return_status,emp_id,last_name,&hr_rate,hours_worked,&hours,&min,&sec); (3)9-12if (sql_return_status != 0 && sql_return_status != 100){sql_signal();rollback_transaction(&sql_return_status);}elseif (sql_return_status != 100){if (hours < 40)wages = (float)hours * hr_rate +(float)min/60 * hr_rate +(float)sec/3600 * hr_rate;elsewages = 40.00 * hr_rate +(float)(hours - 40) * hr_rate * 1.5 +(float)min/60 * hr_rate * 1.5 +(float)sec/3600 * hr_rate * 1.5;printf("%s %25s %10s %15.2f %15.2f¥n",emp_id,last_name,hours_worked,hr_rate,wages);}}rollback_transaction(&sql_return_status);if (sql_return_status < 0){sql_signal(); 9-11


9.3 }}rollback_transaction(&sql_return_status); 9-79-10(1) NULL length = length + 1 (2) sec REAL SECOND SQL INTEGER(2) C hr_rate (3) SQLCODE = 100Enter START DATE (YYYY-MM-DD):1995-07-15Enter END DATE (YYYY-MM-DD):1995-07-19WEEKLY PAYROLL ( 1995-07-15 - 1995-07-19)Emp Id Last Name Hours Rate Wages00415 Mistretta 51:18:16.7 12.50 711.9600416 Ames 48:34:16.7 12.50 660.719.3 SQL SQL ■■EXTRACT SELECT EXTRACT(YEAR FROM x), EXTRACT(MONTH FROM x)INTO :years, :monthsFROM DATE_TAB;CAST UPDATE DATE_TABSET I_COL = CAST(:hours AS INTERVAL HOUR) +CAST(:minutes AS INTERVAL MINUTE) +CAST(:seconds AS INTERVAL SECOND);SELECT ID, I_COL FROM DATE_TABWHERE I_COL > CAST(:hours AS INTERVAL HOUR) +CAST(:minutes AS INTERVAL MINUTE) +CAST(:seconds AS INTERVAL SECOND);9-12 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


9.4 ■INSERT VALUES INSERT INTO x (LAST_NAME, AGE)VALUES (:last_name, CAST(:age AS INTERVAL YEAR));■SELECT CAST(BIRTHDAY AS VARCHAR(30))FROM EMPLOYEES;0 9.4 ■■ DATE VMS DATE ANSITIME TIMESTAMP ALTER DOMAIN <strong>Oracle</strong> Rdb DATE ANSI DATE VMS ANSI CAST DATE VMS ANSI CAST(CAST(:host_char AS DATE VMS) AS TIMESTAMP)■ANSI LIKECONTAINS STARTINGWITH <strong>Oracle</strong> Rdb '199501'DATE VMS 9-13


9.5 DATE VMS 9.5 DATE VMS DATE VMS SQL ■DATE VMS ■dd-mmm-yy hh:mm:ss:ccDATE VMS ■EXEC SQL INSERT INTO TIME_SHEET (START_TIME)VALUES ('12-NOV-1979 12:34:56.78');yyyymmddhhmmsscc CAST DATEVMS EXEC SQL INSERT INTO TIME_SHEET (START_TIME)VALUES (CAST ('1979111212345678' AS CHAR(16)));■yyyymmddhhmmsscc DATE VMS char st[17];strcpy(st, "1979111212345678");EXEC SQL INSERT INTO TIME_SHEET (START_TIME)VALUES (:st); C <strong>Oracle</strong> Rdb DATE VMS TBL_DATE_VMS 16 <strong>Oracle</strong> Rdb DATE VMS DATE VMS TBL_DATE_VMS 16 main(){char string_date[17];strcpy(string_date,"1989111212345678");EXEC SQL INSERT INTO ALL_DATE_TABLE (TBL_DATE_VMS)VALUES (:string_date);strcpy(string_date," ");EXEC SQL SELECT TBL_DATE_VMS INTO :string_dateFROM ALL_DATE_TABLE;printf("Date VMS (16-character string format): %s¥n",string_date);}9-14 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


9.5 DATE VMS 9.5.1 OpenVMS DATE VMS ANSI/ISO CAST DATE VMS OpenVMS <strong>Oracle</strong> Rdb CAST OpenVMS DATE VMS ANSI/ISO SQL <strong>Oracle</strong> Rdb SELECT CAST(birthday AS DATE VMS), LAST_NAME, FIRST_NAMEFROM ...;9.5.2 DATE VMS DATE VMS OpenVMS OpenVMS 2 ■■ ANSI DATE VMS 8 SQL 8 DATE VMS 16 C char x[17]SQL 16 YYYYNNDDHHMMSSCC2001 1 1 7:25 DATE VMS '2001010119250000'■■ DATE VMS 9-15


9.5 DATE VMS DATE VMS DATEANSI OpenVMS 8 16 OpenVMS simple_date () {/* Note that because these variables are treated as character strings,* their size must include the null terminator for C.*/char in_date[17];char ret_date[17];char string_date[MAX_DATE_SIZE];long SQLCODE;/* Ask the user for the date. */ReadInputDate(string_date);/* Convert the date to SQL character format. */ToSQLDate(string_date,in_date);EXEC SQL INSERT INTO SALARY_HISTORY (EMPLOYEE_ID,SALARY_START)VALUES ('09999', :in_date);check_sqlcode( &SQLCODE );EXEC SQL SELECT SALARY_START INTO :ret_dateFROM SALARY_HISTORY WHERE EMPLOYEE_ID = '09999';check_sqlcode( &SQLCODE );/* Convert the date back to something that the user can read.*/FromSQLDate(string_date,ret_date);printf("Date: %s¥n",string_date);} ToSQLDate FromSQLDate SQL SQL DATE CHAR 8 PROCEDURE INSERT_SAL_HIST(SQLCODE,:IN_DATE DATE VMS);INSERT INTO SALARY_HISTORY (EMPLOYEE_ID,SALARY_START)VALUES ('09999', :IN_DATE);9-16 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


9.6 SQL 16 PROCEDURE INSERT_SAL_HIST(SQLCODE,:IN_DATE CHAR(16) );INSERT INTO SALARY_HISTORY (EMPLOYEE_ID,SALARY_START)VALUES ('09999', :IN_DATE);CASTSALARY_START SELECT SUBSTRING( CAST( SALARY_START AS CHAR(16) ) FROM 1 FOR 8 )FROM SALARY_HISTORY;CAST DATE VMS SUBSTRING CAST INSERT INTO SALARY_HISTORY (SALARY_START)VALUES (CAST( :yr || :mm || :yy || '00000000' AS DATE VMS));1/100 CAST DATE VMS "sql_load" 9.6 SQL SQL SQL ■■■ SQL DATE ANSI SQLDA2 SQL CAST(? AS INTEGER) 9.6.1 9-179.6.1 CAST SQL CAST SQL SQL ? CAST 9-17


9.6 SQL INTEGER 2 CASTCAST(CAST(? AS CHAR(10)) AS INTEGER) sql_dynamic.c SQLDA2 SQL PREPARE EXECUTE 2 CAST 9-89-18 sql_dynamic SQL >SELECT ? HOUR 9-8 SQL DynamicSQL> SELECT * FROM ADMINISTRATION.ACCOUNTING.DAILY_HOURS1> WHERE HOURS_WORKED > ?;The SQL statement to be executed dynamically is:SELECT * FROM ADMINISTRATION.ACCOUNTING.DAILY_HOURS WHERE HOURS_WORKED > ?;Enter value for parameter 'HOURS_WORKED' Interval Hour (2) To Second (2): 10Error -304 returned from open_cursorError message:%RDB-E-ARITH_EXCEPT, truncation of a numeric value at runtime-SQL-F-DATCONERR, Data conversion error for string '10'-COSI-F-IVTIME, invalid date or timeError returned from sql_dynamic()Enter the SQL statement to process on the following line(s), terminating yourstatement with a semicolon literal>(:DynamicSQL> SELECT * FROM ACCOUNTING.DAILY_HOURS1> WHERE HOURS_WORKED > CAST(? AS INTERVAL HOUR);The SQL statement to be executed dynamically is:SELECT * FROM ADMINISTRATION.ACCOUNTING.DAILY_HOURS WHEREHOURS_WORKED > CAST(? AS INTERVAL HOUR);Enter value for parameter ''Interval Hour (2): 10----------------------------------------Field EMPLOYEE_ID:00415Field START_TIME:[Timestamp (2)] 1995-07-17 07:15:06.62Field END_TIME:[Timestamp (2)] 1995-07-17 17:45:24.19Field HOURS_WORKED:[Interval Hour (2) To Second (2)] 10:30:17.57No more records found....9-18 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


9.6 SQL 9.6.2 SQL C ompa q Tru64 UNIX SQL YYYYNNDDHHMMSSCC Compaq Tru64 UNIX DATE VMS SQL EXECUTE SQL/ INSERT INTO TBL (DATE_COL) VALUES ( ? )INSERT INTO TBL (DATE_COL) VALUES (CAST( ? AS CHAR(16) ) ) 9-19


9.6 SQL 9-20 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


III 3 ■■ SQL SQL


10■■■■■■■ SQL SQL : SQL 10-1


10.1 SQL 10.1 SQL 10-110-2 2 10-1 2 ■■"no next row""no data"SQL SQL ■■■SQL SQL 10-210-3SQL 10-2 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


10.1 SQL 10-2 SQL SQLSTATE Yes SQL 5 ANSI/ISO SQL SQLSTATE SQLCODE<strong>Oracle</strong> Rdb SQL SQLSTATE SQLSTATE SQLCODE Yes *1 SQL ANSI/ISO SQL SQLCODE SQLSTATE<strong>Oracle</strong> Rdb SQL GET DIAGNOSTICS Yes SIGNAL Yes WHENEVER Yes *1 SQL WHENEVER SQL RDB$MESSAGE_VECTORsql_get_message_vectorNoNoSQL ANSI/ISO SQL RDB$MESSAGE_VECTOR <strong>Oracle</strong> Rdb <strong>Oracle</strong> Rdb RDB$MESSAGE_VECTOR SQLCODE SQLSTATE RDB$MESSAGE_VECTOR SQL RDB$MESSAGE_VECTOR 10-3


10.2 SQL 10-2 SQL sql_signal No RDB$MESSAGE_VECTOR sql_signal sql_get_error_text NoRDB$MESSAGE_VECTOR SQL Yes SQL 3 ■ sql_register_error_handler■ sql_get_error_handler■ sql_deregister_error_handlerSQL *1 SQLCODE SQL89 ANSI/ISO SQL SQL92 ANSI/ISO SQLWHENEVER SQLCODE sql_terminate 10.2 SQL SQLSTATE SQLCODE SQL WHENEVER RDB$MESSAGE_VECTOR SQL 10-4 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


10.2 SQL ■■ANSI/ISO SQL SQLSTATE SQLCODE<strong>Oracle</strong> Rdb SQL ANSI/ISO SQL SQLSTATE SQLCODE DECLARECURSOR ROLLBACK SQLSTATE SQLCODE SQL 10.6 10-35 : <strong>Oracle</strong> <strong>Rdb7</strong> SQL Reference ManualSQL SQL Communications AreaSQLCASQLSTATE SQLCODE RDB$MESSAGE_VECTOR SQL WHENEVER 10.2.1 SQLSTATE SQLSTATE SQL SQLSTATE ANSI/ISO SQL SQL SQLSTATE SQLCODE SQLCODE SQLSTATE SQLSTATE dialect SQL92 SQLSTATE SQLSTATE SQLSTATE 5 2 3 00000 00 000SQL 10-5


10.2 SQL A Z 0 9 2 ■■ANSI/ISO SQL A H 0 4 I Z 5 9 <strong>Oracle</strong> Rdb SQL R S <strong>Oracle</strong> <strong>Rdb7</strong> SQL Reference ManualSQLSTATE ■■■■SQLSTATE '00000' SQL SQLSTATE '01000' SQL SQLSTATE '02000' SQL SQLSTATE '00''01''02' SQL GET DIAGNOSTICS SQL SQLSTATE 12.9 12-2210.2.2 SQLCODE SQLCODE SQL ANSI/ISOSQL SQLCODE 0100NO DATA 3 <strong>Oracle</strong> Rdb SQL SQLCODE SQLCODE <strong>Oracle</strong> <strong>Rdb7</strong> SQL ReferenceManual SQL SQLCODE GET DIAGNOSTICS SQL SQLCODE 12.9 12-22SQLCODE SQLCA SQLCODE 10-6 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


10.2 SQL SQL C C 8.12.2 8-27SQLCASQL SQL SQLCA SQL SQL SQLCA ANSI/ISO SQL SQL SQLCA ■■SQLCODE SQLERRD 3 SQL FETCH SQLCA SQLERRD SQLCA SQLCODE SQL SQL ■■INCLUDE SQLCA SQL1 SQLCODE 1 INCLUDE SQLCA 1 SQL SQLCODE SQLCA SQLCA <strong>Oracle</strong> <strong>Rdb7</strong> SQL Reference ManualSQL SQLCA SQL SQLCA SQL SQLERRDSQLCODE SQLCA SQLCODE SQL SQL SQLCODE SQLCODE SQL SQL SQLCODE SQL C C SQLCA 8.12.2 8-27 10-7


10.2 SQL <strong>Oracle</strong> <strong>Rdb7</strong> SQL Reference Manual SQLCA SQLCODE ■■■ 0 SQLCODE_SUCCESS 100 SQLCODE_EOS ■■■SQL SQLCODE = 0 SQLCODE_SUCCESSSQL SQLCODE = 100 SQLCODE_EOSSQL SQLCODE 0 "else" SQLCODE 10-110-8 10-310-10 IF IF EVALUATECOBOL SWITCHCIF 10-110-8SQLCODE FETCH SQL 10-1 SQL SQLCODE Execute the following statements until SQLCODE equals 100:Host language statements to initialize indicator parametersCall to name-of-fetch-procedure passing SQLCODE anda list of main parameters and indicator parametersas call parametersIf SQLCODE is less than 0then branch to error-handling-section10-8 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


10.2 SQL elseHost language statements to evaluate indicator arrayitems and manipulate fields in recordEnd of execution block 10-110-8SQLCODE SQLCODE FETCH SQL SQL SQL SQL 10-210-9 10-2 SQLCODE Precompiled SQL statement or SQL module procedure callIF SQLCODE is less than 0branch to error-handler-1End of IF block...error-handler-1Display SQLCODE value and error messagesRoll back transactionIF SQLCODE is less than 0Display messages and continueEnd of IF blockClose any filesStop program execution 10-310-10SQLCODE 10-9


10.2 SQL 10-3 SQLCODE Precompiled SQL statement or SQL module procedure callIF SQLCODE is less than 0branch to error-handler-1End of IF block...error-handler-1IF SQLCODE equals -1003 or -913 (lock conflict or deadlock error)Display or log messages about errorExecute actions for locking problemselseIF SQLCODE equals -803 (duplicate value in unique index error)Display or log messages about errorExecute actions for duplicate value violationselseIF SQLCODE equals -1002 or -1001 (violation of constraint)Display or log messages about errorExecute actions for validation and integrity violationselseDisplay or log message about unexpected errorExecute orderly termination of transaction and programEnd of IF block10.4 10-31 10.5 10-3210.2.3 WHENEVER SQL WHENEVER SQL SQL WHENEVER WHENEVER SQL EXEC SQL WHENEVER SQLERROR GOTO label-of-section-handling-errorsEXEC SQL WHENEVER NOTFOUND GOTO label-of-section-handling-conditionEXEC SQL WHENEVER SQLWARNING GOTO label-of-section-handling-warningsSQL WHENEVER WHENEVER SQL WHENEVER SQLERROR SQL IF If SQLCODE is less than 0, GOTO same-section-for-handling-errors10-10 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


10.2 SQL SELECT FETCH 10.4 10-31SQL WHENEVER WHENEVER 3 ■■■NOT FOUNDSQLCODE = 100 SQLCODE_EOSSQLSTATE = '02000' "nodata" SQLWARNING0 SQLCODE'01' SQLSTATE SQLCODE = 100 SQLCODE_EOSSQLSTATE = '02000' SQLERROR0 SQLCODE '00''01''02' SQLSTATE1 WHENEVER SQLERROR SQL AB C WHENEVER SQLERROR statement-C SQL WHENEVER statement-D error-handler-2 statement-B error-handler-1 EXEC SQL WHENEVER SQLERROR GOTO label-of-error-handler-1EXEC SQL statement-AEXEC SQL statement-BEXEC SQL statement-CEXEC SQL WHENEVER SQLERROR GOTO label-of-error-handler-2EXEC SQL statement-DEXEC SQL statement-EEXEC SQL statement-FWHENEVER WHENEVER SQL 2 WHENEVER SQL NOTFOUND 10-11


10.2 SQL statement-E statement-B statement-B error-handler-1 statement-E error-handler-2 SQL SQL WHENEVER SQL WHENEVER CONTONUE WHENEVER IF SQL statement-C SQL statement-C SQL WHENEVER EXEC SQL WHENEVER SQLERROR GOTO ERROR-HANDLER-1EXEC SQL statement-AEXEC SQL statement-BEXEC SQL WHENEVER SQLERROR CONTINUEEXEC SQL statement-CIF SQLCODE < 0 ...EXEC SQL WHENEVER SQLERROR GOTO ERROR-HANDLER-1WHENEVER GOTO SQL SQL ROLLBACK WHENEVER WHENEVER SQL SQL WHENEVER CONTINUE WHENEVER EXEC SQL WHENEVER SQLERROR GOTO ERROR-HANDLER-1...ERROR-HANDLER-1Display messagesEXEC SQL WHENEVER SQLERROR CONTINUEEXEC SQL ROLLBACKIf SQLCODE < 0...WHENEVER WHENEVER SQL WHENEVER SQL 1 WHENEVER SQL 10-12 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


10.2 SQL 1. SQL WHENEVER SQLERROR 2. SQL WHENEVER SQL WARNING 3. SQL WHENEVER NOT FOUND GOTO SQL WHENEVER WHENEVER CONTINUE WHENEVER SQL WHENEVER SQL WHENEVER SQL 10.2.4 sql_get_message_vector RDB$LU_STATUS sql_get_message_vector RDB$MESSAGE_VECTOR sql_get_message_vector <strong>Oracle</strong> Rdb ANSI/ISO SQL RDB$MESSAGE_VECTOR SQL RDB$MESSAGE_VECTOR 2 RDB$LU_STATUS SQLCODE sql_get_message_vector SQL : RDB$MESSAGE_VECTOR <strong>Oracle</strong> Rdb RDB$LU_STATUS SQLCODE SQLSTATE ANSI/ISO SQL RDB$MESSAGE_VECTOR RDB$LU_STATUS 10-13


10.2 SQL RDB$MESSAGE_VECTOR SQL sql_get_message_vector sql_get_message_vector RDB$MESSAGE_VECTOR 2 1 2 SQL 3 FAO 4--20 <strong>Oracle</strong> Rdb sql_get_message_vector RDB$MESSAGE_VECTOR 2 RDB$LU_STATUS <strong>Oracle</strong> <strong>Rdb7</strong> SQL Reference Manual 10-410-14SQL sql_get_message_vector SQL C 10-4 sql_get_message_vector .../* Error handler, using sql_get_message_vector. */get_msgvec( ){int index;int status_code;int arg_cnt;/* Declare the literal for constraint violation status. */int RDB$_INTEG_FAIL;/* Get the message vector argument count. */index = 1;sql_get_message_vector(&arg_cnt, index);10-14 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


10.2 SQL /* Get the status code. */index = 2;sql_get_message_vector(&status_code, index);if (status_code == RDB$_INTEG_FAIL)printf("Constraint violation. ");printf("You are trying to insert a department code¥n");printf("that already exists in the table.");exit(1);/* You can also check for follow-on arguments, if the arg_cnt is greater* than 1.*/}main( ){...insert_data (&SQLCODE, department_code, department_name, manager_id);if (SQLCODE != 0)get_msgvec();} 10-410-14 2 sql_get_message_vector SQL C sql_rdb_header.h 10.3.4 10-30RDB$LU_STATUS RDB$LU_STATUS RDB$MESSAGE_VECTOR OpenVMS SQL INCLUDE SQLCA RDB$MESSAGE_VECTOR C ompa q Tru64 UNIXCompaq Tru64 UNIX -s 'msgvec' RDB$MESSAGE_VECTOR ($) RDB$MESSAGE_VECTOR <strong>Oracle</strong> <strong>Rdb7</strong>SQL Reference Manual SQLCA RDB$MESSAGE_VECTOR SQLCODE SQLSTATE SQL 10-15


10.2 SQL RDB$LU_STATUS SQL RDB$LU_STATUS RDB$_NO_DUP RDB$LU_STATUS <strong>Oracle</strong> Rdb SQL 10-310-16SQL 10-3 AdaCCOBOLFORTRANPascal---Declare the sytem package.with system;-- Declare the symbolic error code.lock_conflict : system.unsigned_longword :=system.import_value( "RDB$_LOCK_CONFLICT" );globalvalue RDB$_LOCK_CONFLICT;05 RDB$_LOCK_CONFLICT PIC S9(9) COMPVALUE IS EXTERNAL RDB$_LOCK_CONFLICT.INTEGER*4 RDB$_LOCK_CONFLICTEXTERNAL RDB$_LOCK_CONFLICTRDB$_LOCK_CONFLICT :[value,external]INTEGER;PL/I DECLARE RDB$_LOCK_CONFLICT GLOBALREF FIXED BINARY (31);SQL SQLCODE SQLSTATE RDB$LU_STATUS 10-510-17RDB$LU_STATUS 10-16 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


10.2 SQL 10-5 RDB$LU_STATUS Declaration of ret-statusDeclaration of RDB$MESSAGE_VECTOR ! The INCLUDE SQLCA statement can! replace an explicit declaration! of RDB$MESSAGE_VECTOR in! precompiled programs.Declaration of RDB$_NO_DUPDeclaration of RDB$_INTEG_FAIL...Precompiled SQL statement (or a call to a procedure in an SQL module)Assignment of RDB$LU_STATUS to ret-statusIF ret-status does not equal successBranch to error-handler-1End of IF block...error-handler-1Evaluate RDB$LU_STATUSWhen RDB$_NO_DUPDisplay or log messages about errorExecute actions for duplicate value violationsWhen RDB$_INTEG_FAILDisplay or log messages about errorExecute actions for validation and integrity violationsWhen other valuesDisplay or log message about errorExecute appropriate actionsEnd of evaluate block10.4 10-31 10.5 10-32OpenVMS OpenVMS LIB$MATCH_COND RDB$LU_STATUS SQL LIB$MATCH_COND 10-17


10.2 SQL Pascal LIB$MATCH_COND [EXTERNAL] FUNCTION LIB$MATCH_COND(ret_status:INTEGER; sym_name:[LIST]INTEGER):INTEGER;EXTERNAL;begin(* Use LIB$MATCH_COND to determine which error has occurred. *)error := LIB$MATCH_COND (RDB$MESSAGE_VECTOR[2],RDB$_DEADLOCK, {1}RDB$_LOCK_CONFLICT, {2}RDB$_NO_DUP, {3}RDB$_NOT_VALID, {4}RDB$_INTEG_FAIL, {5}RDB$_STREAM_EOF, {6}RDB$_NO_RECORD {7});LIB$MATCH_COND OpenVMS sql_terminate RDB$LU_STATUS : Ada $RDB$ _RDB$MESSAGE_VECTORRDB_MESSAGE_VECTOR 10.2.5 SQL SQL 3 SQL SQL SQL SQL SQL ■ sql_register_error_handler10-18 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


10.2 SQL ■■sql_get_error_handlersql_deregister_error_handler SQL SQL SQL SQL 1 SQL ■sql_register_error_handler C sql_register_error_handler sql_register_error_handler (appl_error_handler,&user_data) sql_register_error_handler SQL 10-23■4 3 RDB$MESSAGE_VECTORSQLCODESQLSTATE 4 C staticvoid appl_error_handler(RDB$MESSAGE_VECTOR *msgvec,int*sqlcode,char*sqlstate,void*user_info)10-25 SQL SQL SQLCODE 10-19


10.2 SQL : SQL SQL SQL SQLCODE 0 SQL SQLCODE 0 SQL WHENEVER SQL SQL 1. ROLLBACK sql_deregister_error_handler ( );2. C EXEC SQL ROLLBACK;3. SQL <strong>Oracle</strong> Rdb C exit;sql_get_error_handler 1 sql_get_error_handler SQL SQL C sql_rdb_headers.h 10.3.4 10-30 10-610-21 C SQL 10-20 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


10.2 SQL 10-6 SQL /* This program demonstrates the use of the SQL error-handling routines,* sql_register_error_handler, sql_deregister_error_handler, and* sql_get_error_handler. Although the use of the sql_get_error_handler* routine is not necessary in this simple program, it is included here* to demonstrate how to use the routine and how to store the address of the* currently registered routine and the address of user data in variables.*/#include #include #include #include #include /* Definition of rdb$message_vector. */typedef struct {int RDB$LU_NUM_ARGUMENTS;int RDB$LU_STATUS;int RDB$LU_ARGUMENTS[18];} RDB$MESSAGE_VECTOR;/* Definition of structure to hold user data. */typedef struct {char sql_proc_name[31];char sql_col_value[31];} err_struct;/* Error-handling routine for constraint violations. This routine traps* constraint violations and prints out an error message. */staticvoid dupl_error_handler(RDB$MESSAGE_VECTOR *msgvec,int*sqlcode,char*sqlstate,void*user_info){err_struct *my_info;my_info = (err_struct *)user_info;if ((*sqlcode == SQLCODE_INTEG_FAIL) &&((strcmp(my_info->sql_proc_name, "INSERT_JOBS")) == 0)){printf(" The Job Code %s is already in use.¥n", my_info->sql_col_value);}/* You can add more conditional statements to this error-handling procedure* to handle errors from several SQL statements. */}/* Error-handling routine for errors that occur when you start a transaction.* This routine prints out an error message. */static 10-21


10.2 SQL void txn_error_handler(RDB$MESSAGE_VECTOR *msgvec,int*sqlcode,char*sqlstate,void*user_info1){if ((*sqlcode == SQLCODE_DEADLOCK) || (*sqlcode == SQLCODE_BAD_TXN_STATE)|| (*sqlcode == SQLCODE_LOCK_CONFLICT))printf("Unable to start a transaction. ¥n");}main( ){/* Variables used by the main program. */void (*rtn_ptr)();err_struct *err_struct_ptr = 0;char j_code[5];char w_class[2];char j_title[21];char release_screen;/* Define the SQLCA. */EXEC SQL INCLUDE SQLCA;/* Initialize user-defined information. */err_struct err_s = {" ", " "};/* Declare the database. */EXEC SQL DECLARE ALIAS FILENAME 'PERSONNEL';/* Register the first error-handling routine. */sql_register_error_handler(txn_error_handler,0);/* Store the address of the currently registered pointer in a variable. */sql_get_error_handler(&rtn_ptr, &err_struct_ptr);printf("Please enter the Job Code (or EXIT):¥n");scanf(" %s", j_code);release_screen = getchar();while (((strcmp(j_code,"exit")) != 0) &&((strcmp(j_code,"EXIT")) != 0)){printf("Enter the Wage Class: ", w_class);scanf(" %s", w_class);release_screen = getchar();while (((strcmp(w_class,"1")) !=0) &&((strcmp(w_class,"2")) !=0) &&((strcmp(w_class,"3")) !=0) &&((strcmp(w_class,"4")) !=0)){printf("Please enter one of the following values for Wage Class:¥n");printf(" 1 2 3 4¥n");scanf(" %s", w_class);release_screen = getchar();10-22 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


10.2 SQL }printf("Please enter the Job Title: ¥n");scanf(" %s", j_title);release_screen = getchar();/* Start a transaction. */EXEC SQL SET TRANSACTION READ WRITE NOWAITEVALUATING JOB_CODE_PRIMARY AT VERB TIMERESERVING JOBS FOR EXCLUSIVE WRITE;/* Register the second error-handling routine. */sql_register_error_handler(dupl_error_handler, &err_s);/* Store information in a structure for use by the error-handling routine. */strcpy(err_s.sql_proc_name, "INSERT_JOBS");strcpy(err_s.sql_col_value, j_code);EXEC SQL INSERT INTO JOBS(JOB_CODE, WAGE_CLASS, JOB_TITLE)VALUES(:j_code, :w_class, :j_title );if (SQLCA.SQLCODE == SQLCODE_SUCCESS)EXEC SQL COMMIT;elseEXEC SQL ROLLBACK;/* Deregister the error-handling routine. */sql_deregister_error_handler();printf("Please enter the Job Code (or EXIT):¥n");scanf(" %s", j_code);release_screen = getchar();/* Register the txn_error_handler routine again. Use the address stored in* rtn_ptr. */sql_register_error_handler(rtn_ptr, 0);}return;} sql_register_error_handler sql_register_error_handler C extern void call_sql_regis_err_hand ( void (*user_error_handler) (),context_block_t *context_block){sql_register_error_handler( user_error_handler, context_block);return;} 10-23


10.2 SQL SQL SQL ■■AdaAda SQL procedure sql_deregister_error_handler; -- no argumentspragma interface( external, sql_deregister_error_handler );pragma IMPORT_PROCEDURE (INTERNAL => sql_deregister_error_handler );procedure sql_get_error_handler(handler : out system.address;context : out system.address );pragma interface( external, sql_get_error_handler );pragma IMPORT_PROCEDURE (INTERNAL => sql_get_error_handler,PARAMETER_TYPES => (system.address, system.address),MECHANISM => (REFERENCE,REFERENCE) );procedure sql_register_error_handler(handler : in system.address;context : in system.address );pragma interface( external, sql_register_error_handler );pragma IMPORT_PROCEDURE (INTERNAL => sql_register_error_handler,PARAMETER_TYPES => (system.address, system.address),MECHANISM => (VALUE,VALUE) );pkg_handler.sql_deregister_error_handler;pkg_handler.sql_get_error_handler(rtn_ptr, foo_ptr);pkg_handler.sql_register_error_handler(pkg_other.my_error_handler'ADDRESS,foo'ADDRESS );BASICEXTERNAL LONG FUNCTION BASIC_ERRHNDCALL sql_deregister_error_handlerCALL sql_get_error_handler BY REF (ERR_HAND_ADDR, ERR_USER_CONTEXT))CALL sql_register_error_handler &(LOC(BASIC_ERRHND) BY VALUE, REGISTERED_CONTEXT BY REF)BASIC SQL ■Csql_deregister_error_handler();sql_get_error_handler(&appl_error_handler_ptr,&user_data_ptr);10-24 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


10.2 SQL ■■sql_register_error_handler(&appl_error_handler,&user_data);COBOL01 appl_error_handler USAGE POINTER VALUE EXTERNAL MY_ERROR_HANDLER.01 appl_error_handler_ptr USAGE POINTER VALUE 1.01 user_data_ptr USAGE POINTER VALUE 1.CALL "sql_deregister_error_handler".CALL "sql_get_error_handler" USING BY REFERENCE appl_error_handler_ptr,BY REFERENCE user_data_ptr.CALL "sql_register_error_handler" USING BY VALUE appl_error_handler,BY REFERENCE user_data.FORTRAN■■CALL sql_deregister_error_handler()CALL sql_get_error_handler(%ref(rtn_ptr),%ref(ctx_ptr))CALL sql_register_error_handler(%ref(my_error_handler),%ref(reg_ctx)))PascalPascal SQL PROCEDURE sql_deregister_error_handler; EXTERNAL;PROCEDURE sql_get_error_handler(var routine : integer;var data :integer); EXTERNAL;PROCEDURE sql_register_error_handler(procedure err_hand (var msgvec : RDB$MESSAGE_VECTOR_REC;var sqlcode : integer;var sqlstate : sqlstate_type;var data_addr : user_data_type);var data:user_data_type); EXTERNAL;sql_deregister_error_handler;sql_get_error_handler(routine_addr, data_addr);sql_register_error_handler(%immed my_error_handler,user_data);PL/IPL/I SQL 10-25


10.2 SQL ■■■■■Adaprocedure my_error_handler (msgvec : in pkg_handler.rdb_message_vector;sqlcode : in out integer;sqlstate : in integer;user_info : in pkg_handler.foo_t );)BASICSUB BASIC_ERRHND BY REF (INTEGER MSG_VECTOR, &SQLCODE_VALUE, &SQLSTATE_VALUE, &CTX_REC USER_CTX )RECORD CTX_RECSTRING VALUE1 = 9STRING VALUE2 = 10INTEGER VALUE3END RECORD CTX_RECDECLARE INTEGER SQLCODESQLCODE = SQLCODE_VALUE)BASIC SQL Cstaticvoid appl_error_handler (RDB$MESSAGE_VECTOR *msgvec,int*sqlcode,char*sqlstate,void*user_info)COBOLDATA DIVISION.WORKING-STORAGE SECTION.01 SQLCODE PIC S9(9) COMP.LINKAGE SECTION.01 MSG_VECTOR USAGE POINTER.01 SQLCODE_VALUE USAGE POINTER.01 SQLSTATE_VALUE USAGE POINTER.01 USER_CTX.02 VALUE1 PIC X(9).02 VALUE2 PIC X(10).02 VALUE3 PIC 9(9) USAGE COMP.PROCEDURE DIVISION USING MSG_VECTOR, SQLCODE_VALUE, SQLSTATE_VALUE, USER_CTX.HANDLE_ERROR.MOVE SQLCODE_VALUE TO SQLCODE.FORTRAN10-26 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


10.3 ■subroutine my_error_handler (msgvec,sqlcode,sqlstate,usrctx)integer*4 msgvecinteger*4 sqlcodeinteger*4 sqlstatestructure /user_ctx/character*10 value1character*10 value2integer*4 value3end structurerecord /user_ctx/ usrctx)Pascalprocedure my_error_handler(var msgvec : RDB$MESSAGE_VECTOR_REC;var sqlcode : integer;var sqlstate : sqlstate_type;var data : user_data_type);)10.3 1 SQL ■■sql_signal sql_get_error_text 10.3.1 sql_signal sql_signal RDB$MESSAGE_VECTOR sql_signal ■OpenVMS DEC COBOL 10-27


10.3 ■C ompa q Tru64 UNIXCompaq Tru64 UNIX sql_signal OpenVMS sql_signal SQL sql_signal RDBSQL OpenVMS OpenVMS OpenVMS C sql_signal SQL sql_rdb_headers.h. 10.3.4 10-30sql_signal C sql_signal sql_signal();sql_signal <strong>Oracle</strong> <strong>Rdb7</strong> SQL Reference Manual10.3.2 sql_get_error_text ASCII FAOsql_get_error_text sql_get_error_text SQL RDB$LU_STATUS sql_get_error_text 3 ■10-28 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


10.3 ■■C sql_get_error_text /* This function uses the sql_get_error_text routine to display the messagesreturned by SQL and Rdb for unexpected error conditions. */void display_sqlget_message(){char get_error_buffer[1024];long error_msg_len;return_status = sql_get_error_text(get_error_buffer, 1024, &error_msg_len);get_error_buffer[error_msg_len] = '¥0';printf("¥n¥nThis condition was not expected.¥n¥n");printf("%.*s¥n", get_error_buffer, error_msg_len );release_screen = getchar();printf("¥n");return;} sql_get_error_text <strong>Oracle</strong> <strong>Rdb7</strong> SQL Reference Manual LF C sql_get_error_text SQL sql_rdb_headers.h. 10.3.4 10-30sql_get_error_text forms LF COBOL LF 1 * CRLF is a PIC XX field that contains .* MSG-TXT-RDBFEL is an array of lines to be displayed for the error message.*STRING CARRIAGE-RET, LINE-FEED DELIMITED BY SIZE INTO CRLF.CALL "sql_get_error_text" USING BY REFERENCE BUFFER,BY VALUE BUF_LEN 10-29


10.3 BY REFERENCE MSG_LEN.UNSTRING BUFFER DELIMITED BY CRLF INTO MSG-TXT-RDBFEL(1),MSG-TXT-RDBFEL(2), MSG-TXT-RDBFEL(3).OpenVMS SQL SQL$GET_ERROR_TEXT <strong>Oracle</strong> Rdb sql_get_error_text 10.3.3 OpenVMS sql$persmsg.msg sql$persmsg.msg sql_terminate.sco sql_terminate.sco sql$persmsg 10.3.4 SQL C SQL sql_signal sql_signal();........^%CC-I-IMPLICITFUNC, In this statement, the identifier "sql_signal" isimplicitly declared as a function.<strong>Oracle</strong> Rdb SQL OpenVMS SYS$LIBRARY:SQL_RDB_HEADERS.HC ompa q Tru64 UNIXCompaq Tru64 UNIX /usr/lib/dbs/sql/v/include/sql_rdb_headers.h10-30 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


10.4 10.4 <strong>Oracle</strong> Rdb UNIQUE ■■ 10-510-1710.4.1 SQL IRDB$LU_STATUS RDB$_INTEG_FAILSQLCODE -1001SQLSTATE '23000' SQL RDB$LU_STATUS RDB$_NO_DUPSQLCODE -803SQLSTATE 'R2000' : 2.0 SQL "valid if" NOT NULL SQL "valid if" NOT NULL "valid if" 2.0 <strong>Oracle</strong> Rdb SQLCODE 1002SQLCODE_NOT_VALID RDB$LU_STATUS RDB$_NOT_VALID 10-31


10.5 "valid if" INSERTUPDATEDELETE SQL 10.4.2 SQL INSERTUPDATEDELETEALTER TABLE COMMIT <strong>Oracle</strong> Rdb ALTER TABLE <strong>Oracle</strong> Rdb 16.7 16-39 forms forms forms "valid if" 10.5 / / 10.5.1 DECLARE TRANSACTION SETTRANSACTION NOWAIT 10-32 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


10.5 ■■■NOWAIT DECLARE TRANSACTION SET TRANSACTION RESERVING SQL <strong>Oracle</strong> Rdb ATTACH <strong>Oracle</strong> Rdb SET TRANSACTIONOPENSELECTUPDATEDELETEINSERTCREATEALTERDROP WAIT <strong>Oracle</strong> Rdb <strong>Oracle</strong> Rdb WAIT WAIT SQL <strong>Oracle</strong> Rdb WAIT WAIT 10-33


10.5 SQLCODE -1003 SQLCODE_LOCK_CONFLICT SQLSTATE R1002 ■■■■WAIT DECLARE TRANSACTION SETTRANSACTION WAIT SET TRANSACTION sql_terminate 10.5.2 SQLCODE -913 SQLCODE_DEADLOCK SQLSTATE R1001 10-34 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


10.6 : SQLV40 COMMIT ROLLBACK 10.6 10-35<strong>Oracle</strong> Rdb samples sql_terminate 10.6 DECLARETRANSACTION SELECT...INTOOPENUPDATEDELETEINSERT SQL COMMIT : FETCH FETCH SQLV40 SQL ROLLBACK ROLLBACK COMMIT ROLLBACK ROLLBACK 1 GETDIAGNOSTICS BEGINDECLARE :txn INTEGER;GET DIAGNOSTICS :txn = TRANSACTION_ACTIVE; 10-35


10.7 IF :txn = 1THEN ROLLBACK;END IF;END;SQLV40 COMMIT ROLLBACK 1 SET TRANSACTIONSET TRANSACTION ROLLBACK 10.7 SQL <strong>Oracle</strong> <strong>Rdb7</strong> SQL Reference Manual SQL <strong>Oracle</strong> Rdb SQL ■■■■■■■SQL 1 SQLSTATE SQLWHENEVER SQLSTATE SQLCODE 0100SQL 1 -1003 SQLCODE SQLCA ANSI/ISO SQL OpenVMS SQL SQL$GET_ERROR_TEXT sql_get_error_text SQLCODE 10-36 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


10.7 SQLCODE WHENEVER SQL ■IF SQLCODE is less than 0branch to error-section...error-sectionIF SQLCODE equals value-list -system-specific actions |else IF SQLCODE equals value-list | Statements to besystem-specific actions| copied.else |system-specific actions |end of IF block -end-of-error-section<strong>Oracle</strong> Rdb SQL ANSI/ISO SQL SQL ANSI/ISO SQL SQL SQL SQL CONSTRAINTS=immediate -cm immediate SQL SQLOPTIONS=(CONSTRAINTS=IMMEDIATE) -s '-cm immediate' 10-37


10.7 10-38 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


11 SQL SQL SQL SQL SQL SQL SQL SQL ■■■■■■■SQL SELECT SQL SELECT SQL SELECT SQL SQL SQL SQL 11-1


11.1 SQL 11.1 SQL SQL SQL SQL 1 SQL SQL SQL SQL SQL SQL SQL SQL SQL SQL : <strong>Oracle</strong> <strong>Rdb7</strong> SQL Reference Manual SQL SQL 11.1.1 SQL SQL SQL SQL SQL SQL SQL SQL ? SQL SELECT SQL SQL ■■SELECT SQL SQL EXECUTE IMMEDIATE SQL EXECUTE IMMEDIATE PREPARE EXECUTE 11.2 11-5SELECT SQL SQL EXECUTE IMMEDIATE SQL PREPARE DESCRIBE...MARKERS SQL SQLDA 11-2 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


11.1 SQL EXECUTE SELECT SQL SELECT INSERT UPDATE DELETE 11.3 11-8 SELECT SQL 11.4 11-1311.3.1 11-9SQLDA ■■■ SELECT SELECT SELECTSQL SQLDA DESCRIBE...SELECT LIST SELECT SELECT FETCH FETCH 11.6 11-19SELECT 11.6.1 11-19 SELECT SELECT SELECT 2 SQLDA 11.6 11-19SELECT 11.6.2 11-22 SELECT SQL 11.7 11-32SQL SQL SQL SQL 11-3


11.1 SQL SQLDASQL SQLDA 11.3.1 11-911.8 11-39 sql_dynamic C 11.1.2 SQL SQL SQL SQL ■■■■■■■■■EXECUTE IMMEDIATE: SQL SELECT 1 PREPARE: SQL DESCRIBE EXECUTE DECLARE CURSOR DECLARE CURSOR PREPARE DESCRIBE: SQL SQLDAEXECUTE: SELECT SQL DECLARE CURSOR: SELECT DECLARE CURSOR SELECT SELECT SQL DECLARE CURSOR: SELECT SELECT SQL DECLARE CURSOR SQL DECLARE CURSOR OPEN : SELECT FETCH: SELECT RELEASE: SQL SQL 11-4 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


11.2 SELECT SQL SQL : <strong>Oracle</strong> <strong>Rdb7</strong> SQL Reference Manual SQL <strong>Oracle</strong> <strong>Rdb7</strong> SQL Reference ManualSQL SQL SQL 11.1.3 SQL SQL SELECT SQL 1. 2. PREPARE 3. DESCRIBE...MARKERS 4. SELECT SELECT EXECUTE 5. SELECT a. DESCRIBE...SELECT ITEMS b. c. 6. SQL SELECT SQL 11.211-5 EXECUTE IMMEDIATE 11.2 SELECT SQL SQL SELECT EXECUTE IMMEDIATE SQL 11-5


11.2 SELECT SQL SQL EXECUTE IMMEDIATE 11-111-6COBOL SQL EXECUTE IMMEDIATE SELECT SQL 11-1 EXECUTE IMMEDIATE SELECT SQL IDENTIFICATION DIVISION.PROGRAM-ID. EXECUTE_IMMEDIATE_EXAMPLE.** Illustrate EXECUTE IMMEDIATE with a dynamic INSERT statement.*DATA DIVISION.WORKING-STORAGE SECTION.* Variable for DECLARE ALIAS:01 FILESPEC PIC X(20). (1)11-7* Variable to hold the command to be dynamically executed:01 COMMAND_STRING PIC X(240). (2)11-7* Buffer for error handling:01 GETERRVARS.02 error-buffer-len PIC S9(9) COMP VALUE 132.02 error-msg-len PIC S9(9) COMP.02 error-buffer PIC X(132).* Load definition for SQL Communications Area (SQLCA) for error handling:EXEC SQL INCLUDE SQLCA END-EXEC.*************************************************************** P R O C E D U R E D I V I S I O N**************************************************************PROCEDURE DIVISION.START-UP.* Assign value to FILESPEC:DISPLAY "Enter the file spec for the database you want to declare:"ACCEPT FILESPEC. (3)11-7* Declare the database:* (You can name any file for COMPILETIME FILENAME because no* embedded statement in this example requires that SQL attach* to the database.)EXEC SQL DECLARE ALIAS (4)11-7COMPILETIME FILENAME personnelRUNTIME FILENAME :FILESPECEND-EXECDISPLAY "Enter an SQL statement (not SELECT):"11-6 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


11.2 SELECT SQL ACCEPT COMMAND_STRING. (5)11-7* Use EXECUTE IMMEDIATE to execute the statement in COMMAND_STRING:EXEC SQL EXECUTE IMMEDIATE :COMMAND_STRING (6)11-7END-EXECPERFORM CHECKEXEC SQL EXECUTE IMMEDIATE 'ROLLBACK' END-EXEC.PERFORM CHECK.DISPLAY "Rolled back changes. All done.".CLEAR-IT-EXIT.STOP RUN.CHECK.IF SQLCODE NOT = 100 AND SQLCODE NOT = 0 (7)11-7DISPLAY "Error: SQLCODE = ", SQLCODE WITH CONVERSIONCALL "sql_get_error_text" USING BY REFERENCE error-buffer,BY VALUE error-buffer-len,BY REFERENCE error-msg-lenDISPLAY error-bufferEND-IF. 11-111-6(1) FILESPEC (2) SQL COMMAND_STRING (3) FILESPEC (4) DECLARE ALIAS SQL SQL DECLARE ALIAS (5) COMMAND_STRING (6) EXECUTE IMMEDIATE (7) SQL SQLCODE SQL PREPARE EXECUTE 11-111-6EXECUTE IMMEDIATE :COMMAND_STRING * Use these commands to execute one statement several times.EXEC SQL PREPARE STMT1 FROM :COMMAND_STRINGEND-EXECPERFORM CHECKDISPLAY "Statement prepared."PERFORM UNTIL RESPONSE = "NO"EXEC SQL EXECUTE STMT1 SQL 11-7


11.3 END-EXECPERFORM CHECKDISPLAY "Do you want to execute the statement again:"ACCEPT RESPONSEEND-PERFORM. SQL EXECUTE IMMEDIATE 1 SQL DROP INDEX CREATE INDEX %SQL-F-IND_EXISTS, Index DEG_EMP_ID already exists in this database or schemaEXECUTE IMMEDIATE 11.3 11.4 11-13SELECT 11.6 11-19SELECT INSERT UPDATE DELETE SQL SQL EXECUTE SQL SELECT SQL EXECUTE IMMEDIATE PREPARE EXECUTE EXECUTE SQL SQLDA DESCRIBE SQL DESCRIBE DESCRIBE...SELECT LISTDESCRIBE...MARKERS SQLDA SQLDA 11-8 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


11.3 SQLDA SQL SQL LIKE 1 SQL VARCHAR CHAR : MARKERS SELECT LIST <strong>Oracle</strong> <strong>Rdb7</strong> SQLReference Manual DESCRIBE 11.3.1 SQLDA SQLDA2 SQL SQL SQL SQL SQLDASQL SQLDA SQL SQL DESCRIBE...SELECT LIST DESCRIBE...MARKERS SQLDA SQLDA SQLERRD SELECT 11.6.3 11-29AdaCPL/I SQLDA SQLDA SQL SQL SQL SQL SQL SQL SQL SQLDA SQL 2SQLDA2SQLDA2 SQL SQLDA SQLDA2 SQLDA2 11.3.2 11-10C SQL 11-9


11.3 sql_dynamic C SQL SQLDA2 : SQL DESCRIBE SQLDA SQLTYPE SQLLEN SQLDA SQLTYPE SQLLEN SQL 11.3.2 SQLDA SQLDA2 SQLDA SQLDA2 INCLUDE SQLDA SQLDA2 Ada SQLDA_ACCESS C C sql_sqlda.h C #include sql_sqlda.h SQL_T_SQLDA SQL_T_SQLDA2 SQLDA SQLDA2 typedef SQLDA SQLDA2 SQL_T_SQLDA_FULL SQL_T_SQLDA2_FULL SQL_T_SQLDA_FULL CALL SQL SQL_T_SQLDA SQL_T_SQLDA2_FULL CALL SQL SQL_T_SQLDA2 SQL_T_SQLDA_FULL SQL_T_SQLDA2_FULL ■■■■SQLPRCSN--- SQLSCALE--- SQLARGPOS--- SQLFLAGS---16 ■■SQLFLAGS_VALID--- SQLPARAM_IN--- 11-10 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


11.3 ■SQLPARAM_OUT--- SQL_T_SQLDA SQL_T_SQLDA2 INCLUDESQLDA INCLUDE SQLDA2 SQL_T_SQLDA_FULL SQL_T_SQLDA2_FULL sql_sqlda.h INCLUDE SQLDA INCLUDE SQLDA2 2 sql_sqlda.h sql_sqlda.h INCLUDE SQLDA SQLDA2 typedef C ompa q Tru64 UNIXCompaq Tru64 UNIX INCLUDE SQLDA INCLUDESQLDA2 1 Compaq Tru64 UNIX SQLDA SQLDA2 4 SQLDA SQLDA2 SQL COBOL -align OpenVMS INCLUDE SQLDA INCLUDESQLDA2 1 OpenVMS Alpha SQL C C SQL SQL SQLDA SQLDA2 SQLDA SQLDA2 C #pragma nomember_alignment SQL INCLUDE 11.8 11-39 sql_dynamic 2 SQLDA2 SQLDA_IN SQLDA_OUT 11-211-12SQLDA_IN DESCRIBE...MARKERS SQL SQLDA_OUT PREPARE DESCRIBE...SELECT LIST SQL 2 11-211-12sql_dynamic.c SQL 11-11


11.3 SQLDA2 <strong>Oracle</strong> <strong>Rdb7</strong> SQL Reference ManualSQLDA2 11-2 SQLDA2 /* Declare the SQLDA2. */typedefstruct{char sqldaid[8];int sqlabc;short sqln;short sqld;struct sqlvar_struct{short sqltype;long sqllen;int sqloctet_len;char *sqldata;int *sqlind;int sqlchrono_scale;int sqlchrono_precision;short sqlname_len;char sqlname[IDLEN];char sqlchar_set_name[IDLEN];char sqlchar_set_schema[IDLEN];char sqlchar_set_catalog[IDLEN];} sqlvar[MAXPARAMS];} sqlda_rec, *sqlda;...int sql_dynamic (psql_stmt, input_sqlda, output_sqlda, stmt_id, is_select)char *psql_stmt;sqlda *input_sqlda;sqlda *output_sqlda;long *stmt_id;int *is_select;{sqlda sqlda_in, sqlda_out; /* declare the SQLDA structures */... : <strong>Oracle</strong> <strong>Rdb7</strong> SQL Reference ManualSQLDA 11-12 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


11.4 SELECT SQL 11.4 SELECT SQL SQL SQL SQLDA 11-311-13 SELECT SQL C 11.3 SELECT SQL /* This program dynamically executes non-SELECT statements that contain* parameter markers.*/#include #include #include #include /* Maximum number of parameters or select list items is 50.*/#define MAXPARAMS 50#if defined (__osf__) && defined (__DECC)#pragma member_alignment save#pragma member_alignment#elif defined (__DECC)#pragma member_alignment save#pragma nomember_alignment#endif#pragma nostandardstruct SQLDA_STRUCT { (1)char SQLDAID[8];int SQLDABC;short SQLN;short SQLD;struct {short SQLTYPE;short SQLLEN;char *SQLDATA;int *SQLIND;short SQLNAME_LEN;char SQLNAME[30];} SQLVAR[MAXPARAMS];} *SQLDA;#if defined (__osf__) && defined (__DECC)#pragma member_alignment restore#elif defined (__DECC) SQL 11-13


11.4 SELECT SQL #pragma member_alignment restore#endif#pragma standardmain(){char command_string[256]; /* SQL statement text */long SQLCODE;short param;intloop_cntr;char column_name[31];/* Declare pointer variables for each possible data type. The programuses the pointers to dynamically allocate memory to hold values forparameter markers.*/char *charbuf;long *longbuf;short *smallintbuf;SQL_DATE_VMS my_date_vms;/* Allocate SQLDA structures. */ (2)SQLDA = malloc(534);SQLDA->SQLN = MAXPARAMS;/* Declare the alias. */EXEC SQL DECLARE ALIAS FILENAME personnel;/* Start an SQL transaction. */EXEC SQL SET TRANSACTION READ WRITE;if (SQLCODE != 0)goto err;printf("Enter any dynamically-executable SQL statement, ¥n"); (3)printf("except SELECT. ¥n");gets(command_string);if (SQLCODE != 0)goto err;/* Prepare the statement from input entered at run time. */EXEC SQL PREPARE STMT_NAME FROM :command_string; (4)if (SQLCODE != 0)goto err;/* Write information about the parameter markers into the SQLDA. */EXEC SQL DESCRIBE STMT_NAME MARKERS INTO SQLDA; (5)/* For each parameter marker, check the value of SQLDA.SQLVAR.SQLTYPEto determine the data type of the parameter marker, and branch tothe appropriate code to prompt and store the value for that data type.*/param = 0;for (param = 0; param < SQLDA->SQLD; param++) (6){/* Handle null-terminated column name and prompt with the column name. */strncpy (&column_name[0], &SQLDA->SQLVAR[param].SQLNAME[0],11-14 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


11.4 SELECT SQL SQLDA->SQLVAR[param].SQLNAME_LEN);column_name[SQLDA->SQLVAR[param].SQLNAME_LEN] = '¥0';printf ("¥nEnter value for parameter '%s'", column_name);switch (SQLDA->SQLVAR[param].SQLTYPE) (7){case 453 : /* character variable */case 449 : /* variable char variable */printf("¥n(Maximum length is %d)",SQLDA->SQLVAR[param].SQLLEN);printf("¥ndsql> ");/* Allocate storage and get the address for the characterstring. */charbuf = (char *) malloc (SQLDA->SQLVAR[param].SQLLEN);/* Get the string. */gets (charbuf);/* Assign the address to SQLDA. */SQLDA->SQLVAR[param].SQLDATA = charbuf;/* Change the character data type to null-terminated. */SQLDA->SQLVAR[param].SQLTYPE = 506; (8)break; /* Exit the switch block. */case 497 : /* integer variable */printf ("¥ndsql> ");/* Allocate storage for the character string version ofthe integer to be entered.*/charbuf = (char *) malloc (14);/* Get the string. */gets(charbuf);/* Allocate storage for the integer and convert the string. */longbuf = (long *) malloc (SQLDA->SQLVAR[param].SQLLEN);*longbuf = atol(charbuf);/* Assign the address to SQLDA. */SQLDA->SQLVAR[param].SQLDATA = (char *) longbuf;break; /* Exit the switch block. */case 501 : /* short int variable */printf ("¥ndsql> ");/* Allocate storage for the character string version ofthe short integer to be entered. */charbuf = (char *) malloc (5);/* Get the string. */gets (charbuf);/* Allocate storage for the short int and convert the string. */smallintbuf = (short *) malloc(SQLDA->SQLVAR[param].SQLLEN);*smallintbuf = atoi(charbuf);/* Assign the address to SQLDA. */SQLDA->SQLVAR[param].SQLDATA = (char *) smallintbuf;break; /* Exit the switch block. */case 503 : /* Date VMS variable */ SQL 11-15


11.4 SELECT SQL printf ("¥nDate/time format is DD-MMM-YYYY HH:MM:SS.HH ");printf ("¥ndsql> ");/* Allocate storage for the character string version ofthe date and time to be entered. */charbuf = (char *) malloc (23);/* Get the string. */gets (charbuf);/* Use the CAST statement to convert the input character stringto the DATE VMS data type. */EXEC SQLBEGIN SELECT CAST(substring(:charbuf FROM 8 FOR 4) ||-- Convert the month to a number.(CASE SUBSTRING(:charbuf FROM 4 FOR 3)WHEN 'JAN' THEN '01'WHEN 'FEB' THEN '02'WHEN 'MAR' THEN '03'WHEN 'APR' THEN '04'WHEN 'MAY' THEN '05'WHEN 'JUN' THEN '06'WHEN 'JUL' THEN '07'WHEN 'AUG' THEN '08'WHEN 'SEP' THEN '09'WHEN 'OCT' THEN '10'WHEN 'NOV' THEN '11'WHEN 'DEC' THEN '12'END) ||-- Parse the day, hour, minutes, seconds.SUBSTRING(:charbuf FROM 1 FOR 2) ||SUBSTRING(:charbuf FROM 13 FOR 2) ||SUBSTRING(:charbuf FROM 16 FOR 2) ||SUBSTRING(:charbuf FROM 19 FOR 2) ||SUBSTRING(:charbuf FROM 22 for 2)AS DATE VMS) into :my_date_vmsFROM rdb$database LIMIT TO 1 ROW;END;if (SQLCODE != 0)goto err;/* Assign the address to SQLDA. */SQLDA->SQLVAR[param].SQLDATA = (char *) &my_date_vms;break; /* Exit the switch block. */default :printf("¥n¥nError: no data type match on %d",SQLDA->SQLVAR[param].SQLTYPE);break;} /* End switch. */} /* End the for loop. *//* Execute the statement and replace the parameter markers with the11-16 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


11.5 SELECT values in the SQLDA. */EXEC SQL EXECUTE STMT_NAME USING DESCRIPTOR SQLDA;if (SQLCODE != 0)goto err;EXEC SQL COMMIT;return;err: printf("¥n unexpected error %d", SQLCODE);sql_signal();} 11-311-13(1) SQLDA (2) SQLDA (3) SQL (4) (5) DESCRIBE...MARKERS SQLDA (6) SQLD 1 (7) case SQLDA SQLTYPE SQLTYPE malloc() SQLDA (8) CAST NULL 11.5 SELECT 11-311-13 SELECT 10 10-1 SQLCA SQLERRD 2 SELECT SQLERRD 2 0 SQL SELECT 1 SQL SELECT 11.6 11-19SELECT SQL 11-17


11.5 SELECT 11-411-18 sql_dynamic C SQLERRD 2 SELECT SQL EXECUTE 11-4 SQLERRD SELECT SQL .../* Save the value of the SQLCA.SQLERRD[1] field so that the programcan determine if the statement is a SELECT statement or not.If the value is 1, the statement is a SELECT statement.*/*is_select = SQLCA.SQLERRD[1];...if (*is_select)...} /* end if SQLCA.SQLERRD[1] == 1) */else{.../*** If the SQLCA.SQLERRD[1] field is not 1, then the prepared statement is not a** SELECT statement and only needs to be executed. Call an SQL module language** procedure to execute the statement, using information about parameter** markers stored in sqlda_in by the local routine get_in_params:*//* if (SQLCA.SQLERRD[1] != 1)*/{execute_stmt (&SQLCA, stmt_id, sqlda_in);if (SQLCA.SQLCODE != sql_success){printf("¥n¥nError %d returned from execute_stmt",SQLCA.SQLCODE);display_error_message();return (-1);}} /* end if SQLCA.SQLERRD[1] != 1 */} /* end if SQLCA.SQLERRD[1] == 1 */11-18 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


11.6 SELECT 11.6 SELECT SELECT SELECT SELECT SELECT SQL DECLARE CURSOR SELECT DECLARE CURSOR SQL SELECT SELECT DECLARECURSOR DECLARE CURSOR SQL SELECT PREPARE DESCRIBE...SELECT LIST SQLDA SQLDA SQLDA 11.3.1 11-9 11.6.3 11-29 NULL 8 8-1SELECT FETCH SQLDA FETCH 11.6.1 SELECT : 11-511-19 SELECT SQL c_mod_dyn_curs SQL 11-611-20 11-5 SQL SELECT -- This program uses dynamic cursors to fetch a row from a table.--MODULEC_MOD_DYN_CURSLANGUAGE GENERAL SQL 11-19


11.6 SELECT AUTHORIZATION RDB$DBHANDLEPARAMETER COLONSDECLARE ALIAS FILENAME personnel-- Declare the dynamic cursor. Use a statement name to identify a-- prepared SELECT statement.DECLARE CURSOR1 CURSOR FOR STMT_NAME-- Prepare the statement from a statement entered at run time-- and specify that SQL write information about the number and-- data type of select list items to the SQLDA.PROCEDURE PREP_STMT(SQLCODE,:COMMAND_STRING CHAR (256));PREPARE STMT_NAME FROM :COMMAND_STRING;PROCEDURE DESCRIBE(SQLCODE,SQLDA);DESCRIBE STMT_NAME SELECT LIST INTO SQLDA;PROCEDURE OPEN_CURSOR(SQLCODE);OPEN CURSOR1;PROCEDURE FETCH_CURSOR(SQLCODE,SQLDA);FETCH CURSOR1 USING DESCRIPTOR SQLDA;PROCEDURE CLOSE_CURSOR(SQLCODE);CLOSE CURSOR1;PROCEDURE ROLLBACK(SQLCODE);ROLLBACK; 11-611-20SQL C_MOD_DYN_CURS 11-511-19 LANGUAGE GENERAL command_string[256]SQL GENERAL NULL SQL LANGUAGE C SQL NULL 11-6 SELECT /* This program uses dynamic cursors to fetch a row from a table. */#include #include #include #include 11-20 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


11.6 SELECT /* Maximum number of parameters or select list items is 50.*/#define MAXPARAMS 50/* Declare the SQLDA structure. */struct SQLDA_STRUCT {char SQLDAID[8];int SQLDABC;short SQLN;short SQLD;struct {short SQLTYPE;short SQLLEN;char *SQLDATA;int *SQLIND;short SQLNAME_LEN;char SQLNAME[30];} SQLVAR[MAXPARAMS];} *SQLDA;main(){/* General purpose local variables. */int i;long sqlcode;char command_string[256];/* Function prototypes. */void PREP_STMT ();void DESCRIBE ();void OPEN_CURSOR ();void FETCH_CURSOR ();void CLOSE_CURSOR ();void ROLLBACK ();/* Allocate SQLDA structures. */SQLDA = malloc(534);SQLDA->SQLN = 20;/* Get the SELECT statement at run time. */printf("¥n Enter a select statement that retrieves only character ");printf("¥n and integer data. ¥n");printf("¥n Do not end the statement with a semicolon.¥n");gets(command_string);/* Pad the string to end with spaces when using LANGUAGE keyword GENERALin module. */for (i=strlen(command_string);i


11.6 SELECT items to the SQLDA. */DESCRIBE( &sqlcode, SQLDA);if (sqlcode != 0)goto err;/* Open the cursor. */OPEN_CURSOR( &sqlcode );if (sqlcode != 0)goto err;/* Allocate memory. */for (i=0; i < SQLDA->SQLD; i++) {SQLDA->SQLVAR[i].SQLDATA = malloc( SQLDA->SQLVAR[i].SQLLEN);SQLDA->SQLVAR[i].SQLIND = malloc( 2 );}/* Fetch a row. */FETCH_CURSOR( &sqlcode, SQLDA );if (sqlcode != 0)goto err;/* Use the SQLDA to determine the data type of each column in the rowand print the column. For simplicity, test for only two data types. */for (i=0; i < SQLDA->SQLD; i++) {switch (SQLDA->SQLVAR[i].SQLTYPE) {case 453: /* Character */printf( "%.*s ",SQLDA->SQLVAR[i].SQLLEN, SQLDA->SQLVAR[i].SQLDATA );break;case 497: /* Integer */printf( "%d", *SQLDA->SQLVAR[i].SQLDATA );break;}}/* Close the cursor. */CLOSE_CURSOR( &sqlcode );ROLLBACK( &sqlcode );return;err:}printf("¥n unexpected error %d", sqlcode);sql_signal();ROLLBACK( &sqlcode );exit (0);11.6.2 SELECT SELECT 2 SQLDA 11-22 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


11.6 SELECT DESCRIBE...MARKERS DESCRIBE...SELECT LIST DESCRIBE...MARKERS SQLDA DESCRIBE...SELECT LIST SQLDA SQLDA SQL 11-711-23 SQL SELECT c_dyn_extcurs.sc SELECT 11-7 SQL SELECT /* This program dynamically executes SELECT statements that containparameter markers. */#include #include #include #include /* Maximum number of parameters or select list items is 50.*/#define MAXPARAMS 50/* Declare two SQLDA structures -- one for the parameter markers and onefor the select list items. */struct SQLDA_STRUCT {char SQLDAID[8];int SQLDABC;short SQLN;short SQLD;struct {short SQLTYPE;short SQLLEN;char *SQLDATA;int *SQLIND;short SQLNAME_LEN;char SQLNAME[30];} SQLVAR[MAXPARAMS];} *SQLDA, *SQLDA_SL;main(){longSQLCODE;shortparam, *indicator_param;intloop_cntr;int X;charcolumn_name[31]; SQL 11-23


11.6 SELECT char curs_name[10]; /* Name of statement *//* An array to hold two SQL statements. */charcommand_string[2][256];char*command_string1;/* Declare pointer variables for each data type. The program usesthe pointers to dynamically allocate memory to hold values forparameter markers and select list items. */char*charbuf;long*longbuf;short *smallintbuf;char*datebuf;SQL_DATE_VMS my_date_vms;/* Allocate SQLDA structures. */SQLDA_SL = malloc(534);SQLDA_SL->SQLN = 12;SQLDA_SL = malloc(534);SQLDA_SL->SQLN = 12;/* Declare the alias. */EXEC SQL DECLARE ALIAS FILENAME personnel;/* Execute a loop to get two SELECT statements from the user. */X=0;while ( X < 2 ){printf("Enter any SELECT statement. ¥n");printf("Do not end the statement with a semicolon. ¥n");gets(&command_string[X][0]);/* Assign a statement name to each SELECT statement. */if (X == 0)strcpy(curs_name, "ONE");elseif (X == 1)strcpy(curs_name, "TWO");else printf("¥n No such statement. ¥n");X++;}/* Prompt the user for the name of a statement. */printf("¥n Which statement do you want to execute, ¥n");printf("ONE or TWO? To quit, type EXIT.¥n");gets(curs_name);/* Assign the correct SQL statement to the cursor name. */if (strcpy(curs_name, "ONE" ))command_string1 = &command_string[0][0];if (curs_name == "TWO" )command_string1 = &command_string[1][0];if (curs_name == "EXIT")goto end_program;/* Start an SQL transaction. */11-24 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


11.6 SELECT EXEC SQL SET TRANSACTION READ WRITE;if (SQLCODE != 0)goto err;/* Prepare the statement from input entered at run time. */EXEC SQL PREPARE stmt_id FROM :command_string1;if (SQLCODE != 0)goto err;/* Write information about the parameter markers into the SQLDA. */EXEC SQL DESCRIBE stmt_id MARKERS INTO SQLDA;if (SQLCODE != 0)goto err;/* Write information about the select list items into the SQLDA. */EXEC SQL DESCRIBE stmt_id SELECT LIST INTO SQLDA_SL;if (SQLCODE != 0)goto err;/* For each parameter marker, check the value of SQLDA.SQLVAR.SQLTYPEto determine the data type of the parameter marker, and branch tothe appropriate code to prompt and store the value for that data type. */param = 0;for (param = 0; param < SQLDA->SQLD; param++){/* Handle a null-terminated column name and prompt with the column name. */strncpy (&column_name[0], &SQLDA->SQLVAR[param].SQLNAME[0],SQLDA->SQLVAR[param].SQLNAME_LEN);column_name[SQLDA->SQLVAR[param].SQLNAME_LEN] = '¥0';printf ("¥nEnter value for parameter '%s'", column_name);switch (SQLDA->SQLVAR[param].SQLTYPE){case 453 : /* character variable */case 449 : /* variable char variable */printf("¥n(Maximum length is %d)",SQLDA->SQLVAR[param].SQLLEN);printf("¥ndsql> ");/* Allocate storage and get the address for the characterstring. */charbuf = (char *) malloc (SQLDA->SQLVAR[param].SQLLEN);/* Get the string. */gets (charbuf);/* Assign the address to SQLDA. */SQLDA->SQLVAR[param].SQLDATA = charbuf;break; /* Exit the switch block */case 497 : /* integer variable */printf ("¥ndsql> ");/* Allocate storage for the character string version ofthe integer to be entered. */charbuf = (char *) malloc (14);/* Get the string. */gets (charbuf); SQL 11-25


11.6 SELECT /* Allocate storage for the integer and convert the string. */longbuf = (long *) malloc (SQLDA->SQLVAR[param].SQLLEN);*longbuf = atol (charbuf);/* Assign the address to SQLDA */SQLDA->SQLVAR[param].SQLDATA = (char *) longbuf;break; /* Exit the switch block */case 501 : /* short int variable */printf ("¥ndsql> ");/* Allocate storage for the character string version ofthe short integer to be entered.*/charbuf = (char *) malloc (5);/* Get the string. */gets (charbuf);/* Allocate storage for the short int and convert the string. */smallintbuf = (short *) malloc(SQLDA->SQLVAR[param].SQLLEN);*smallintbuf = atoi (charbuf);/* Assign the address to SQLDA. */SQLDA->SQLVAR[param].SQLDATA = (char *) smallintbuf;break; /* Exit the switch block */case 503 : /* date type variable */printf ("¥nDate-time format is DD-MMM-YYYY HH:SS:MM.CC ");printf ("¥ndsql> ");/* Allocate storage for the character string version ofthe date-time. */charbuf = (char *) malloc (23);/* Get the string. */gets (charbuf);EXEC SQL SELECTCAST(substring(:charbuf FROM 8 FOR 4) ||-- Convert the month to a number.(CASE SUBSTRING(:charbuf FROM 4 FOR 3)WHEN 'JAN' THEN '01'WHEN 'FEB' THEN '02'WHEN 'MAR' THEN '03'WHEN 'APR' THEN '04'WHEN 'MAY' THEN '05'WHEN 'JUN' THEN '06'WHEN 'JUL' THEN '07'WHEN 'AUG' THEN '08'WHEN 'SEP' THEN '09'WHEN 'OCT' THEN '10'WHEN 'NOV' THEN '11'WHEN 'DEC' THEN '12'END) ||-- Parse the day, hour, minutes, seconds.SUBSTRING(:charbuf FROM 1 FOR 2) ||SUBSTRING(:charbuf FROM 13 FOR 2) ||11-26 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


11.6 SELECT SUBSTRING(:charbuf FROM 16 FOR 2) ||SUBSTRING(:charbuf FROM 19 FOR 2) ||SUBSTRING(:charbuf FROM 22 for 2)AS DATE VMS) into :my_date_vmsFROM rdb$database LIMIT TO 1 ROW;/* Assign the address to SQLDA. */SQLDA->SQLVAR[param].SQLDATA = (char *) &my_date_vms;break; /* Exit the switch block. */default :printf("¥n¥nError: no data type match on %d",SQLDA->SQLVAR[param].SQLTYPE);break;} /* End switch. */} /* End the for loop. *//* Declare the extended dynamic cursor, using the name the user enters. */EXEC SQL DECLARE curs_name CURSOR FOR stmt_id;if (SQLCODE != 0)goto err;/* Open the cursor. */EXEC SQL OPEN curs_name USING DESCRIPTOR SQLDA;if (SQLCODE != 0)goto err;/* Allocate memory. */for (param=0; param < SQLDA_SL->SQLD; param++) {SQLDA_SL->SQLVAR[param].SQLDATA = malloc( SQLDA_SL->SQLVAR[param].SQLLEN );SQLDA_SL->SQLVAR[param].SQLIND = malloc( 2 );}/* Fetch the cursor and get information about the select list itemsfrom the SQLDA. */EXEC SQL FETCH curs_name USING DESCRIPTOR SQLDA_SL;if (SQLCODE != 0)goto err;/* Allocate storage for select list items in the statement string suppliedby the user. Also, allocate storage for indicator parameters associatedwith the select list items, which indicate the occurrence of a NULLvalue being returned for an item in the database. *//* For each select list item, execute a loop. */for (param = 0; param < SQLDA_SL->SQLD; param++){/* Allocate storage for an indicator array. */indicator_param = (short *) malloc (sizeof (short));/* Write the address of indicator_param to SQLDA_SL.SQLVAR.SQLIND */SQLDA_SL->SQLVAR[param].SQLIND = indicator_param;/* Check the value of SQLDA_SL.SQLVAR.SQLTYPE to determine the datatype of the select list item and branch to the allocation blockfor that data type. */switch (SQLDA_SL->SQLVAR[param].SQLTYPE) SQL 11-27


11.6 SELECT {case 453 : /* character variable */case 449 : /* variable char variable *//* Allocate storage and get address for the character string. */charbuf = (char *) malloc (SQLDA_SL->SQLVAR[param].SQLLEN);charbuf = (char *) malloc(SQLDA_SL->SQLVAR[param].SQLLEN+1);/* Copy the value to a string with a null terminator. */strncpy (charbuf, SQLDA_SL->SQLVAR[param].SQLDATA,SQLDA_SL->SQLVAR[param].SQLLEN);*(charbuf + SQLDA_SL->SQLVAR[param].SQLLEN) = '¥0';/* Display the value in the buffer. */printf ("%s ", charbuf);break; /* Exit the switch block. */case 497 : /* integer variable *//* Allocate storage for the integer. */longbuf = (long *) malloc (SQLDA_SL->SQLVAR[param].SQLLEN);printf ("%ld ", (long)(*SQLDA_SL->SQLVAR[param].SQLDATA));break; /* Exit the switch block. */case 501 : /* short int variable *//* Allocate storage for the short int. */smallintbuf = (short *) malloc (SQLDA_SL->SQLVAR[param].SQLLEN);printf ("%d ", (short)(*SQLDA_SL->SQLVAR[param].SQLDATA));break; /* Exit the switch block. */case 503 : /* date type variable */memcpy( &my_date_vms,SQLDA_SL->SQLVAR[param].SQLDATA,sizeof( SQL_DATE_VMS ) );datebuf = (char *) malloc (24);charbuf = (char *) malloc (24);EXEC SQLBEGINSET :datebuf = CAST(:my_date_vms AS CHAR(24));END;if (SQLCODE != 0)goto err;printf ("%s ", datebuf);break; /* Exit the switch block. */} /* End switch. */} /* End the for loop. *//* Close the cursor. */EXEC SQL CLOSE curs_name;if (SQLCODE != 0)goto err;EXEC SQL COMMIT;return;err: printf("¥n unexpected error %d", SQLCODE);sql_signal();end_program:11-28 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


11.6 SELECT }return;11.6.3 SQLDA2 SQLERRD SELECT sql_dynamic SQLDA2 SQLERRD SQL 11-811-29 11-8 SELECT /* Declare arrays for storage of original data types and allocate memory. */mem_ptr output_save;mem_ptr input_save;/* If NULL sqlda was passed, then a statement is being prepared. */if ((*input_sqlda == NULL) && (*output_sqlda == NULL)){new_statement = TRUE;/* Allocate separate SQLDAs for parameter markers (SQLDA_IN) and selectlist items (SQLDA_OUT). Assign value of the constant MAXPARAMS tothe SQLN field of both SQLDA structures. SQLN specifies to SQL themaximum size of the SQLDA. */(1)if ((sqlda_in = (sqlda) calloc (1, sizeof (sqlda_rec))) == 0){printf ("¥n¥n*** Error allocating memory for sqlda_in: Abort");return (-1);}else /* Set number of possible parameters. */sqlda_in->sqln = MAXPARAMS;if ((sqlda_out = (sqlda) calloc (1, sizeof (sqlda_rec))) == 0){printf ("¥n¥n*** Error allocating memory for sqlda_out: Abort");return (-1);}else/* Set number of possible select list items. */sqlda_out->sqln = MAXPARAMS;/* Copy name SQLDA2 to identify the SQLDA. */strncpy(&sqlda_in->sqldaid[0],"SQLDA2 ",8);strncpy(&sqlda_out->sqldaid[0],"SQLDA2 ",8);/* Call the SQL module language procedures prepare_stmt anddescribe_select which contain PREPARE and DESCRIBE...SELECT LISTstatements to prepare the dynamic statement and writeinformation about any select list items in it to sqlda_out. */ SQL 11-29


11.6 SELECT *stmt_id = 0; /* if 0 the BADPREPARE error results in the PREPARE*/prepare_stmt (&SQLCA, stmt_id, psql_stmt); (2)if (SQLCA.SQLCODE != sql_success){printf ("¥n¥nDSQL-E-PREPARE, Error %d encountered in PREPARE",SQLCA.SQLCODE);display_error_message();return (-1);}describe_select (&SQLCA, stmt_id, sqlda_out); (3)if (SQLCA.SQLCODE != sql_success){printf ("¥n¥nDSQL-E-PREPARE, Error %d encountered in PREPARE",SQLCA.SQLCODE);display_error_message();return (-1);}/* Call an SQL module language procedure, describe_parm, which contains aDESCRIBE...MARKERS statement to write information about any parametermarkers in the dynamic statement to sqlda_in. */describe_parm (&SQLCA, stmt_id, sqlda_in); (4)if (SQLCA.SQLCODE != sql_success){printf ("¥n¥n*** Error %d returned from describe_parm: Abort",SQLCA.SQLCODE);display_error_message();return (-1);}/* Save the value of the SQLCA.SQLERRD[1] field so that the programcan determine if the statement is a SELECT statement or not.If the value is 1, the statement is a SELECT statement.*/*is_select = SQLCA.SQLERRD[1];.../* Check to see if the prepared dynamic statement contains any parametermarkers by looking at the SQLD field of sqlda_in. SQLD contains thenumber of parameter markers in the prepared statement. If SQLD ispositive, the prepared statement contains parameter markers. The programexecutes a local routine, get_in_params, that prompts the user forvalues, allocates storage for those values, and updates the SQLDATA fieldof sqlda_in. */if (sqlda_in->sqld > 0) (5)if ((status = get_in_params(sqlda_in,input_save)) != 0){printf ("¥nError returned from get_in_params. Abort");return (-1);11-30 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


11.6 SELECT }/* Check to see if the prepared dynamic statement is a SELECT statementby looking at the value in is_select, which stores the value ofthe SQLCA.SQLERRD[1] field. If that value is equal to 1, thethe prepared statement is a SELECT statement. The program allocatesstorage for rows for SQL module language procedures to open andfetch from a cursor and displays the rows on the terminal. */if (*is_select) (6){if (new_statement == TRUE) /* allocate buffers for output */{/* assign a unique name for the cursor */sprintf(cursor_name,"%2d",++cursor_counter);if ((status = allocate_buffers(sqlda_out)) != 0).../* If the SQLCA.SQLERRD[1] field is not 1, the prepared statement is not aSELECT statement and only needs to be executed. Call an SQL module languageprocedure to execute the statement, using information about parametermarkers stored in sqlda_in by the local routine get_in_params. */if (SQLCA.SQLERRD[1] != 1){execute_stmt (&SQLCA, stmt_id, sqlda_in);... 11-811-29(1) SQLDA_IN SQLDA_OUT (2) SQL PREPARE SQL (3) SQL DESCRIBE...SELECT LIST SQL SQLDA_OUT (4) SQL DESCRIBE...MARKERS SQL SQLDA_IN (5) SQLDA_IN.SQLD SQL GET_IN_PARAMS SQL (6) SQLERRD 2 1 SQL SELECT ALLOCATE BUFFERS SQL 11-31


11.7 SQL 0 SQL SELECT CALL EXECUTE 11.7 SQL PREPAREDESCRIBE DECLARE CURSOROPENFETCH SQL SQL SQL SQL SELECT SQL PREPARE PREPARE EXECUTE SELECT SELECT SQL PREPARE SQL DECLARE CURSOR DECLARECURSOR SELECT SQL SQL 1 PREPARE DECLARE CURSOR SELECT DECLARE CURSOR sql_multi_stmt_dyn.sqlada SQL SQL SQL SQL 11.7.1 11-911-3311-32 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


11.7 SQL 11-9 -- Declare tables of procedure names, identifiers, and cursor names,-- a counter, and an index.-- The array PROCEDURE_NAMES holds the name that the user gives each-- statement. You may decide to keep track of the statements in a-- different way. The array PROCEDURE_IDS holds the statement-- identifiers generated by the PREPARE statement. The array-- CURSOR_NAMES holds the cursor names.PROCEDURE_NAMES : array(1..maxprocs) of string(1..name_strlng);PROCEDURE_IDS : array(1..maxprocs) of integer;CURSOR_NAMES : array(1..maxprocs) of string(1..name_strlng);-- The NUMBER_OF_PROCS procedure increments the array elements when-- the program stores information. The STMT_INDEX procedure increments-- the array elements when the program looks up information.NUMBER_OF_PROCS : short_integer := 0;STMT_INDEX : short_integer := 0;...-- This section of the program stores the values of the parameters for-- statement identifiers and cursor names in arrays.number_of_procs := number_of_procs + 1;-- Assign information about parameter markers and select list items to-- array elements.sqlda_in_array(number_of_procs) := sqlda_in;sqlda_out_array(number_of_procs) := sqlda_out;-- Assign the user-specified statement name to an array element. Assign-- the statement identifier returned by the PREPARE statement to an-- array element. In addition, if the statement is a SELECT statement,-- assign the cursor name to an array element.procedure_names(number_of_procs) := cur_name;procedure_ids(number_of_procs) := cur_procid;if cur_op(1) = 'R' thencursor_names(number_of_procs) := cur_cursor;end if;11.7.2 SELECT SQL SQL SELECT SQL PREPAREPREPARE DESCRIBE...MARKERS EXECUTE 11-1011-34 sql_multi_stmt_dyn.sqlada SQL SELECT SQL SQL 11-33


11.7 SQL PREPARE_SQL PREPARE DESCRIBE...SELECT LIST DESCRIBE...MARKERS PREPARE_SQL SELECT SELECT SQL EXECUTE_SQL SELECT SQL PREPARE SELECT SQL DESCRIBE...SELECT LIST 11-10 SELECT SQL -- This procedure prepares a statement for dynamic execution from the-- string passed to it. It can prepare any number of statements because-- the statement is passed to it as the parameter cur_stmt.procedure PREPARE_SQL isCUR_CURSOR : string(1..31) := (others => ' ');CUR_PROCID : integer := 0;CUR_STMT : string(1..1024) := (others => ' ');begin-- Allocate separate SQLDAs for parameter markers (sqlda_in) and select list-- items (sqlda_out). Assign the value of the constant MAXPARMS (set in the-- declarations section) to the SQLN field of both SQLDA structures. SQLN-- specifies to SQL the maximum size of the SQLDA.sqlda_in := new sqlda_record;sqlda_in.sqln := maxparms;sqlda_out := new sqlda_record;sqlda_out.sqln := maxparms;-- Assign the SQL statement that was constructed in the procedure-- CONSTRUCT_SQL to the variable cur_stmt.cur_stmt := sql_stmt;-- Use the PREPARE statement to prepare the dynamic statement-- for dynamic execution from the string passed to it.EXEC SQL PREPARE :cur_procid FROM :cur_stmt;case sqlca.sqlcode iswhen sql_success => null;when others => raise syntax_error;end case;-- Use the DESCRIBE ... SELECT LIST statement to write information-- about the number and data type of any select list items in the-- statement to an SQLDA (specifically, the sqlda_out SQLDA specified).EXEC SQL DESCRIBE :cur_procid SELECT LIST INTO :sqlda_out;case sqlca.sqlcode iswhen sql_success => null;when others => raise syntax_error;end case;-- Use the DESCRIBE...MARKERS statement to write information about any-- parameter markers in the dynamic statement to sqlda_in. The statement-- writes information to an SQLDA (specifically, the sqlda_in SQLDA-- specified) about the number and data type of any parameter markers in11-34 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


11.7 SQL -- the prepared dynamic statement. SELECT statements may also have-- parameter markers.EXEC SQL DESCRIBE :cur_procid MARKERS INTO sqlda_in;case sqlca.sqlcode iswhen sql_success => null;when others => raise syntax_error;end case;...procedure EXECUTE_SQL isbegin---- This procedure dynamically executes a non-SELECT statement.-- SELECT statements are processed by DECLARE CURSOR, OPEN CURSOR,-- and FETCH statements.---- The EXECUTE statement specifies an SQLDA (specifically, the sqlda_in-- SQLDA specified) as the source of addresses for any parameter-- markers in the dynamic statement.---- The EXECUTE statement with the USING DESCRIPTOR clause also-- handles statement strings that contain no parameter markers.-- If a statement string contains no parameter markers, SQL sets-- the SQLD field of the SQLDA to zero.--sqlda_in := new sqlda_record;sqlda_in := sqlda_in_array(stmt_index);cur_procid := procedure_ids(stmt_index);EXEC SQL EXECUTE :cur_procid USING DESCRIPTOR :sqlda_in;end EXECUTE_SQL;11.7.3 SELECT SELECT SQL PREPARE PREPARE DESCRIBE...SELECT LIST DESCRIBE...MARKERS DECLARECURSOR DECLARE CURSOR OPEN FETCH CLOSE PREPARE PREPARE 31 DECLARE CURSOR PREPAREDESCRIBEFETCHOPEN SQL 11-35


11.7 SQL CLOSE SQL 11-1111-36 sql_multi_stmt_dyn.sqlada SQL SELECT PREPARE_SQL PREPARE DESCRIBE...SELECT LIST DESCRIBE...MARKERS DECLARE CURSOR PREPARE_SQL SELECT SELECT SQL DISPLAY_DATA OPENFETCH CLOSE 11-11 SELECT -- This procedure prepares a statement for dynamic execution from the-- string passed to it. It can prepare any number of statements because-- the statement is passed to it as the parameter cur_stmt.procedure PREPARE_SQL isCUR_CURSOR : string(1..31) := (others => ' ');CUR_PROCID : integer := 0;CUR_STMT : string(1..1024) := (others => ' ');begin-- Allocate separate SQLDAs for parameter markers (sqlda_in) and select list-- items (sqlda_out). Assign the value of the constant MAXPARMS (set in the-- declarations section) to the SQLN field of both SQLDA structures. SQLN-- specifies to SQL the maximum size of the SQLDA.sqlda_in := new sqlda_record;sqlda_in.sqln := maxparms;sqlda_out := new sqlda_record;sqlda_out.sqln := maxparms;-- Assign the SQL statement that was constructed in the procedure-- CONSTRUCT_SQL to the variable cur_stmt.cur_stmt := sql_stmt;-- Use the PREPARE statement just to prepare the dynamic statement-- for dynamic execution from the string passed to it and not-- to write information about select list items to an SQLDA.EXEC SQL PREPARE :cur_procid FROM :cur_stmt;case sqlca.sqlcode iswhen sql_success => null;when others => raise syntax_error;end case;-- Use the DESCRIBE ... SELECT LIST statement to write information-- about the number and data type of any select list items in the-- statement to an SQLDA (specifically, the sqlda_out SQLDA specified).EXEC SQL DESCRIBE :cur_procid SELECT LIST INTO :sqlda_out;case sqlca.sqlcode is11-36 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


11.7 SQL when sql_success => null;when others => raise syntax_error;end case;-- Use the DESCRIBE...MARKERS statement to write information about any-- parameter markers in the dynamic statement to sqlda_in. The statement-- writes information to an SQLDA (specifically, the sqlda_in SQLDA-- specified) about the number and data type of any parameter markers in-- the prepared dynamic statement. SELECT statements may also have-- parameter markers.EXEC SQL DESCRIBE :cur_procid MARKERS INTO sqlda_in;case sqlca.sqlcode iswhen sql_success => null;when others => raise syntax_error;end case;-- If the operation is 'R' (read), create a unique name for the cursor-- name so that the program can pass the cursor name to the extended-- dynamic DECLARE CURSOR statement.if cur_op(1) = 'R' thencur_cursor(1) := 'C';cur_cursor(2..name_strlng) := cur_name(1..name_strlng - 1);-- Declare the extended dynamic cursor.EXEC SQL DECLARE :cur_cursor CURSOR FOR :cur_procid;case sqlca.sqlcode iswhen sql_success => null;when others => raise syntax_error;end case;end if;-- This section of the program stores the values of the parameters for-- statement identifiers and cursor names in arrays.number_of_procs := number_of_procs + 1;-- Assign information about parameter markers and select list items to-- array elements.sqlda_in_array(number_of_procs) := sqlda_in;sqlda_out_array(number_of_procs) := sqlda_out;-- Assign the user-specified statement name to an array element. Assign-- the statement identifier returned by the PREPARE statement to an-- array element. In addition, if the statement is a SELECT statement,-- assign the cursor name to an array element.procedure_names(number_of_procs) := cur_name;procedure_ids(number_of_procs) := cur_procid;if cur_op(1) = 'R' thencursor_names(number_of_procs) := cur_cursor;end if;...end PREPARE_SQL; SQL 11-37


11.7 SQL ...procedure DISPLAY_DATA is...begin -- procedure body DISPLAY_DATA-- Before displaying any data, allocate buffers to hold the data-- returned by SQL.--allocate_buffers;-- Allocate and assign SQLDAs for the requested SQL procedure.--sqlda_in := new sqlda_record;sqlda_in := sqlda_in_array(stmt_index);sqlda_out := new sqlda_record;sqlda_out := sqlda_out_array(stmt_index);cur_cursor := cursor_names(stmt_index);-- Open the previously declared cursor. The statement specifies-- an SQLDA (specifically, sqlda_in) as the source of addresses for any-- parameter markers in the cursor's SELECT statement.--EXEC SQL OPEN :cur_cursor USING DESCRIPTOR sqlda_in;case sqlca.sqlcode iswhen sql_success => null;when others => raise unexpected_error;end case;-- Fetch the first row from the result table. This statement fetches a-- row from the opened cursor and writes it to the addresses specified-- in an SQLDA (specifically, sqlda_out).--EXEC SQL FETCH :cur_cursor USING DESCRIPTOR sqlda_out;case sqlca.sqlcode is-- Check to see if the result table has any rows.when sql_success => null;when stream_eof =>put_line("No records found.");new_line;when others => raise unexpected_error;end case;-- Set up a loop to display first row, fetch and display second and-- subsequent rows.rowcount := 0;while sqlca.sqlcode = 0 looprowcount := rowcount + 1;-- Execute the DISPLAY_ROW procedure.11-38 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


11.8 display_row;-- To display only 5 rows, exit the loop if the loop counter-- equals MAXROW (hardcoded as 5 in this program).if rowcount = maxrows then exit; end if;-- Fetch another row, exit the loop if no more rows.EXEC SQL FETCH :cur_cursor USING DESCRIPTOR sqlda_out;case sqlca.sqlcode iswhen sql_success => null;when stream_eof => exit;when others => raise unexpected_error;end case;end loop;-- Close the cursor.EXEC SQL CLOSE :cur_cursor;case sqlca.sqlcode iswhen sql_success => null;when others => raise unexpected_error;end case;...end DISPLAY_DATA;11.8 11.7 11-32 sql_multi_stmt_dyn.sqlada sql_dynamic SQL SQL 11-111-6sql_dynamic SQL SELECT SELECT SQL SQLDA2 C sql_dynamic 2 ■■sql_dynamic_driver_i.c SQL sql_dynamic.c sql_dynamic.c sql_dynamic_c.sqlmod SQL SQL sql_dynamic_driver_m.c sql_dynamic_driver_m.c 1 INSERT 1 SELECT SQL 11-39


11.8 1 UPDATE SQL$DATABASE SQL_DATABASE ■■sql_dynamic.c sql_dynamic_c.sqlmod SQL sql_dynamic_i DynamicSQL> @filename.sql This program processes any valid SQL statement using dynamic SQL.Enter the SQL statement to process on the following line(s), terminating yourstatement with a semicolon :DynamicSQL> @dynamic.sql; dynamic.sql ATTACH 'FILENAME personnel';SELECT LAST_NAME,FIRST_NAME,EMPLOYEE_ID FROM EMPLOYEESORDER BY EMPLOYEE_ID;SELECT LAST_NAME,BIRTHDAY FROM EMPLOYEES WHERE EMPLOYEE_ID > ?;...sql_dynamic_i This program processes any valid SQL statement using dynamic SQL.Enter the SQL statement to process on the following line(s), terminating yourstatement with a semicolon :DynamicSQL> ATTACH 'FILENAME mf_personnel';The SQL statement to be executed dynamically is:ATTACH 'FILENAME mf_personnel';Enter the SQL statement to process on the following line(s), terminating yourstatement with a semicolon :DynamicSQL> SELECT * FROM EMPLOYEES WHERE LAST_NAME = ?;The SQL statement to be executed dynamically is:SELECT * FROM EMPLOYEES WHERE LAST_NAME = ?;Enter value for parameter 'LAST_NAME'(Maximum length is 14)Nash----------------------------------------Field EMPLOYEE_ID:00168Field LAST_NAME:NashField FIRST_NAME:Norman11-40 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


11.8 Field MIDDLE_INITIAL: NULL...DynamicSQL>[Ctrl]+[Z]$sql_dynamic SQL SQL sql_dynamic PREPARE DESCRIBE SQL PREPARE DESCRIBE SQLCA SQLERRD SQL SELECT SQLDA2 sql_dynamic ■■GET_IN_PARAMSSQL GET_IN_PARAMS SQL SQLDA2 ALLOCATE_BUFFERSSQL SELECT ALLOCATE_BUFFERS SQL SQLDA2 SELECT sql_dynamic SQL OPEN ■■SQL DISPLAY_ROW ALLOCATE_BUFFERS SELECT sql_dynamic SQL EXECUTE sql_dynamic SQL 11-41


11.8 11-42 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


IV 4 SQL ■■■


12SQL SQL 1 SQL ■■■■■■■■■SQL 12-1


12.1 12.1 SQL SQL SQL ■SQL ■■■■■IF FOR CALL SQL SQL SQL SQL 12.2 SQL / <strong>Oracle</strong> Rdb 1 ■■1 1 1 ■12-2 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


12.3 ■■■■ / 1 ATOMIC 12.3 BEGIN END SQL 1 SQL SQL> BEGIN1> UPDATE DEPARTMENTS2> SET MANAGER_ID = '00167'3> WHERE DEPARTMENT_CODE = 'SALE';4> UPDATE JOB_HISTORY5> SET JOB_END = CURRENT_TIMESTAMP6> WHERE EMPLOYEE_ID = '00167' AND JOB_END IS NULL;7> INSERT INTO JOB_HISTORY8> (EMPLOYEE_ID, DEPARTMENT_CODE, JOB_CODE, JOB_START)9> VALUES10> ('00167', 'SALE', 'DMGR', CURRENT_TIMESTAMP);11> END;SQL>SQL SQL ■■■■SQL 1 SELECT UPDATE INSERT DELETE 1 SELECT SELECT CASE CASE 1 FOR FOR SQL FOR DECLARE CURSOR OPEN FETCHCLOSE SQL 12-3


12.3 ■■■■■■■■■IF IF 1 SQL LOOP LOOP LEAVE WHILE TRUE 1 SQL LEAVE LEAVE TRACE TRACE TRACE CALL CALL CALL GET DIAGNOSTICS GET DIAGNOSTICS SIGNAL SIGNAL 12.3.1 SQL SQL DECLARE SET DECLARE DEFAULT :mgrid UPDATE SQL> BEGIN1> DECLARE :mgrid CHAR(5);2> SET :mgrid = '00167';3> UPDATE DEPARTMENTS4> SET MANAGER_ID = :mgrid12-4 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


12.3 5> WHERE DEPARTMENT_CODE = 'SALE';6> END;SQL>LIST DEFAULT DECLARE :mgrid CHAR(5) DEFAULT '00167';DEFAULT =SQL UPDATABLE CONSTANT :mgrid DECLARE :mgrid CONSTANT CHAR(5) DEFAULT '00167' ;CONSTANT UPDATABLE SET INTO OUT INOUT SQL SQL NULL NULL SET DECLARE DEFAULT NULL SQL :job_end_date NULL BEGINDECLARE :job_end_date DATE;SELECT JOB_END INTO :job_end_date FROM JOB_HISTORYWHERE EMPLOYEE_ID = '00180';END;SQL 12-5


12.3 SQL :inc :inc BEGIN-- Because :inc is declared as SMALLINT(3), SQL multiplies the salaries-- of employees in NH by 1.055.DECLARE :inc SMALLINT(3);SET :inc = 1.055;UPDATE SALARY_HISTORYSET SALARY_AMOUNT = (SALARY_AMOUNT * :inc)WHERE SALARY_END IS NULLAND EMPLOYEE_ID IN (SELECT EMPLOYEE_ID FROM EMPLOYEESWHERE STATE = 'NH');BEGIN-- Because :inc is declared as INTEGER(2), SQL rounds the number to-- two decimal places (1.07) before it multiplies the salaries-- of employees in MA.DECLARE :inc INTEGER(2);-- The SET statement assigns a new value to the variable :inc.SET :inc = 1.066;UPDATE SALARY_HISTORYSET SALARY_AMOUNT = (SALARY_AMOUNT * :inc)WHERE SALARY_END IS NULLAND EMPLOYEE_ID IN (SELECT EMPLOYEE_ID FROM EMPLOYEESWHERE STATE = 'MA');END;-- Because the following statement is in the outer compound statement,-- :inc is declared as SMALLINT(3) with the value 1.055. As a result,-- SQL multiplies the salaries of employees in CT by 1.055.UPDATE SALARY_HISTORYSET SALARY_AMOUNT = (salary_amount * :inc)WHERE SALARY_END IS NULLAND EMPLOYEE_ID IN (SELECT EMPLOYEE_ID FROM EMPLOYEESWHERE STATE = 'CT');END;SET DECLARE <strong>Oracle</strong> <strong>Rdb7</strong> SQL Reference Manual12.3.2 IF IF 1 SQL 12-6 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


12.3 SQL IF UPDATE :mgrid 1 SELECT INTO MANAGER_ID IF MANAGER_ID ID SQL THEN UPDATE MANAGER_ID SQL THEN UPDATE -- Use the EXEC SQL keywords with compound statements, just as with simple-- SQL statements.EXEC SQL BEGINDECLARE :cur_mgrid CHAR(5);SELECT MANAGER_ID INTO :cur_mgrid FROM DEPARTMENTSWHERE DEPARTMENT_CODE = 'SALE';-- You must precede host language variables with a colon when you use them-- in compound statements.IF :cur_mgrid :mgridTHENUPDATE DEPARTMENTSSET MANAGER_ID = :mgridWHERE DEPARTMENT_CODE = 'SALE';END IF;END;IF IF ELSEIF SQL IF ELSEIF BEGINDECLARE :state_code CHAR(2);DECLARE :mgrid CHAR(5);DECLARE :cur_mgrid CHAR(5);SET :mgrid = '00167';SELECT D.MANAGER_ID, E.STATE INTO :cur_mgrid, :state_codeFROM DEPARTMENTS D, EMPLOYEES EWHERE DEPARTMENT_CODE = 'SALE'AND D.MANAGER_ID = E.EMPLOYEE_ID;-- Outer IF statement.-- If the manager is a new manager, update the table.IF :cur_mgrid :mgridTHENUPDATE DEPARTMENTSSET MANAGER_ID = :mgridWHERE DEPARTMENT_CODE = 'SALE';-- Nested IF statement.SQL 12-7


12.3 -- Give the new manager a raise. The amount depends on the manager's-- state.IF :state_code = 'NH'THENUPDATE SALARY_HISTORY SSET SALARY_AMOUNT = (salary_amount * 1.05)WHERE SALARY_END IS NULLAND EMPLOYEE_ID = :mgrid;-- ELSEIF clause of nested IF statement.ELSEIF :state_code = 'MA'THENUPDATE SALARY_HISTORY SSET SALARY_AMOUNT = (salary_amount * 1.07)WHERE SALARY_END IS NULLAND EMPLOYEE_ID = :mgrid;-- ELSE clause executes if the :state_code is neither NH nor MA.ELSEUPDATE SALARY_HISTORY SSET SALARY_AMOUNT = (salary_amount * 1.06)WHERE SALARY_END IS NULLAND EMPLOYEE_ID = :mgrid;END IF;END IF;END;12.3.3 CASE CASE 1 12.3.2 12-6 IF...ELSEIF IF CASE BEGINDECLARE :state_code CHAR(2);DECLARE :mgrid CHAR(5);DECLARE :cur_mgrid CHAR(5);SET :mgrid = '00167';SELECT D.MANAGER_ID, E.STATE INTO :cur_mgrid, :state_codeFROM DEPARTMENTS D, EMPLOYEES EWHERE DEPARTMENT_CODE = 'SALE'AND D.MANAGER_ID = E.EMPLOYEE_ID;-- Outer IF statement.IF :cur_mgrid :mgridTHEN12-8 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


12.3 UPDATE DEPARTMENTSSET MANAGER_ID = :mgridWHERE DEPARTMENT_CODE = 'SALE';-- CASE statement. Give the new manager a raise. Because of differences in-- state taxes, the amount varies with the state in which the manager resides.CASE :state_codeWHEN 'NH'THEN UPDATE SALARY_HISTORY SSET SALARY_AMOUNT = (salary_amount * 1.05)WHERE SALARY_END IS NULLAND EMPLOYEE_ID = :mgrid;WHEN 'MA'THEN UPDATE SALARY_HISTORY SSET SALARY_AMOUNT = (salary_amount * 1.07)WHERE SALARY_END IS NULLAND EMPLOYEE_ID = :mgrid;-- The ELSE clause executes if the :state_code is neither NH or MA.ELSE UPDATE SALARY_HISTORY SSET SALARY_AMOUNT = (salary_amount * 1.06)WHERE SALARY_END IS NULLAND EMPLOYEE_ID = :mgrid;END CASE;END IF;END;CASE ELSE WHEN SQL 12.3.4 LOOP LOOP WHILE TRUE LEAVE 1 SQL LOOP 1 EMPLOYEE_ID SUPERVISOR_ID -- This procedure begins with the employee with EMPLOYEE_ID 00180 and-- finds his supervisor, tracing the hierarchy of the company.BEGINDECLARE :emp_id CHAR(5);DECLARE :sup_id CHAR(5);DECLARE :id CHAR(5);SET :emp_id = '00180';-- Initialize :id and :sup_id to be different values, so that the LOOP-- will execute at least once.SQL 12-9


12.3 SET :id = '00000';SET :sup_id = '00001';WHILE :id :sup_idLOOPSELECT EMPLOYEE_ID, SUPERVISOR_ID INTO :id, :sup_idFROM JOB_HISTORYWHERE EMPLOYEE_ID = :emp_idAND JOB_END is NULL;SET :emp_id = :sup_id;END LOOP;END;12.3.5 FOR FOR SELECT SQL FOR FOR END-OF- STREAM FOR AS EACH ROW OF SELECT FOR SQL AS EACH ROW OF FOR SQL :jobrec MINIMUM_SALARY MAXIMUM_SALARY -- The :jobrec variable represents a record that holds columns from the-- selected row.FOR :jobrecAS EACH ROW OF TABLE CURSOR JOB_CURSOR FOR-- The select expression specifies that only two columns be stored in the-- record :jobrec.SELECT MINIMUM_SALARY, MAXIMUM_SALARY FROM JOBSWHERE MINIMUM_SALARY < 20000IF :jobrec.MINIMUM_SALARY > :jobrec.MAXIMUM_SALARYFOR 1 FOR $200000.00 IF BEGIN-- The :jobrec variable represents a record that holds columns from the-- selected row.12-10 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


12.3 FOR :jobrecAS EACH ROW OF TABLE CURSOR JOB_CURSOR FOR-- The select expression.SELECT MINIMUM_SALARY, MAXIMUM_SALARY FROM JOBSWHERE MINIMUM_SALARY < 20000DO-- Update the current row in the JOB_CURSOR.UPDATE JOBS-- No need to qualify the column names.SET MINIMUM_SALARY = MINIMUM_SALARY * 1.10WHERE CURRENT OF JOB_CURSOR;-- If the minimum salary is now greater than the maximum salary, increase the-- maximum salary.IF :jobrec.MINIMUM_SALARY > :jobrec.MAXIMUM_SALARYTHENUPDATE JOBSSET MAXIMUM_SALARY = MAXIMUM_SALARY * 1.10WHERE CURRENT OF JOB_CURSOR;END IF;END FOR;END; UPDATE WHERE CURRENT OF FOR IF SQL :ID ID :RESULT PROCEDURE max_raise (SQLCODE,:ID CHAR(5),:RESULT REAL);BEGINDECLARE :last_salary INTEGER(2) DEFAULT 0;DECLARE :pct_raise INTEGER(2) DEFAULT 0;SET :RESULT =0;FOR :salhist_recAS EACH ROW OFSELECT SALARY_AMOUNT FROM SALARY_HISTORYWHERE EMPLOYEE_ID = :IDORDER BY SALARY_START ASCDOIF :last_salary 0THENSET :pct_raise = (:salhist_rec.salary_amount - :last_salary)SQL 12-11


12.3 / :last_salary;END IF;IF :pct_raise > :RESULTTHENSET :RESULT = :pct_raise;END IF;SET :last_salary = :salhist_rec.salary_amount;END FOR;END;SQL 4.4 4-1512.3.6 FOR LOOP FOR LOOP LEAVE 12.3.7 12-13 SQL UPD_MGRID UPD_MGRID: -- Beginning label for compound statementBEGINDECLARE :mgrid CHAR(5);SET :MGRID = '00167';UPDATE DEPARTMENTSSET MANAGER_ID = :mgridWHERE DEPARTMENT_CODE = 'SALE';ENDUPD_MGRID -- Ending label for compound statement; -- Ending semicolon for compound statement:■BEGIN END ■■ SQL SQL SQL SQL SQL 12-12 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


12.3 ■■LOOP WHILE END LOOP FOR FOR END FOR 12.3.7 LEAVE LEAVE LEAVE ■■■■FOR LOOP SQL LEAVE loop1 LOOP LEAVE loop1;SQL LEAVE JOB_CODE 'DMGR' LEAVE FOR BEGINDECLARE :supnum INTEGER;DECLARE :bothnum INTEGER;SET :supnum = 0;SET :bothnum = 0;-- Count the number of employees who have been supervisors.jobloop:FOR :job_recAS EACH ROW OFSELECT DISTINCT(EMPLOYEE_ID) FROM JOB_HISTORYWHERE JOB_CODE = 'DSUP'DOSET :supnum = :supnum + 1;-- Count the number of employees who have been managers, as well as-- supervisors.SQL 12-13


12.3 innerjobloop:FOR :innerjob_recAS EACH ROW OFSELECT EMPLOYEE_ID, JOB_CODE FROM JOB_HISTORYWHERE EMPLOYEE_ID = :job_rec.employee_idDOIF :innerjob_rec.JOB_CODE = 'DMGR'THENSET :bothnum = :bothnum + 1;-- Exit from the inner FOR loop.LEAVE innerjobloop;END IF;END FOR innerjobloop;END FOR jobloop;END;FOR LOOP LEAVE innerjobloop LEAVE jobloop SQL FOR FOR 12.3.8 CALL CALL IN CALL dbkey CALL CALL -- Create the module that contains the stored procedure.CREATE MODULE DEPT_BUDG_MODLANGUAGE SQLPROCEDURE DEPT_BUDG_PROC ( IN :incr INTEGER (2), INOUT :new_budg INTEGER,INOUT :cur_budg INTEGER );BEGINSELECT BUDGET_PROJECTED INTO :cur_budgFROM DEPARTMENTSWHERE DEPARTMENT_NAME = 'Engineering';SET :new_budg = :cur_budg + (:cur_budg * :incr);UPDATE DEPARTMENTSSET BUDGET_PROJECTED = :new_budgWHERE DEPARTMENT_NAME = 'Engineering';END;END MODULE;12-14 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


12.4 -- Call the DEPT_BUDG_PROC stored procedure.BEGINDECLARE :cur_budg_var INTEGER;DECLARE :new_budg_var INTEGER;DECLARE :incr_var INTEGER (2) DEFAULT .08;CALL DEPT_BUDG_PROC ( :incr_var, :new_budg_var, :cur_budg_var);END; CALL CALL 12.4 SQL SQL SQL SQL BEGIN ATOMIC NOT ATOMIC SQL> BEGIN ATOMIC1> UPDATE DEPARTMENTS2> SET MANAGER_ID = '00167'3> WHERE DEPARTMENT_CODE = 'SALE';4> UPDATE JOB_HISTORY5> SET JOB_END = CURRENT_TIMESTAMP6> WHERE EMPLOYEE_ID = '00167' AND JOB_END IS NULL;7> INSERT INTO JOB_HISTORY8> (EMPLOYEE_ID, DEPARTMENT_CODE, JOB_CODE, JOB_START)9> VALUES10> ('00167', 'SALE', 'DMGR', CURRENT_TIMESTAMP);11> END;SQL>ATOMIC ATOMIC NOT ATOMIC SQL ATOMIC NOT ATOMICSQL 12-15


12.4 ■■ATOMIC SQL 1 SQL SQL 1 SQL SQL NOT ATOMIC SQL NOTATOMIC SQLSQL NOT ATOMIC 1 INSERT INTO JOB_HISTORY SQL SQL BEGIN NOT ATOMICBEGIN ATOMICUPDATE DEPARTMENTS ... (4)12-16UPDATE JOB_HISTORY ... (4)12-16END;BEGIN ATOMICINSERT INTO DEPARTMENTS ... (2)12-16INSERT INTO JOB_HISTORY ... (1)12-16(2)12-16INSERT INTO SALARY_HISTORY ... (3)12-16END;END;SQL SQL (1) INSERT INTO JOB_HISTORY (2) ATOMIC SQL ■■INSERT INTO DEPARTMENTSINSERT INTO JOB_HISTORY(3) INSERT INTO JOB_HISTORY SQL INSERT INTO SALARY_HISTORY (4) NOT ATOMIC SQL UPDATE 12-16 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


12.5 ATOMIC NOT ATOMIC SQL ATOMIC SET TRANSACTIONCOMMITROLLBACK 12.5 SET TRANSACTIONCOMMITROLLBACK NOT ATOMIC ATOMIC <strong>Oracle</strong> Rdb SET TRANSACTIONCOMMITROLLBACK ■■■■1 1 SQL 1 SQL 1 0 / PROCEDURE update_or_select(SQLSTATE,:upd_sel,:mgrid);BEGINIF :upd_sel = 0THENSET TRANSACTION READ WRITE;UPDATE DEPARTMENTSSET MANAGER_ID = :mgridWHERE DEPARTMENT_CODE = 'SALE';ELSESET TRANSACTION READ ONLY;SELECT MANAGER_ID INTO :mgridFROM DEPARTMENTSWHERE DEPARTMENT_CODE = 'SALE';SQL 12-17


12.6 END IF;END;1 DECLARE TRANSACTION SQL GET DIAGNOSTICS GET DIAGNOSTICS 12.8 12-21 16 16-112.6 SQL SQL SQL ■ PREPARE■■■DESCRIBEEXECUTEEXECUTE IMMEDIATE :STMT :DYN_STMT_ID PROCEDURE prepare_stmt(SQLSTATE,:DYN_STMT_ID INTEGER,:STMT CHAR(16000));PREPARE :DYN_STMT_ID FROM :STMT;12.7 <strong>Oracle</strong> Rdb TRACE SET FLAGS 'TRACE' 12-18 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


12.7 RDMS$DEBUG_FLAGS RDB_DEBUG_FLAGS "Xt" X t 2 $ DEFINE RDMS$DEBUG_FLAGS "Xt" RDMS$DEBUG_FLAGS_OUTPUT RDB_DEBUG_FLAGS_OUTPUT TRACE SET FLAGS 'TRACE' RDMS$DEBUG_FLAGS RDB_DEBUG_FLAGS SET FLAGS'TRACE' TRACE SET FLAGS TRACE TRACE -- Enable trace logging.SET FLAGS 'TRACE';BEGINDECLARE :state_code CHAR(2);DECLARE :mgrid CHAR(5);DECLARE :cur_mgrid CHAR(5);SET :mgrid = '00167';-- Trace a built-in function.TRACE 'Trace the current time ', CURRENT_TIMESTAMP;SELECT D.MANAGER_ID, E.STATE INTO :cur_mgrid, :state_codeFROM DEPARTMENTS D, EMPLOYEES EWHERE DEPARTMENT_CODE = 'SALE'AND D.MANAGER_ID = E.EMPLOYEE_ID;-- Trace variables.TRACE 'After SELECT mgrid is ', :mgrid;TRACE 'After SELECT cur_mgrid is ', :cur_mgrid;IF :cur_mgrid :mgridTHENUPDATE DEPARTMENTSSET MANAGER_ID = :mgridWHERE DEPARTMENT_CODE = 'SALE';-- Trace variables.TRACE 'After UPDATE mgrid is ', :mgrid;IF :state_code = 'NH'THEN-- Trace a literal.TRACE 'Entering IF loop.';UPDATE SALARY_HISTORY SSET SALARY_AMOUNT = (salary_amount * 1.05)SQL 12-19


12.7 WHERE SALARY_END IS NULLAND EMPLOYEE_ID = :mgrid;END IF;END IF;END;~Xt: Trace the current time 1994-02-16:12:32:20.46~Xt: After SELECT mgrid is 00167~Xt: After SELECT cur_mgrid is 00205~Xt: After UPDATE mgrid is 00167~Xt: Entering IF loop. "~Xt:" SET FLAGS 'NOPREFIX' SQL FOR -- Enable trace logging and turn off display of the prefix. You can combine-- the TRACE and NOPREFIX keywords in the same statement.SET FLAGS 'TRACE, NOPREFIX';BEGINDECLARE :supnum INTEGER;SET :supnum = 0;FOR :job_recAS EACH ROW OFSELECT EMPLOYEE_ID, JOB_CODE FROM JOB_HISTORYDO-- Trace the values of the columns JOB_CODE and EMPLOYEE_ID.TRACE 'Job code: ', :job_rec.job_code;TRACE 'Employee_id: ', :job_rec.employee_id;IF :job_rec.JOB_CODE = 'DSUP'THENSET :supnum = :supnum + 1;END IF;END FOR;END;Job code: SPGMEmployee_id: 00164Job code: DMGREmployee_id: 00164...TRACE 12-20 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


12.8 12.8 SQL GET DIAGNOSTICS GET DIAGNOSTICS SQL GET DIAGNOSTICS <strong>Oracle</strong> Rdb ■GET DIAGNOSTICS INSERTUPDATEDELETE FOR ■■■GET DIAGNOSTICS GET DIAGNOSTICS GET DIAGNOSTICS 12.9 12-22 SQLSTATE SQLCODE GET DIAGNOSTICS GET DIAGNOSTICS FOR SET FLAGS 'TRACE, NOPREFIX';BEGIN-- Declare a variable to hold the number of the current row.DECLARE :currow INTEGER;-- The :jobrec variable represents a record that holds columns from the-- selected row.FOR :jobrecAS EACH ROW OF TABLE CURSOR JOB_CURSOR FORSELECT MINIMUM_SALARY FROM JOBSWHERE MINIMUM_SALARY < 20000DO-- Update the current row in the JOB_CURSOR.UPDATE JOBSSET MINIMUM_SALARY = MINIMUM_SALARY * 1.10WHERE CURRENT OF JOB_CURSOR;-- Use the GET DIAGNOSTICS statement to retrieve the number of rows that have-- been fetched by the FOR statement.GET DIAGNOSTICS:currow = CURRENT_ROW;-- Use the TRACE statement to print out the number of the current row.SQL 12-21


12.9 TRACE 'Current Row: ', :currow;END FOR;END;Current Row: 1Current Row: 2Current Row: 3Current Row: 4Current Row: 5Current Row: 6TRACE GET DIAGNOSTICS <strong>Oracle</strong> <strong>Rdb7</strong> SQL Reference Manual12.9 SQL SQL ■■SQL SQL SIGNAL SQL SQL SQL GET DIAGNOSTICS SQL 12.9.1 SQL SIGNAL SIGNAL <strong>Oracle</strong> Rdb SQLSTATE <strong>Oracle</strong> Rdb SIGNAL <strong>Oracle</strong> Rdb SQLSTATE ANSI/ISO SQL SQLSTATE A Z0 9SIGNAL '22003';<strong>Oracle</strong> Rdb SQLSTATE 22003 SQLSTATE SQLCODE SQLSTATE 12-22 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


12.9 SQLCODE -304 SQLSTATE SQLCODE SQLSTATE <strong>Oracle</strong> Rdb SQLCODE -1042 0 SIGNAL -- Calculate the difference between two job titles and put the results in the-- table PAY_ADJUST.BEGINDECLARE :job_code1, :job_code2 CHAR (5);DECLARE :min_sal, :min_sal2 INTEGER;DECLARE :diff INTEGER;-- In a stored procedure, you pass the values using parameters,-- rather than hard coding values.SET :job_code1 = 'PRGM';SET :job_code2 = 'MENG';SELECT MINIMUM_SALARY INTO :min_sal FROM JOBSWHERE JOB_CODE = :job_code1;SELECT MINIMUM_SALARY INTO :min_sal2 FROM JOBSWHERE JOB_CODE = :job_code2;IF :min_sal - :min_sal2 = 0-- If condition is not trapped, it results in division by 0 in ELSE-- clause.THEN SIGNAL '22012';-- Calculate the difference in minimum salaries and store the percentage-- in the PAY_ADJUST table.ELSE SET :diff = :min_sal - :min_sal2;INSERT INTO PAY_ADJUST(JOB_CODE1, JOB_CODE2, DIFF)VALUES (:job_code1, :job_code2, :min_sal / :diff);END IF;END;%RDB-E-SIGNAL_SQLSTATE, routine "(unnamed)" signaled SQLSTATE "22012"<strong>Oracle</strong> Rdb SQLSTATE 22012 0 SIGNAL <strong>Oracle</strong> <strong>Rdb7</strong> SQL Reference Manual12.9.2 GET DIAGNOSTICS SQL GETDIAGNOSTICS SQLSTATE SQLCODE SQL 12-23


12.9 SQLSTATE EXCEPTION...RETURNED_SQLSTATE SQLCODE EXCEPTION...RETURNED_SQLCODE EXCEPTION...RETURNED_SQLSTATE SQLSTATE SET FLAGS 'TRACE, NOPREFIX';BEGIN ATOMICDECLARE :mgrid CHAR(5);DECLARE :cur_mgrid CHAR(5);DECLARE :dept_code CHAR(4);DECLARE :sqlstate_var CHAR(5);SET :mgrid = '00166';SET :dept_code = 'SALE';SELECT MANAGER_ID INTO :cur_mgrid FROM DEPARTMENTSWHERE DEPARTMENT_CODE = :dept_code;-- The GET DIAGNOSTICS statement returns an SQLSTATE code of 00000 because the-- SELECT statement executes successfully.GET DIAGNOSTICSEXCEPTION 1 :sqlstate_var = RETURNED_SQLSTATE;TRACE 'After SELECT, SQLSTATE is: ', :sqlstate_var;-- Test the value of SQLSTATE and take some action if it is 00000.IF :sqlstate_var = '00000'THENIF :cur_mgrid :mgridTHENUPDATE DEPARTMENTSSET MANAGER_ID = :mgridWHERE DEPARTMENT_CODE = 'Ssss';-- Because there is no department with a DEPARTMENT_CODE 'Ssss', the-- GET DIAGNOSTICS statement returns an SQLSTATE code of 02000.GET DIAGNOSTICSEXCEPTION 1 :sqlstate_var = RETURNED_SQLSTATE;TRACE 'After UPDATE, SQLSTATE is: ', :sqlstate_var;END IF;END IF;END;After SELECT, SQLSTATE is: 00000After UPDATE, SQLSTATE is: 02000GET DIAGNOSTICS SQLSTATE <strong>Oracle</strong> <strong>Rdb7</strong> SQL Reference Manual12-24 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


13<strong>Oracle</strong> Rdb ■■■■■■■■■ 13-1


13.1 13.1 1 SQL <strong>Oracle</strong> Rdb 1 SQL <strong>Oracle</strong> Rdb RETURN 1 SQL 1 3GL C Fortran 3GL SQL <strong>Oracle</strong> Rdb <strong>Oracle</strong> Rdb SQL SQL 1 1 <strong>Oracle</strong> Rdb 3 3-1 4 4-113.2 ■13-2 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


13.3 ADD EMPLOYEE 1 SQL ■■■ EXECUTE / SQL <strong>Oracle</strong> Rdb <strong>Oracle</strong> Rdb 13.3 CREATE MODULE <strong>Oracle</strong> Rdb CREATE TABLE CREATE MODULE SQL 1 <strong>Oracle</strong> Rdb SQL 13-113-4 DATA_UPDATE 13-3


13.3 13-1 CREATE MODULE DATA_UPDATE (1)13-4LANGUAGE SQL (2)13-4AUTHORIZATION LAWLER (3)13-4DECLARE LOCAL TEMPORARY TABLE MODULE.DATA_UPDATE_TAB(EMPLOYEE_ID ID_DOM,SALARY INTEGER(2)) (4)13-4 (5)13-5END MODULE; (6)13-5 13-113-4(1) CREATE MODULE module-nameCREATE MODULE <strong>Oracle</strong> Rdb DATA_UPDATE (2) LANGUAGE SQL LANGUAGE SQL SQL LANGUAGE (3) AUTHORIZATION AUTHORIZATION LAWLER AUTHORIZATION <strong>Oracle</strong> Rdb AUTHORIZATION EXECUTE AUTHORIZATION EXECUTE (4) 13-4 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


13.3 <strong>Oracle</strong> <strong>Rdb7</strong> Guide to Database Design and Definition(5) 1 13.3.1 13-513.3.2 13-7(6) END MODULEEND MODULE 13.3.1 CREATE MODULE 13-213-5DATA_UPDATE NEW_SALARY_PROC 13-2 CREATE MODULE DATA_UPDATELANGUAGE SQLAUTHORIZATION LAWLERDECLARE LOCAL TEMPORARY TABLE MODULE.DATA_UPDATE_TAB(EMPLOYEE_ID ID_DOM,SALARY INTEGER(2))PROCEDURE NEW_SALARY_PROC (1)(:ID CHAR (5), (2):NEW_SALARY INTEGER (2)); (2)BEGIN (3)UPDATE SALARY_HISTORY (3)SET SALARY_END = CURRENT_TIMESTAMPWHERE EMPLOYEE_ID = :ID AND SALARY_END IS NULL;INSERT INTO SALARY_HISTORY (EMPLOYEE_ID, SALARY_AMOUNT,SALARY_START, SALARY_END)VALUES (:ID, :NEW_SALARY, CURRENT_TIMESTAMP, NULL);INSERT INTO MODULE.DATA_UPDATE_TAB(EMPLOYEE_ID, SALARY)SELECT EMPLOYEE_ID, SALARY_AMOUNT FROM SALARY_HISTORYWHERE CAST(SALARY_START AS DATE ANSI) =CURRENT_DATE;END; (3) 13-5


13.3 END MODULE; 13-213-5(1) PROCEDURE PROCEDURE <strong>Oracle</strong> Rdb (2) SQL ■■■INOUTINOUT 3 13-213-5SQL " SQL IN OUT INOUT " LIST OF BYTE VARYING :ID CHAR (5) :ID ID_DOM ■■SQLCODESQLSTATESQLCAGET DIAGNOSTIC SQLCODE SQLSTATE 12.9 12-22GET DIAGNOSTIC SQLCODE SQLSTATE SIGNAL 13-413-10 NULL NULL 13-6 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


13.3 NULL NULL (3) BEGIN...END 1 1 BEGIN...END 13.4 13-10CREATE MODULE <strong>Oracle</strong> <strong>Rdb7</strong> SQL Reference Manual13.3.2 CREATE MODULE 13-313-7CHECK_SALARY_MOD CHECK_SALARY_RANGE_FUNC 13-3 CREATE MODULE CHECK_SALARY_MODLANGUAGE SQLFUNCTION CHECK_SALARY_RANGE_FUNC (1)(:JOB_TITLE CHAR(20), :CUR_SALARY INTEGER(2)) (2)RETURNS INTEGER; (3)BEGIN (4)DECLARE :min_sal, :max_sal INTEGER(2);DECLARE :sal_check INTEGER;SELECT MINIMUM_SALARY, MAXIMUM_SALARY INTO :min_sal, :max_salFROM JOBSWHERE JOB_TITLE = :job_title;RETURN (CASE (5)WHEN(:cur_salary >= :min_sal AND :cur_salary


13.3 (1) FUNCTION FUNCTION <strong>Oracle</strong> Rdb (2) SQL ■■■IN LIST OF BYTE VARYING :JOB_TITLE CHAR(20) :JOB_TITLE JOB_TITLE_DOM ■■SQLCODESQLSTATESQLCA GET DIAGNOSTIC SQLCODE SQLSTATE 12.9 12-22GET DIAGNOSTIC SQLCODE SQLSTATE SIGNAL NULL NULL NULL NULL (3) RETURNS RETURNS (4) BEGIN...END BEGIN...END 1 1 13-8 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


13.3 RETURN (5) RETURN RETURN RETURN RETURNS SET TRANSACTION COMMIT ROLLBACK 13.5 13-12CREATE MODULE <strong>Oracle</strong> <strong>Rdb7</strong> SQL Reference Manual 13.3.3 1 AFTER INSERT NEXT_KEY_TABLE 1 NEXT_KEY_TABLE SQL> CREATE DOMAIN KEY_NAME1> CHAR(31)2> CHECK (VALUE IS NOT NULL)3> NOT DEFERRABLE;SQL> --SQL> CREATE TABLE NEXT_KEY_TABLE1> ( NEXT_KEY_VAL INTEGER NOT NULL NOT DEFERRABLE,2> NEXT_KEY_NAME KEY_NAME UNIQUE NOT DEFERRABLE);SQL> --SQL> INSERT INTO next_key_table (next_key_name, next_key_val)1> VALUES ('EMPLOYEE_ID', 0);1 row inserted 13-9


13.4 SQL> CREATE MODULE TOOLS1> LANGUAGE SQL2> FUNCTION NEXT_KEY (IN :KEY_NAME KEY_NAME)3> RETURNS INTEGER;4> BEGIN5> DECLARE :rc, :new_val INTEGER DEFAULT 0;6> DECLARE :key_name_upper key_name DEFAULT UPPER(:KEY_NAME);7> DECLARE :invalid_parameter CONSTANT CHAR(5) = '22023';8>9> UPDATE NEXT_KEY_TABLE10> SET NEXT_KEY_VAL = NEXT_KEY_VAL + 111> WHERE NEXT_KEY_NAME = :key_name_upper12> RETURNING NEXT_KEY_VAL INTO :NEW_VAL;13>14> GET DIAGNOSTICS :rc = ROW_COUNT;15> TRACE 'NEXT_KEY is ', COALESCE(:new_val, 'NULL'), ', RC is ', ;rc;16>17> IF :rc = 0 THEN18> TRACE 'No entry exists for KEY_NAME: ', :key_name_upper;19> SIGNAL :invalid_parameter;20> ELSE21> TRACE 'Returning new value for ', :key_name_upper,:new_val;22> RETURN :new_val;23> END IF;24> END;25> END MODULE;INSERT VALUES SQL> INSERT INTO employee (employee_id, last_name, birthday)1> VALUES (next_key('EMPLOYEE_ID'), 'Smith', DATE'1970-1-1');13.4 CALL 13-413-10 CALL_NEW_SALARY SQL 13-213-5 13-4 PROCEDURE CALL_NEW_SALARY(:ID CHAR(5), (1)13-413-10 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


13.4 :ID_IND SMALLINT, (2)13-4:NEW_SALARY INTEGER (2), (1)13-4:NEW_SALARY_IND SMALLINT, (2)13-4SQLCODE); (3)13-4CALL NEW_SALARY_PROC (4)13-4(:ID INDICATOR :ID_IND, :NEW_SALARY INDICATOR :NEW_SALARY_IND); (5)13-5 13-413-10(1) CALL_NEW_SALARY :ID :NEW_SALARY(2) :ID_IND :NEW_SALARY_IND NULL NULL SQL NULL (3) (4) CALL 13-213-5 NEW_SALARY_PROC CALL(5) CALL :ID :NEW_SALARY CALL 2 NEW_SALARY_PROC CALL CALL dbkey CALL <strong>Oracle</strong> <strong>Rdb7</strong> SQL Reference Manual 13-11


13.5 13.5 SQL 13-513-12IF 13-313-7IF CHECK_SALARY_RANGE 2 :salrec.JOB :salrec.SALARY 1 IF SALARY_ADJUST 13-5 BEGINDECLARE :lname char(14);FOR :salrecAS EACH ROW OF TABLE CURSOR SAL_CURSOR FORSELECT LAST_NAME, JOB, SALARY FROM CURRENT_INFODOSET :lname = :salrec.LAST_NAME;-- Call the stored function.IF CHECK_SALARY_RANGE(:salrec.JOB, :salrec.SALARY) = 1THENINSERT INTO SALARY_ADJUST VALUES (:lname);END IF;END FOR;END;13.6 DROP MODULE <strong>Oracle</strong> Rdb DROP 13-613-12DATA_UPDATE 13-6 DROP MODULE DATA_UPDATE;DROP PROCEDURE DROP PROCEDURE NEW_SALARY_PROC;DROP FUNCTION DROP FUNCTION NEW_FUNC;13-12 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


13.7 RESTRICT CASCADE <strong>Oracle</strong> Rdb DROP<strong>Oracle</strong> <strong>Rdb7</strong> Guide to Database Design andDefinitionDROP MODULE DROP PROCEDURE DROPFUNCTION <strong>Oracle</strong> <strong>Rdb7</strong> SQL Reference Manual13.7 <strong>Oracle</strong> Rdb <strong>Oracle</strong> Rdb <strong>Oracle</strong> Rdb CREATE MODULE <strong>Oracle</strong> Rdb 1 <strong>Oracle</strong> Rdb RDB$INTERRELATIONS <strong>Oracle</strong> Rdb 13-113-13 13-1 RDB$INTERRELATIONS 1 2 P/FP/F DE 13-13


13.7 13-1 RDB$INTERRELATIONS 1 2 DR DRP/FP/FP/FP/FP/FP/FLSP/FLS■■■■DE - DR - LS - P/F - <strong>Oracle</strong> Rdb RDB$INTERRELATIONS <strong>Oracle</strong> Rdb RDB$INTERRELATIONS RDB$PARAMETERS RDB$INTERRELATIONS <strong>Oracle</strong> Rdb 13-14 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


13.7 4 13.7.1 CANDIDATES LAST_NAMEFIRST_NAMEMIDDLE_INITIALCANDIDATE_STATUSPROCEDURE SIMPLE_PBEGININSERT INTO CANDIDATES(LAST_NAME,FIRST_NAME,MIDDLE_INITIAL, CANDIDATE_STATUS)VALUES('test_lname','test_fname','t','test_status');END; 13-713-15 RDB$INTERRELATIONS INSERT CANDIDATES 5 <strong>Oracle</strong> Rdb 13-7 SQL> SELECT * FROM RDB$INTERRELATIONS WHERE RDB$OBJECT_NAME = 'CANDIDATES';RDB$OBJECT_NAMERDB$SUBOBJECT_NAMERDB$ENTITY_NAME1RDB$ENTITY_NAME2RDB$USAGERDB$FLAGSRDB$CONSTRAINT_NAMERDB$SECURITY_CLASSCANDIDATES (1)DEPENDENCY_LIST (3) SIMPLE_P (4)Procedure (5) 5NULLCANDIDATES (1) LAST_NAME (2)DEPENDENCY_LIST (3) SIMPLE_P (4)Procedure (5) 5NULLCANDIDATES (1) FIRST_NAME (2)DEPENDENCY_LIST (3) SIMPLE_P (4)Procedure (5) 5NULLCANDIDATES (1) MIDDLE_INITIAL (2)DEPENDENCY_LIST (3) SIMPLE_P (4) 13-15


13.7 Procedure (5) 5NULLCANDIDATES (1) CANDIDATE_STATUS (2)DEPENDENCY_LIST (3) SIMPLE_P (4)Procedure (5) 5NULL 13-713-15(1) (2) (3) 1(4) 2(5) CANDIDATES 13.7.2 SELECT * INSERT CANDIDATES <strong>Oracle</strong> Rdb PROCEDURE LANG_SEMANTICS_PBEGININSERT INTO CANDIDATES VALUES('test_lname','test_fname','t','test_status');END;INSERT SQL <strong>Oracle</strong> Rdb CANDIDATES LANG_SEMANTICS_P DELETE LANG_SEMANTICS_P CANDIDATES CANDIDATES CASCADE 13-16 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


13.7 13.9.2 13-2213.7.3 <strong>Oracle</strong> Rdb 2 ■■DECLARE TRANSACTION RESERVING SET TRANSACTION RESERVINGDECLARE TRANSACTION EVALUATING SET TRANSACTIONEVALUATING <strong>Oracle</strong> Rdb JOBS JOB_CODE_REQUIRED CREATE MODULE DEPENDENCY_LIST LANGUAGE SQL-- Create default reserving and default evaluating dependencies.DECLARE TRANSACTION READ WRITERESERVING JOBSFOR SHARED READ EVALUATING JOB_CODE_REQUIRED AT VERB TIME 13-813-17 RDB$INTERRELATIONS JOBS DECLARE TRANSACTION JOB_CODE_REQUIRED 13-8 SQL> SELECT * FROM RDB$INTERRELATIONS WHERE RDB$OBJECT_NAME = 'JOBS';...DEPENDENCY_LIST (2)Default Txn Evaluating (3) 1JOB_CODE_REQUIRED (4)NULLJOBS (1)DEPENDENCY_LIST (2)Default Txn Reserving (3) 1NULL 13-813-17(1) (2) 1 13-17


13.8 (3) (4) 13-813-17<strong>Oracle</strong> Rdb DECLARE TRANSACTION CASCADE DECLARETRANSACTION <strong>Oracle</strong> Rdb <strong>Oracle</strong> Rdb 13.8 1 <strong>Oracle</strong> Rdb : <strong>Oracle</strong>_Rdb <strong>Oracle</strong> Rdb <strong>Oracle</strong> Rdb RDB$ROUTINES RDB$INTERRELATIONS 13-213-18 13-2 SQL ALTER TABLE DROPCOLUMNALTER TABLE ADDCOLUMN PF LSLS13-18 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


13.8 13-2 SQL ALTER TABLE ADDCOLUMNALTER TABLE DROPCONSTRAINTALTER TABLE ADDCONSTRAINTALTER DOMAINALTER DOMAINDROP DOMAINDROP FUNCTIONCASCADEDROP FUNCTIONRESTRICT P/F P/F P/F DE *1 P/F *2 P/F*1 <strong>Oracle</strong> Rdb RDB$INTERRELATIONSRDB$PARAMETERS *2<strong>Oracle</strong> Rdb RDB$INTERRELATIONS P/F P/F DROP MODULE CASCADE P/FDROP MODULE RESTRICT P/FDROP PROCEDURECASCADEDROP PROCEDURERESTRICTP/F P/F DROP TABLE CASCADE PF LSDROP TABLE RESTRICT P/FLS DR DROP VIEW CASCADE PF LSDROP VIEW RESTRICT P/FLS DR 13-19


13.9 ■■■■DE--- DR--- LS--- P/F--- RESTRICT DROP DROP SQL SHOW PROCEDURE SHOW FUNCTION P1 <strong>Oracle</strong> Rdb P1 SQL> SHOW PROCEDURE P1Procedure name is: P1Status is INVALIDCan be revalidated<strong>Oracle</strong> Rdb 13.9.1 13-21"Status is INVALID" 13.9 ■■■■13.9.1 13-21■13.9.2 13-2213-20 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


13.9 13.9.1 13-913-21 NEW_SALARY_PROC SALARY_HISTORY 13-9 CREATE MODULE NEW_SALARY_PROC LANGUAGE SQLPROCEDURE NEW_SALARY_PROC(:ID CHAR(5),:NEW_SALARY INTEGER(2));BEGINUPDATE SALARY_HISTORYSET SALARY_END = CURRENT_TIMESTAMPWHERE EMPLOYEE_ID = :ID;INSERT INTO SALARY_HISTORY (EMPLOYEE_ID, SALARY_AMOUNT,SALARY_START, SALARY_END)VALUES(:ID, :NEW_SALARY, CURRENT_TIMESTAMP, NULL);END;END MODULE;CASCADE SALARY_HISTORY <strong>Oracle</strong> Rdb NEW_SALARY_PROC <strong>Oracle</strong> Rdb SALARY_HISTORY (1) NEW_SALARY_PROC SALARY_HISTORY (2) RDMS$VALIDATE_ROUTINE RDB_VALIDATE_ROUTINE 1 / <strong>Oracle</strong> Rdb (3) SQL SQL SQL SET NOEXECUTE (4) / 13-21


13.9 (5) SQL SQL> SET NOEXECUTE(6) NEW_SALARY_PROC SQL> CALL NEW_SALARY_PROC('00196', 2);SET NOEXECUTE (7) SET EXECUTE (8) COMMIT 13.9.2 13.9.1 13-211. RMU Extract Item=Module Output 1 RMU Extract <strong>Oracle</strong> RMU Reference Manual2. DROP MODULE 3. 4. CREATE MODULE 1 CREATE MODULE <strong>Oracle</strong> Rdb <strong>Oracle</strong>Rdb <strong>Oracle</strong> Rdb <strong>Oracle</strong> Rdb 13-22 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


13.9 13-23


13.9 13-24 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


143GL ■■■■■■■■■■■■■■■■■ OpenVMS Compaq Tru64 UNIX SQL 14-1


14.1 14.1 3GL SQL SQL ■■3GL C COBOL SQL INSERT OpenVMS Runtime LibraryRTL MTH$SQRT SQUARE_ROOTSINSERT INTO SQUARE_ROOTS VALUES (P_NUM, SQRT(CAST(P_NUM AS REAL))); 1 SQL SQL SQL <strong>Oracle</strong> Rdb SQL CREATE FUNCTION SQL CALL 3GL C COBOL SQL <strong>Oracle</strong>Rdb CALL ADD_SOUNDEX_NAME CALL ADD_SOUNDEX_NAME (:error);SQL CREATE PROCEDUREBarnsBarnesBarnse SOUNDEX SELECT LAST_NAME, SOUNDEX(LAST_NAME) FROM EMPLOYEES;14-2 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


14.2 14.2 <strong>Oracle</strong> Rdb 1. 3GL 2. <strong>Oracle</strong> Rdb <strong>Oracle</strong> Rdb SQL SQL <strong>Oracle</strong> Rdb SQL SQL C ompa q Tru64 UNIX3. OpenVMS Compaq Tru64 UNIX 4. 5. CREATE FUNCTION CREATE PROCEDURE <strong>Oracle</strong> Rdb 6. SQL SQL SQL CALL 14.8 14-30 14-3


14.3 14.3 SQL <strong>Oracle</strong> Rdb <strong>Oracle</strong> Rdb14.3.1 14-414.3.2 14-614.3.1 <strong>Oracle</strong>Rdb 14-114-4CREATE FUNCTION 14-1 CREATE FUNCTION -- SQRT external function.CREATE FUNCTION SQRT (1)14-4(IN :PARAM1 REAL) (2)14-4RETURNS REAL; (3)14-5EXTERNAL NAME MTH$SQRT (4)14-5LOCATION 'SYS$SHARE:MTHRTL.EXE' (5)14-5LANGUAGE GENERAL (6)14-5GENERAL PARAMETER STYLE (7)14-5NOT VARIANT (8)14-5COMMENT IS 'Square Root of an F-floating value'; (9)14-6 14-114-4(1) CREATE FUNCTION SQRT<strong>Oracle</strong> Rdb (2) IN :PARAM1 REAL IN SQL REAL:IN SQL LIST OF BYTE VARYING 14-4 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


14.3 SQLREFERENCE 14.11 14-36 14.12 14-38(3) RETURNS REAL SQL SQL LIST OF BYTE VARYING SQL VALUE REFERENCE 14.11 14-36 14.12 14-38(4) EXTERNAL NAME MTH$SQRTC ompa q Tru64 UNIX(5) LOCATION 'SYS$SHARE:MTHRTL.EXE'OpenVMS Compaq Tru64 UNIX DEFAULT LOCATION SQL RDB$ROUTINES (6) LANGUAGE GENERALADACCOBOLFORTRANPASCALGENERAL GENERAL <strong>Oracle</strong> Rdb SQL (7) GENERAL PARAMETER STYLE SQL OpenVMS GENERAL <strong>Oracle</strong> Rdb SQL (8) NOT VARIANT1 NOTVARIANT 1 1 1 14-5


14.3 1 <strong>Oracle</strong> Rdb VARIANT (9) COMMENT IS 'Square Root of an F-floating value'CREATE FUNCTION <strong>Oracle</strong> <strong>Rdb7</strong> SQL Reference ManualCreate Routine 14.3.2 <strong>Oracle</strong> Rdb 14-214-6CREATE PROCEDURE 14-2 CREATE PROCEDURE CREATE PROCEDURE ADD_SOUNDEX_NAME (1)14-6(INOUT :PARAM1 INTEGER BY REFERENCE) (2)14-6;EXTERNAL NAME ADD_SOUNDEX_NAME (3)14-7LOCATION 'ADD_SOUNDEX.EXE' (4)14-7LANGUAGE FORTRAN (5)14-7GENERAL PARAMETER STYLE (6)14-7BIND ON SERVER SITE (7)14-7BIND SCOPE TRANSACTION (8)14-7NOTIFY ADD_SOUNDEX_NOTIFY ON BIND, TRANSACTION; (9)14-8 14-214-6(1) CREATE PROCEDURE ADD_SOUNDEX_NAME<strong>Oracle</strong> Rdb (2) INOUT :PARAM1 INTEGER BY REFERENCE INOUT SQL INTEGER:ININOUTOUT SQL LIST OF BYTE VARYING SQL REFERENCE 14-6 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


14.3 14.11 14-36 14.12 14-38.C ompa q Tru64 UNIX(3) EXTERNAL NAME ADD_SOUNDEX_NAME(4) LOCATION 'ADD_SOUNDEX.EXE'OpenVMS Compaq Tru64 UNIX DEFAULT LOCATION SQL RDB$ROUTINES (5) LANGUAGE GENERALADACCOBOLFORTRANPASCALGENERAL GENERAL <strong>Oracle</strong> Rdb SQL (6) GENERAL PARAMETER STYLE SQL OpenVMS GENERAL <strong>Oracle</strong> Rdb SQL (7) BIND ON SERVER SITESERVER SITE CLIENT SITE CLIENT SITE OpenVMS <strong>Oracle</strong> Rdb <strong>Oracle</strong> Rdb SERVER SITE <strong>Oracle</strong> Rdb <strong>Oracle</strong> Rdb 14.10 14-34(8) BIND SCOPE TRANSACTIONTRANSACTION CONNECT CONNECT 14-7


14.4 (9) NOTIFY ADD_SOUNDEX_NOTIFY ON BIND, TRANSACTIONNOTIFY BINDCONNECTTRANSACTION NOTIFY 14.13 14-41CREATE PROCEDURE <strong>Oracle</strong> <strong>Rdb7</strong> SQL Reference ManualCreate Routine 14.4 SQL ALTER FUNCTION ALTER PROCEDURE <strong>Oracle</strong> Rdb DROPFUNCTION DROP FUNCTION SOUNDEX;<strong>Oracle</strong> Rdb DROP PROCEDURE DROP PROCEDURE CLEAR_SOUNDEX;RESTRICT <strong>Oracle</strong> Rdb SQL ■■■■■ COMPUTED BY CASCADE <strong>Oracle</strong> Rdb 14-8 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


14.5 DROP FUNCTION DROP PROCEDURE CASCADE <strong>Oracle</strong> <strong>Rdb7</strong> SQL Reference Manual14.5 ■■■■14.5.1 14-914.5.2 14-1214.5.3 14-1614.5.4 14-2314.5.1 SQL SQL SQL 14-314-9OpenVMS VAX MTH$SQRT 14-3 OpenVMS VAX CREATE FUNCTION SQRT (IN :PARAM1 REAL)RETURNS REAL;EXTERNAL NAME MTH$SQRT LOCATION 'SYS$SHARE:MTHRTL.EXE'LANGUAGE GENERALGENERAL PARAMETER STYLE; 14-414-9OpenVMS Alpha MTH$SQRT 14-4 OpenVMS Alpha CREATE FUNCTION SQRT (IN :PARAM1 REAL)RETURNS REAL;EXTERNAL NAME MTH$SQRT LOCATION 'SYS$SHARE:DPML$SHR.EXE'LANGUAGE GENERALGENERAL PARAMETER STYLE; 14-9


14.5 OpenVMS VAX C ompa q Tru64 UNIXCompaq Tru64 UNIX F-float IEEE S-float sqrt.c ftof.c sqrtf #include extern void cvt_ff_to_fs( unsigned int *, float * );extern void cvt_fs_to_ff( float *, unsigned int * );extern void SQRT( unsigned int *ffout, unsigned int *ffin ) {float fsin,fsout;cvt_ff_to_fs( ffin, &fsin );fsout = sqrtf( fsin );cvt_fs_to_ff( &fsout, ffout ); }cvt ftof.c #include #include static int sts;extern void cvt_ff_to_fs( unsigned int *ff, float *fs ) {sts = cvt_ftof( ff,CVT_VAX_F, fs,CVT_IEEE_S, CVT_FORCE_ALL_SPECIAL_VALUES);if (sts != CVT_NORMAL) exc_raise_status_exception( sts ); }extern void cvt_fg_to_ft( unsigned long *fg, double *ft ) {sts = cvt_ftof( fg,CVT_VAX_G, ft,CVT_IEEE_T, CVT_FORCE_ALL_SPECIAL_VALUES);if (sts != CVT_NORMAL) exc_raise_status_exception( sts ); }extern void cvt_fs_to_ff( float *fs, unsigned int *ff ) {sts = cvt_ftof( fs,CVT_IEEE_S, ff,CVT_VAX_F, CVT_FORCE_ALL_SPECIAL_VALUES);if (sts != CVT_NORMAL) exc_raise_status_exception( sts ); }extern void cvt_ft_to_fg( double *ft, unsigned long *fg ) {sts = cvt_ftof( ft,CVT_IEEE_T, fg,CVT_VAX_G, CVT_FORCE_ALL_SPECIAL_VALUES);if (sts != CVT_NORMAL) exc_raise_status_exception( sts ); }$ cc -c -o sqrt.o sqrt.c$ cc -c -o ftof.o ftof.c$ ld -shared -soname $HOME/sqrt.so -o $HOME/sqrt.so sqrt.o ftof.o -lexc -lm -lc 14-514-10SQL 14-5 Compaq Tru64 UNIX CREATE FUNCTION SQRT (IN :PARAM1 REAL)RETURNS REAL BY REFERENCE;EXTERNAL NAME SQRT LOCATION 'sqrt.so'LANGUAGE CGENERAL PARAMETER STYLE14-10 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


14.5 BIND ON SERVER SITE; 14-614-11 SQL sql_sqrt_c.sqlmod 14-6 SQL ...-------------------------------------------------------------------------- Procedure to invoke the SQRT external function and insert values-- into the SQUARE_ROOTS table------------------------------------------------------------------------PROCEDURE INSERT_SQUARE_ROOTS_TABLE(SQLCODE,:P_NUM INTEGER);INSERT INTO SQUARE_ROOTS VALUES (:P_NUM, SQRT(CAST(:P_NUM AS REAL)));... 14-714-11sql_sqrt_c.sqlmod C sql_sqrt_mod.c 14-7 C .../* Declarations of entry points in the SQL module. */extern void INSERT_SQUARE_ROOTS_TABLE(int *sqlcode, int *p_num);main(){int sqlcode = 0;int i, n;float s;.../* Call the SQL module procedure to insert the square root values into thedatabase. */for(i=0;i


14.5 }...} while (sqlcode==0);14.5.2 14-114-12 SOUNDEX 14-1 soundex_c.csoundex_c.optsql_soundex_c.sqlmodsql_soundex_mod.cSOUNDEX C OpenVMS SOUNDEX SQL SQL C 14-814-12mf_personnel 4 14-8 C /* This function is an implementation of the SOUNDEX routine,originally developed by Margaret K. Odell and Robert C. Russelland described in Knuth's "Sorting and Searching, Vol. 3, TheArt of Computer Programming." */#include ...void SOUNDEX (char *out_string, char *source_str)...OpenVMS VAX soundex_c.opt 14-12 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


14.5 UNIVERSAL = SOUNDEXCREATE FUNCTION 14-914-13SOUNDEX 14-9 $ CC/G_FLOAT SOUNDEX_C.C$ LINK/SHAREABLE=SOUNDEX_C_IMAGE.EXE SOUNDEX_C,-_$ SOUNDEX_C.OPT/OPT 14-1014-13SQL SOUNDEX 14-10 CREATE FUNCTION SOUNDEX (IN CHAR(32)) RETURNS CHAR(4);EXTERNAL LOCATION 'SOUNDEX_C_IMAGE.EXE'LANGUAGE CGENERAL PARAMETER STYLE; 14-1114-13SOUNDEX SQL 14-11 SQL ...-------------------------------------------------------------- Declare Statement Section------------------------------------------------------------DECLARE E1_CURSOR CURSOR FOR SELECT LAST_NAME, SOUNDEX_LAST_NAMEFROM EMPLOYEESDECLARE E2_CURSOR CURSOR FOR SELECT LAST_NAME, SOUNDEX_LAST_NAMEFROM EMPLOYEES WHERE SOUNDEX_LAST_NAME=SOUNDEX('Varmelker')...--------------------------------------------------------------- Procedure to fetch a row.-------------------------------------------------------------PROCEDURE FETCH_E2(SQLCODE,:P_LAST_NAME CHAR(32),:P_SOUNDEX_LAST_NAME CHAR(4)); 14-13


14.5 FETCH E2_CURSOR INTO :P_LAST_NAME, :P_SOUNDEX_LAST_NAME;--------------------------------------------------------------- Procedure to alter table.-------------------------------------------------------------PROCEDURE ALTER_EMPLOYEES_TABLE(SQLCODE);ALTER TABLE EMPLOYEES ADD SOUNDEX_LAST_NAME CHAR(4);--------------------------------------------------------------- Procedure to update values in employees table.-------------------------------------------------------------PROCEDURE UPDATE_EMPLOYEES(SQLCODE);UPDATE EMPLOYEES SET SOUNDEX_LAST_NAME = SOUNDEX(LAST_NAME); 14-1214-14SOUNDEX SQL C 14-12 C #include typedef char STR33[33];typedef char STR5[5];typedef int *sqlcode;/* Declarations of entry points in the SQL module. */...extern void OPEN_E1(int *sqlcode);extern void CLOSE_E1(int *sqlcode);extern void FETCH_E1(int *sqlcode, STR33 last_name, STR5 soundex_last_name);extern void ALTER_EMPLOYEES_TABLE(int *sqlcode);extern void UPDATE_EMPLOYEES(int *sqlcode);main(){char last_name[33];char slast_name[5];int sqlcode = 0;...printf("¥nAltering EMPLOYEES table to add SOUNDEX_LAST_NAME column¥n");ALTER_EMPLOYEES_TABLE(&sqlcode);printf("¥nUpdating EMPLOYEES table, setting SOUNDEX_LAST_NAME equal to¥n");printf("SOUNDEX(LAST_NAME)¥n");UPDATE_EMPLOYEES(&sqlcode);printf("¥nPrint LAST_NAME and SOUNDEX_LAST_NAME¥n");printf("LAST_NAMESOUNDEX_LAST_NAME¥n");OPEN_E1(&sqlcode);14-14 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


14.5 }do {FETCH_E1(&sqlcode, last_name, slast_name);if (sqlcode==0)printf("%s %s¥n",last_name, slast_name);} while (sqlcode==0);if (sqlcode!=100)printf("SQL error code = %d¥n", sqlcode);CLOSE_E1(&sqlcode);printf("¥nPrint LAST_NAME and SOUNDEX_LAST_NAME where SOUNDEX_LAST_NAME¥n");printf(" sounds like 'Varmelker')¥n");printf("LAST_NAMESOUNDEX_LAST_NAME¥n");OPEN_E2(&sqlcode);do {FETCH_E2(&sqlcode, last_name, slast_name);if (sqlcode==0)printf("%s %s¥n",last_name, slast_name);} while (sqlcode==0);if (sqlcode!=100)printf("SQL error code = %d¥n", sqlcode);CLOSE_E2(&sqlcode);...SOUNDEX SQL $ CC/G_FLOAT SQL_SOUNDEX_MOD$ SQL$MOD SQL_SOUNDEX_C$ LINK SQL_SOUNDEX_MOD, SQL_SOUNDEX_C$ RUN SQL_SOUNDEX_MODSQL_SOUNDEX_MOD Altering EMPLOYEES table to add SOUNDEX_LAST_NAME columnUpdating EMPLOYEES table, setting SOUNDEX_LAST_NAME equal toSOUNDEX(LAST_NAME)Print LAST_NAME and SOUNDEX_LAST_NAMELAST_NAMESOUNDEX_LAST_NAMESmithS530O'SullivanO024LaschL200... 14-15


14.5 KeislingK245VormelkerV654...Print LAST_NAME and SOUNDEX_LAST_NAME where SOUNDEX_LAST_NAMEsounds like 'Varmelker'LAST_NAMESOUNDEX_LAST_NAMEVormelkerV65414.6 14-25 14.7 14-2914.5.3 <strong>Oracle</strong> Rdb SQL SQL SQL SQL sql_add_doc_mod.sqlmod C sql_add_doc.c 2 DOC DOC_INDEX docdb SQL> -- Create the table DOC to hold the document.SQL> CREATE TABLE DOC (DOC_ID INTEGER, DOC_TEXT VARCHAR (500));SQL>SQL> -- Create the table DOC_INDEX to hold the index and informationSQL> -- about the occurrence of the index tokens.SQL> CREATE TABLE DOC_INDEX1> (DOC_ID INTEGER, TOKEN CHAR (32),2> TOKEN_OCC_USED INTEGER, TOKEN_OCC VARCHAR (100),3> PRIMARY KEY (TOKEN, DOC_ID) NOT DEFERRABLE); 14-1314-16C sql_add_doc.c 14-13 /* External routine ADD_DOCGiven the text of a document, create tokens by breaking the document intowords, create an occurrence record for each unique token, and store auniformly space-delimited form of the document.This external routine uses the SQL module, sql_add_doc_mod.sqlmod, fordatabase operations, including a notify routine to control the attachand detach on routine binding and unbinding. */#include 14-16 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


14.5 #include extern int ADD_DOC( int *, char * );int add_token( int *, char *, int );extern void ADD_DOC_NOTIFY( int *, int *, int *, int * );void ATTACH_DB( int * );void DETACH_DB( int * );void START_TRAN( int * );void COMMIT_TRAN( int * );void ROLLBACK_TRAN( int * );void STORE_DOC( int *, char *, int * );void GET_DOC_INDEX_BY_TOKEN_ID( char *, int *, int *, char *, int * );void STORE_DOC_INDEX( int *, char *, int *, char *, int * );void UPDATE_DOC_INDEX( int *, char *, int *, char *, int * );void sql_signal( void );extern int ADD_DOC( int *doc_id, char *doc_text ) {int tokoff = 0, toklen = 0, docoff = 0, ndocoff = 0, dummy = 0, status = 0;char new_text[500+1], token[32+1];/* Start the transaction. */START_TRAN( &status );if (status !=0) return status;for (docoff =0; docoff 0) {strncpy( token, &new_text[tokoff], toklen );token[toklen] = '¥0';status = add_token( doc_id, token, tokoff );if (status != 0) break;toklen = 0; tokoff = 0;}} else {/* Move document text to uniformly delimited new doc text. */if (ndocoff > 0 && toklen == 0){ new_text[ndocoff++] = ' '; tokoff = ndocoff; }new_text[ndocoff++] = doc_text[docoff]; toklen++;}}if (status !=0) { ROLLBACK_TRAN( &dummy ); return status; }/* Save uniformly delimited doc text. Store it in the database. */new_text[ndocoff] = '¥0';STORE_DOC ( doc_id, new_text, &status );if (status !=0) { ROLLBACK_TRAN( &dummy ); return status; }/* Commit the transation. */COMMIT_TRAN( &status );if (status !=0) { ROLLBACK_TRAN( &dummy ); return status; }return status; 14-17


14.5 }int add_token( int *doc_id, char *token, int tokoff ) {int used, status = 0;char occ[100+1];/* Insert or update token occurrence index. */GET_DOC_INDEX_BY_TOKEN_ID( token, doc_id, &used, occ, &status );if (status == 100) { status = 0; used = 1; }else { if (status == 0) used++; else return status; }sprintf( &occ[(used-1)*4], "%04d", tokoff );if (used == 1) STORE_DOC_INDEX( doc_id, token, &used, occ, &status );else UPDATE_DOC_INDEX( doc_id, token, &used, occ, &status );return status;}extern void ADD_DOC_NOTIFY( int *func, int *u1, int *u2, int *u3 ) {int status;/* Attach to database on routine activation.Detach on routine deactivation. */switch (*func) {case 1: ATTACH_DB( &status ); if (status != 0) sql_signal(); break;case 2: DETACH_DB( &status ); if (status != 0) sql_signal(); break;}return;} 14-1314-16 14-1414-18 SQL 14-14 SQL -- This SQL module, linked together with the C language program sql_add_doc.c-- forms an external function, ADD_DOC. The SQL module procedures perform-- database operations, including attaching to the database,-- controlling transactions, inserting, retrieving, and updating data.---- This SQL module is also used by the C program, sql_locate_doc.c to retrieve-- information from the docdb database.MODULE ADDDOCLANGUAGE CPARAMETER COLONSDECLARE ALIAS FOR FILENAME docdbDECLARE FIND_DOC_INDEX_BY_TOKEN CURSOR FORSELECT DOC_ID FROM DOC_INDEX WHERE TOKEN = :tokPROCEDURE ATTACH_DB(SQLCODE);ATTACH 'FILENAME docdb';PROCEDURE DETACH_DB(SQLCODE);14-18 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


14.5 DISCONNECT DEFAULT;PROCEDURE START_READ_TRAN(SQLCODE);SET TRANSACTION READ ONLY;PROCEDURE START_TRAN(SQLCODE);SET TRANSACTION READ WRITE;PROCEDURE COMMIT_TRAN(SQLCODE);COMMIT;PROCEDURE ROLLBACK_TRAN(SQLCODE);ROLLBACK;-- Insert a document into the database.PROCEDURE STORE_DOC(:ID INTEGER, :TEXT CHAR(500), SQLCODE);INSERT INTO DOC VALUES (:ID, :TEXT);-- Retrieve the index to determine if the index token already exists-- or if it is a new token.PROCEDURE GET_DOC_INDEX_BY_TOKEN(:TOK CHAR (32), :ID INTEGER, :USED INTEGER, :OCC CHAR (100), SQLCODE);SELECT DOC_ID, TOKEN_OCC_USED, TOKEN_OCC INTO :ID, :USED, :OCCFROM DOC_INDEX WHERE :TOK = TOKEN;PROCEDURE GET_DOC_INDEX_BY_TOKEN_ID(:TOK CHAR (32), :ID INTEGER, :USED INTEGER, :OCC CHAR (100), SQLCODE);SELECT TOKEN_OCC_USED, TOKEN_OCC INTO :USED, :OCCFROM DOC_INDEX WHERE :TOK = TOKEN AND :ID = DOC_ID;-- Insert new index tokens.PROCEDURE STORE_DOC_INDEX(:ID INTEGER, :TOK CHAR (32), :USED INTEGER, :OCC CHAR (100), SQLCODE);INSERT INTO DOC_INDEX VALUES (:ID, :TOK, :USED, :OCC);-- Update the occurrence count if the index token already exists.PROCEDURE UPDATE_DOC_INDEX(:ID INTEGER, :TOK CHAR (32), :USED INTEGER, :OCC CHAR (100), SQLCODE);UPDATE DOC_INDEX SET TOKEN_OCC_USED = :USED, TOKEN_OCC = :OCCWHERE :TOK = TOKEN AND :ID = DOC_ID; 14-1514-19 docdb 14-15 SET QUOTING RULES 'SQL92';-- Define the external routine that loads the index.CREATE FUNCTION ADD_DOC(IN INTEGER, IN VARCHAR (500))RETURNS INTEGER;EXTERNAL NAME "ADD_DOC" LOCATION 'ADDDOC.EXE'LANGUAGE C GENERAL PARAMETER STYLE 14-19


14.5 BIND ON SERVER SITENOTIFY "ADD_DOC_NOTIFY" ON BIND; SQL 14.15 14-43ADD_DOC OpenVMS VAX 14.6 14-25 14.714-291. SQL SQL $ SQLMODINPUT FILE> SQL_ADD_DOC_MOD2. C $ CC SQL_ADD_DOC3. sql_add_doc.opt UNIVERSAL = ADD_DOCUNIVERSAL = ADD_DOC_NOTIFYPSECT_ATTR=RDB$MESSAGE_VECTOR,NOSHRPSECT_ATTR=RDB$DBHANDLE,NOSHRPSECT_ATTR=RDB$TRANSACTION_HANDLE,NOSHR4. $ LINK/SHARE=SYS$LOGIN:ADDDOC.EXE SQL_ADD_DOC.OBJ, SQL_ADD_DOC_MOD.OBJ, -$_ SQL_ADD_DOC.OPT/OPT, -$_ SQL$USER/LIB SQL ADD_DOC SQL> ATTACH 'FILENAME docdb';SQL>SQL> -- Declare a variable to retrieve the status of the statement.SQL> DECLARE :STATUS INTEGER;SQL> -- Populate the database with documents and index them.SQL> BEGIN1> SET :STATUS =2> ADD_DOC (1, 'An external function is a 3GL program that you invokeby using the function name as a value expression in an SQL statement.');3> END;SQL> PRINT 'The SQL error code is ', :status;STATUSThe SQL error code is 0SQL> BEGIN14-20 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


14.5 1> SET :STATUS =2> ADD_DOC (2, 'An external procedure is a 3GL program that you invokeusing the SQL CALL statement.');3> END;SQL> PRINT 'The SQL error code is ', :status;STATUSThe SQL error code is 0SQL>SQL> BEGIN1> SET :STATUS =2> ADD_DOC (3, 'An external routine is an external procedure or externalfunction, linked into a shareable image or shared module, and registered in thedatabase.');3> END;SQL> PRINT 'The SQL error code is ', :status;STATUSThe SQL error code is 0SQL C ...int main (void) {int seaidx, toklen=0, status = 0, exitval = 0, doc_id;char search_text[101];/* Get the search string. */printf( "Search string: " );scanf( "%[^¥n]", search_text );printf( "¥n" );for (seaidx=0; seaidx 0) { token[tokcnt][toklen] = '¥0';toksiz[tokcnt++] = toklen; toklen = 0; }} else { token[tokcnt][toklen++] = search_text[seaidx]; }}/* Search for relevant documents. */if (tokcnt > 0) {ATTACH_DB( &status );if (status != 0) { exitval = 1; goto done; }START_READ_TRAN( &status );if (status != 0) { exitval = 1; goto det_db; }OPEN_FIND_DOC_INDEX_BY_TOKEN( (char *)&token[0][0], &status );if (status == 100) goto rbk_db;if (status != 0) { exitval = 1; goto rbk_db; }while (1) { 14-21


14.5 FETCH_ID_FROM_DOC_INDEX( &doc_id, &status );if (status == 100) break;if (status != 0) { exitval = 1; goto rbk_db; }status = check_doc_occ( 0, doc_id, 0 );if (status != 0) { exitval = 1; goto rbk_db; }}...int check_doc_occ( int tokidx, int doc_id, int curoff ) {int idx, fndlen, nxtidx, nxtoff = 0, occoff = 0, status = 0, used = 0;char occ[100+1], doc[500+1];/* Match next token in document (with the id) using prior end offset. */GET_DOC_INDEX_BY_TOKEN_ID( (char *)&token[tokidx][0], &doc_id, &used, occ,&status );if (status == 100 && tokidx != 0) return 0;if (status != 0) return status;for (idx=0; idx= curoff) break; C SQL PROCEDURE GET_DOC_BY_ID(:ID INTEGER, :TEXT CHAR(500), SQLCODE);SELECT DOC_TEXT INTO :TEXTFROM DOC WHERE DOC_ID = :ID;PROCEDURE GET_DOC_INDEX_BY_TOKEN_ID(:TOK CHAR (32), :ID INTEGER, :USED INTEGER, :OCC CHAR (100), SQLCODE);SELECT TOKEN_OCC_USED, TOKEN_OCC INTO :USED, :OCCFROM DOC_INDEX WHERE :TOK = TOKEN AND :ID = DOC_ID;PROCEDURE OPEN_FIND_DOC_INDEX_BY_TOKEN(:TOK CHAR (32), SQLCODE);OPEN FIND_DOC_INDEX_BY_TOKEN;14-22 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


14.5 PROCEDURE FETCH_ID_FROM_DOC_INDEX(:ID INTEGER, SQLCODE);FETCH FIND_DOC_INDEX_BY_TOKEN INTO :ID;PROCEDURE CLOSE_FIND_DOC_INDEX_BY_TOKEN(SQLCODE);CLOSE FIND_DOC_INDEX_BY_TOKEN;14.5.4 OpenVMS OpenVMS RTL MYRANDOM OpenVMS RTL MTH$RANDOM RTL MTH$RANDOM MYRANDOM 14-214-23 OpenVMS RTL 14-2 myrandom_c.cmyrandom_c.optsql_myrandom_c.sqlmodsql_myrandom_mod.cOpenVMS RTL MTH$RANDOM MYRANDOM C OpenVMS RTLMTH$RANDOM SQL SQL C 14-1614-24MTH$RANDOM myrandom_c.c 14-23


14.5 14-16 C static seed = 0;float MYRANDOM(){return (MTH$RANDOM( &seed));}OpenVMS VAX myrandom_c.opt UNIVERSAL = MYRANDOMCREATE FUNCTION 14-1714-24MTH$RANDOM 14-17 $ CC/G_FLOAT myrandom_c.c$ LINK/SHAREABLE=myrandom_c_image.exe myrandom_c,-_$ myrandom_c.opt/OPT 14-1814-24SQL 14-18 CREATE FUNCTION MYRANDOM() RETURNS REAL;EXTERNAL LOCATION 'DB_DISK:[DB_FUNCT]MYRANDOM_C_IMAGE.EXE'LANGUAGE CGENERAL PARAMETER STYLE; 14-1914-24MTH$RANDOM SQL sql_myrandom_c.sqlmod 14-19 SQL ...--------------------------------------------------------------- Procedure to insert random numbers-------------------------------------------------------------PROCEDURE INSERT_RANDOM_NUMBER(SQLCODE);INSERT INTO RANDOM_NUMBERS VALUES(MYRANDOM()); 14-2014-25SQL C sql_myrandom_mod.c 14-24 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


14.6 14-20 C #include typedef int *SQLCODE;/* Declarations of entry points in the SQL module. */extern void INSERT_RANDOM_NUMBER(int *sqlcode);...main(){int sqlcode = 0;int i;float r;/* Invoke the external function. */for(i=0;i


14.6 C $ CC soundex_c.c SQL <strong>Oracle</strong> Rdb SQL SQL C sql_test.sc $ SQL$PRESQLPRE> sql_test/CC/SQLOPTIONS=ROLLBACK_ON_EXIT SQL <strong>Oracle</strong> Rdb SQL SQL SQL C $ SQLMODINPUT FILE> sql_add_doc_mod$$ CC sql_add_docOpenVMS VAX OpenVMS Alpha 14.6.1 OpenVMS VAX OpenVMS VAX 1. UNIVERSAL = routine-namePSECTSNOSHR SOUNDEX SOUNDEX_C.OPTUNIVERSAL = SOUNDEX14-26 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


14.6 2. $ LINK/SHAREABLE=soundex_c_image.exe soundex_c,-_$ soundex_c.opt/OPT1. UNIVERSAL = routine-namePSECTSNOSHRADDDOC ADD_DOC_NOTIFY sql_add_doc.opt UNIVERSAL = ADD_DOCUNIVERSAL = ADD_DOC_NOTIFYPSECT_ATTR=RDB$MESSAGE_VECTOR,NOSHRPSECT_ATTR=RDB$DBHANDLE,NOSHRPSECT_ATTR=RDB$TRANSACTION_HANDLE,NOSHR2. $ LINK/SHARE=sys$login:adddoc.exe sql_add_doc.obj, sql_add_doc_mod.obj, -$_ sql_add_doc.opt/OPT, -$_ SQL$USER/LIB14.6.2 OpenVMS Alpha OpenVMS Alpha 1. SYMBOL_VECTOR = (routine-name = PROCEDURE ) 14-27


14.6 PSECTSNOSHR SOUNDEX SOUNDEX_C.OPTSYMBOL_VECTOR = (SOUNDEX = PROCEDURE)2. $ LINK/SHAREABLE=soundex_c_image.exe soundex_c,-_$ soundex_c.opt/OPT1. SYMBOL_VECTOR = (routine-name = PROCEDURE)SYMBOL_VECTOR = (notify-routine-name = PROCEDURE)PSECTSNOSHRADDDOC ADD_DOC_NOTIFY sql_add_doc.opt SYMBOL_VECTOR = (ADD_DOC = PROCEDURE)SYMBOL_VECTOR = (ADD_DOC_NOTIFY = PROCEDURE)PSECT_ATTR=RDB$MESSAGE_VECTOR,NOSHRPSECT_ATTR=RDB$DBHANDLE,NOSHRPSECT_ATTR=RDB$TRANSACTION_HANDLE,NOSHR2. $ LINK/SHARE=sys$login:adddoc.exe sql_add_doc.obj, sql_add_doc_mod.obj, -$_ sql_add_doc.opt/OPT, -$_ SQL$USER/LIB14-28 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


14.7 Compaq Tru64 UNIX 14.7 Compaq Tru64 UNIX C ompa q Tru64 UNIXCompaq Tru64 UNIX 1. C $ cc -c -o soundex_c.o soundex_c.c2. -shared SOUNDEX $ ld -shared -soname ${HOME}/soundex_c_image.exe -o ¥> ${HOME}/soundex_c_image.exe soundex_c.o ¥> -no_archive -nocount -lots -lc1. SQL <strong>Oracle</strong> Rdb SQL SQL C sql_test.sc SQL $ sqlpre -l cc sql_test.sc SQL <strong>Oracle</strong> Rdb SQL SQL SQL C ADD_DOC $ sqlmod -int32 sql_add_doc_mod.sqlmod$$ cc -c -o sql_add_doc.o sql_add_doc.c2. -shared ADDDOC $ ld -hidden_symbol 'RDB$TRANSACTON_HANDLE' -hidden_symbol 'RDB$DBHANDLE' ¥> -hidden_symbol 'RDB$MESSAGE_VECTOR' -shared ¥> -soname ${HOME}/adddoc.exe -o ${HOME}/adddoc.exe ¥> sql_add_doc.o sql_add_doc_mod.o -no_archive -nocount ¥> -lsql -lrdbshr -lcosi -lots -lc 14-29


14.8 14.8 14.8.1 OpenVMS SYSPRV Compaq Tru64 UNIX SQL 14-2114-30 SQL SOUNDEX SOUNDEX CREATE FUNCTION SOUNDEX(IN CHAR(32))RETURNS CHAR(4);EXTERNAL LOCATION 'SOUNDEX$EXE' LANGUAGE CGENERAL PARAMETER STYLE; 14-21 SQL -- Invoke the external function in the select list of a SELECT statement-- to display an employee's last name and the last name generated by the-- SOUNDEX external function.SELECT LAST_NAME, SOUNDEX(LAST_NAME)FROM EMPLOYEES;-- Invoke the external function in a WHERE clause to find employees-- whose name sounds like "Barns".SELECT LAST_NAMEFROM EMPLOYEESWHERE SOUNDEX(LAST_NAME) = SOUNDEX('Barns');-- Invoke the external function to insert column values into rows of-- a table.INSERT INTO EMPLOYEES(LAST_NAME, SOUNDEX_LAST_NAME)VALUES('Barnes', SOUNDEX('Barnes'));-- Invoke the external function twice in a column constraint definition.-- You can also use an external function in a table constraint definition.CREATE TABLE EMPLOYEES(LAST_NAME CHAR(32),FIRST_NAME CHAR(32),CHECK(SOUNDEX(LAST_NAME) SOUNDEX(FIRST_NAME));-- Invoke an external function in a COMPUTED BY clause.CREATE TABLE EMPLOYEES_CACHE(LAST_NAME,SOUNDEX_LAST_NAME COMPUTED BY SOUNDEX(LAST_NAME)));14-30 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


14.8 14.8.2 INSERTDELETEUPDATE 14-2214-31SOUNDEX INSERT 14-22 CREATE TRIGGER LOG_UNUSUAL_NAME_CHANGESAFTER UPDATE OF LAST_NAMEON EMPLOYEESREFERENCING OLD AS OEMPNEW AS NEMPWHEN (SOUNDEX(OEMP.LAST_NAME) = SOUNDEX(NEMP.LAST_NAME))(INSERT INTO UNUSUAL_NAME_CHANGES_LIST(OEMP.LAST_NAME,NEMP.LAST_NAME,SOUNDEX(OEMP.LAST_NAME))FOR EACH ROW;DELETE OpenVMS 1 <strong>Oracle</strong> <strong>Rdb7</strong> Guide to Database Design and Definition 14-2314-31 14-23 CREATE FUNCTION SEND_MAIL(IN CHAR(32),IN CHAR(32),IN CHAR(256))RETURNS INTEGER;EXTERNAL NAME SEND_MAILLOCATION 'SUPPORT_FUNCTIONS'LANGUAGE CGENERAL PARAMETER STYLE;2 3 14-31


14.9 14-2414-32 14-24 CREATE TRIGGER EMPLOYEE_ID_CASCADE_DELETEBEFORE DELETE ON EMPLOYEESWHEN SEND_MAIL ('godfrind','Employee '|| EMPLOYEES.EMPLOYEE_ID || ' deleted','User ' || CURRENT_USER || ' just deleted employee ' ||EMPLOYEES.EMPLOYEE_ID ) 0( ERROR )FOR EACH ROW;SEND_MAIL SEND_MAIL 14.8.3 14-2514-32CALL 14-25 BEGINSET :ERROR = 0;CALL ADD_SOUNDEX_NAME (:ERROR);END;14.9 OpenVMS BIND ON CLIENT SITE BIND SERVER SITE CLIENT SITE OpenVMS <strong>Oracle</strong> Rdb SYSTEM_USER 14-32 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


14.9 <strong>Oracle</strong> Rdb <strong>Oracle</strong> Rdb SERVER SITE SERVERSITE <strong>Oracle</strong> Rdb <strong>Oracle</strong> Rdb SERVERSITE SESSION_USER SERVER SITE SESSION_USER OpenVMS DCL LOGIN/NOCOMMAND OpenVMS .*rc Compaq Tru64 UNIX OpenVMS I/O NULL SQL ■■■ USERA OpenVMS USERA USER D1 D1 SYSTEM_USER USERA USERA USER 'USERX' D2 D2 USERX SYSTEM_USER USERA 14-33


14.10 USERX USERX OpenVMS USERA USERA C ompa q Tru64 UNIXCompaq Tru64 UNIX 31 RDMS$RTX_SHRMEM_PAGE_CNT RDB_RTX_SHRMEM_PAGE_CNT 14.10 ■■■OpenVMS Compaq Tru64 UNIX OpenVMS ■■■/SYSTEM/EXECUTIVE_MODE/CONCEALED SYSTEM LOGICAL_NAME TRANSLATION /SYSTEM/EXECUTIVE_MODE 1 WITH SYSTEM LOGICAL_NAME TRANSLATION 255 14-34 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


14.10 ■<strong>Oracle</strong> Rdb OpenVMS RDB$LIBRARY SYSTEM LOGICAL_NAMETRANSLATION 14-2614-35 <strong>Oracle</strong> Rdb 14-26 CREATE FUNCTION SECURE_FUNC (IN CHAR(32) BY REFERENCE)RETURNS TINYINT;EXTERNAL LOCATION 'RDB$LIBRARY:SECURE_FUNC.EXE'WITH SYSTEM LOGICAL_NAME TRANSLATIONLANGUAGE CGENERAL PARAMETER STYLE;OpenVMS C ompa q Tru64 UNIXCompaq Tru64 UNIX /usr/local/dbs/shlib<strong>Oracle</strong> Rdb 1 14-35


14.11 OpenVMS SERVER SITE . SERVER SITE 1 <strong>Oracle</strong> Rdb <strong>Oracle</strong> Rdb 14.11 14.12 14-38■■■■■■■VALUE INOUT OUT REFERENCE LENGTHOpenVMS DESCRIPTOR 3GL FORTRAN SQL SQL OpenVMS F G IEEE S T Compaq Tru64 UNIX OUT INOUT ■ BY REFERENCE14-36 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


14.11 ■OpenVMS 32 Compaq Tru64 UNIX 64■■■ C SQL CHAR(n)NCHAR(n)VARCHAR(n)NCHAR VARYING(n) LONG VARCHAR NULL VARCHAR 16 BY VALUEOpenVMS SMALLINTTINYINTINTEGERREAL32 Compaq Tru64UNIX SMALLINTTINYINTINTEGERREAL32 BIGINTDOUBLE PRECISIONDATE VMSDATE ANSITIMETIMESTAMPINTERVAL64 BY DESCRIPTOR■OpenVMS S T VT 32 ■■ T VTBY LENGTHC ompa q Tru64 UNIX■■■OpenVMS BY LENGTH BY DESCRIPTOR Compaq Tru64 UNIX Compaq Tru64 UNIX Pascal Compaq Tru64UNIX FORTRAN 64 Compaq Tru64 UNIX 14-37


14.12 14.12 <strong>Oracle</strong> Rdb AdaCCOBOLFORTRANPascal CREATE FUNCTION CREATE PROCEDURE LANGUAGE GENERAL GENERAL <strong>Oracle</strong> Rdb 14.12.1 Ada Ada ■■ SQL Ada TINYINTSMALLINTINTEGERREALDOUBLE PRECISIONCHAR(n)VARCHAR(n)■■■■REFERENCE OpenVMS DESCRIPTOR LENGTH Compaq Tru64 UNIX REFERENCE REFERENCE ■■■■■VALUE OpenVMS DESCRIPTOR LENGTH Compaq Tru64 UNIX 8 VALUE9 REFERENCE REFERENCE ■■DEC Ada V3.0 'warnings=compilation_notes' CREATE Ada MECHANISM Ada 14-38 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


14.12 ■Ada OUT Ada Ada14.12.2 C C ■■ SQL C TINYINTSMALLINTINTEGERBIGINTOpenVMS Alpha Compaq Tru64 UNIX REALDOUBLEPRECISIONCHAR(n)VARCHAR(n)■■VALUE REFERENCE REFERENCE ■■■VALUE REFERENCE REFERENCE ■■CHAR(n) VARCHAR(n) REFERENCE SQL NULL NULL CHAR(n) VARCHAR(n) SQL C CREATE FUNCTION CONCAT_STRING (IN CHAR(20), IN CHAR(20)) RETURNS CHAR(40);EXTERNAL LOCATION 'concat_location.exe' LANGUAGE CGENERAL PARAMETER STYLE;C void concat_string (char *result_str, char *first_input, char *second_input);VAX C (V3.2-044) R0 C char *concat_string (char *first_input, char *second_input);■DESCRIPTOROpenVMS LENGTH C 14-39


14.12 14.12.3 COBOL COBOL ■■■■ SQL COBOL TINYINTSMALLINTINTEGERBIGINTREALCHAR(n)VARCHAR(n)COBOL COMPTINYINTSMALLINTINTEGERBIGINTCOMP-1REALCOMP-2D REFERENCE ■■VALUE REFERENCE 14.12.4 FORTRAN FORTRAN ■■ SQL FORTRAN TINYINTSMALLINTINTEGERBIGINTOpenVMS Alpha Compaq Tru64 UNIX REALDOUBLE PRECISIONCHAR(n)VARCHAR(n)■■REFERENCE LENGTH OpenVMS DESCRIPTOR ■■■VALUE LENGTH OpenVMS DESCRIPTOR ■REFERENCE FORTRAN 14.12.5 Pascal Pascal ■■ SQL Pascal SMALLINTINTEGERREALDOUBLE PRECISIONCHAR(n)VARCHAR(n) REFERENCE 14-40 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


14.13 ■ REFERENCE VAR name : PACKED ARRAY [1..n] OF CHAR■ LENGTH OpenVMS DESCRIPTOR [CLASS_S] PACKED ARRAY [LOW..HIGH :INTEGER] OF CHAR■■■VALUE REFERENCE CONCAT_STRING CREATE FUNCTION CONCAT_STRING (IN CHAR(20) BY REFERENCE,IN CHAR(20) BY REFERENCE)RETURNS CHAR(40);EXTERNAL LOCATION 'CONCAT_LOCATION' LANGUAGE PascalGENERAL PARAMETER STYLE;Pascal function concat_string (var input1_str : packed array[1..20] of char;var input2_str : packed array[1..20] of char): packed array [1..40];14.13 NOTIFY ■■■BIND--- CONNECT--- TRANSACTION--- 14-41


14.14 Notify <strong>Oracle</strong> Rdb 4 32 3 1 RDB$K_RTX_NOTIFY_ACTV_START2 RDB$K_RTX_NOTIFY_ACTV_END3 RDB$K_RTX_NOTIFY_CONN_START4 RDB$K_RTX_NOTIFY_CONN_END5 RDB$K_RTX_NOTIFY_TRAN_START6 RDB$K_RTX_NOTIFY_TRAN_COMMIT7 RDB$K_RTX_NOTIFY_TRAN_ROLLBACKBIND TRANSACTION 3 1 6 BIND SCOPE TRANSACTION 14.14 SQL SQL<strong>Oracle</strong> Rdb 14-42 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


14.15 ■■■■■■■■ 1 NULL<strong>Oracle</strong> Rdb 0 <strong>Oracle</strong> Rdb <strong>Oracle</strong> Rdb 14.15 <strong>Oracle</strong> Rdb ■■SYS$EXIT() exit()SYS$DELPRC() kill() OpenVMS Alpha /TIE /NONATIVE_ONLY ■■■■■SQL SQL EXISTS IN VARIANT 14-43


14.16 14.16 ■■■■■■ RTNSBC_INITERR RTNSBC_TASKERR 1 9OpenVMS ■ RTNSBC_TASKERR 10 19 RDMS$RTX_SHRMEM_PAGE_CNT RDB_RTX_SHRMEM_PAGE_CNT 2 2 14-44 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


14.17 ■■ INVRTNUSE OpenVMS 1 <strong>Oracle</strong> <strong>Rdb7</strong> Guide to Database Performance and Tuning14.17 <strong>Oracle</strong> Rdb ■■■■■■ I/O 14-45


14.17 14-46 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


V 5 ■■■SQL


15SQL SQL ■■■■■15.1 SQL SQL 15.1.1 2 ■ FILENAME file-specificationfile-specification <strong>Oracle</strong> Rdb 15-1


15.1 ■PATHNAME path-namepath-name 15.1.2 SQL SQL ATTACH SQL SQL DECLAREALIAS ■■■■ATTACH DECLARE ALIAS ATTACH DECLARE ALIAS Compaq Tru64 UNIX .dbsrc SQL$DATABASE SQL_DATABASE SQL SQL SQL SQL$DATABASE SQL_DATABASE SQL$DATABASE SQL_DATABASE CREATE ALTER DROP DICTIONARY IS REQUIRED SQL$DATABASE SQL_DATABASE SQL <strong>Oracle</strong> <strong>Rdb7</strong> Introduction to SQL SQL 15-2 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


15.1 ATTACH DECLARE ALIAS SQL <strong>Oracle</strong> Rdb <strong>Oracle</strong> Rdb SQL ■■■<strong>Oracle</strong> Rdb SQL ATTACH CONNECT TO <strong>Oracle</strong> Rdb <strong>Oracle</strong> Rdb SQLSQL SQL ALTERCREATEDELETEDROPGRANTINSERTOPENREVOKESELECTSET TRANSACTIONUPDATE15.1.3 1 2 EXEC SQLDECLARE LOCAL personnel ALIASCOMPILETIME PATHNAME PERS_CDDRUNTIME FILENAME PERS;DECLARE ALIAS PATHNAME PERS_CDD SQL DECLARE ALIAS FILENAME PERS personnel 15-3


15.2 SQL COMPILETIME FILENAME RUNTIME SQL PATHNAME PATHNAME ■■ SQL COMPILETIME SQL RUNTIME SQL RUNTIME SQL SQL 15.2 15-415.2 <strong>Oracle</strong> Rdb TCP/IP DECnet <strong>Oracle</strong> <strong>Rdb7</strong> Installation and Configuration GuideFILENAME OpenVMS SQL SQL> ATTACH 'FILENAME speedy::disk3:[dept3]personnel';15-4 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


15.2 <strong>Oracle</strong> Rdb <strong>Oracle</strong> Rdb <strong>Oracle</strong> Rdb <strong>Oracle</strong> Rdb <strong>Oracle</strong> Rdb ■■ATTACH DECLARE ALIAS SQL USER USING 15.2.1 15-6■■DECLARE ALIAS USER DEFAULT USING DEFAULT 15.2.2 15-7Compaq Tru64 UNIX .dbsrc OpenVMS RDB$CLIENT_DEFAULTS.DAT 15.2.3 15-8■Compaq Tru64 UNIX Compaq Tru64 UNIX <strong>Oracle</strong> Rdb 15-115-6<strong>Oracle</strong> Rdb C ompa q Tru64 UNIX■■■OpenVMS 15.2.4 15-8 OpenVMS RDB$REMOTE 15.2.5 15-9Compaq Tru64 UNIX dbsmgr dbsmgr 15-5


15.2 15-115-6 15-1 OpenVMS OpenVMSOpenVMS UNIX UNIXUNIX T *1 D *1 N/A T *1 N/AUNIX OpenVMSUSER/USING TD TD TD TDSQL TD TD TD TD TD TD TD TD D N/A N/A DRDB$REMOTE[nn] TD N/A N/A TDdbsmgr N/A TD TD N/A*1 ■■T - TCP / IPD - DECnet■N/A - : <strong>Oracle</strong> <strong>Rdb7</strong> Installationand Configuration Guide15.2.1 USER USING SQL 15-6 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


15.2 ATTACH DECLARE ALIAS SQL ALTER DATABASE CONNECT USER USING Compaq Tru64 UNIX mf_personnel ATTACH USER USING SQL> ATTACH 'FILENAME osfrem::/usr/users/heleng/mf_personnel1> USER ''heleng'' USING ''MYpassword''';' 2 DEFAULT SQL SQLSQL USER USING <strong>Oracle</strong> Rdb 15.2.2 C ompa q Tru64 UNIX■Compaq Tru64 UNIX■■SQL -user -pass SQL -s -user -s -pass ■OpenVMS■■SQL USER_DEFAULT PASSWORD_DEFAULT SQL SQL_OPTIONS USER_DEFAULT PASSWORD_DEFAULT DECLARE ALIAS USER DEFAULT PASSWORD DEFAULTCompaq Tru64 UNIX SQL $ sqlmod myprog -user heleng -pass MYpassword 15-7


15.2 15.2.3 C ompa q Tru64 UNIXSQL_USERNAME SQL_PASSWORD Compaq Tru64 UNIX .dbsrc OpenVMS RDB$CLIENT_DEFAULTS.DAT Compaq Tru64 UNIX "heleng" "MYpassword" SQL_USERNAMESQL_PASSWORDhelengMYpassword15.2.4 OpenVMS <strong>Oracle</strong> Rdb ■■■ATTACH NODEB JONES SQL> ATTACH 'FILENAME NODEB"JONES"::USER2:[JONES]PERSONNEL';15-8 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


15.2 <strong>Oracle</strong> <strong>Rdb7</strong> Installation and Configuration GuideOpenVMS <strong>Oracle</strong> Rdb RDB$REMOTE <strong>Oracle</strong> Rdb LOGIN.COM RDBSERVER RDMS$VERSION_VARIANT <strong>Oracle</strong> Rdb 6.1 7.0 LOGIN.COM $ DEFINE RDBSERVER SYS$SYSTEM:RDBSERVER70.EXE$ DEFINE RDMS$VERSION_VARIANT 7015.2.5 RDB$REMOTE RDB$REMOTE RDB$REMOTE <strong>Oracle</strong> <strong>Rdb7</strong> Installation and Configuration GuideSQL> ATTACH 'FILENAME speedy::disk3:[dept3]personnel';RDB$REMOTE <strong>Oracle</strong> Rdb RDB$REMOTE <strong>Oracle</strong> Rdb 6.1 7.0 RDB$REMOTE70 SQL> ATTACH 'FILENAME SPEEDY"RDB$REMOTE70 password"::DISK3:[DEPT3]PERSONNEL'; 15-9


15.2 : TCP/IP DECnet TCP/IP RDB$REMOTE 15.2.6 15-10SQL RDB$REMOTE HELENG FASTR SPEEDY 7.0 UAF> ADD/PROXY FASTR::HELENGRDB$REMOTE70/DEFAULT15.2.6 UCX TCP/IP OpenVMX <strong>Oracle</strong> Rdb Compaq Tru64 UNIX Compaq Tru64 UNIX OpenVMS <strong>Oracle</strong> Rdb TCP/IP RdbServer OpenVMS RDB$REMOTE UCX SQL_ALTERNATE_SERVICE_NAME <strong>Oracle</strong> Rdb myservice RDB$REMOTE61 <strong>Oracle</strong> Rdb 6.1 C ompa q Tru64 UNIXSQL_ALTERNATE_SERVICE_NAMEmyserviceCompaq Tru64 UNIX dbsmgr SQL_ALTERNATE_SERVICE_NAME <strong>Oracle</strong>Rdb myservice dbsmgrSQL_ALTERNATE_SERVICE_NAMEmyservice<strong>Oracle</strong> <strong>Rdb7</strong> Installation and ConfigurationGuide15-10 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


15.4 15.3 <strong>Oracle</strong> Rdb AST<strong>Oracle</strong> Rdb <strong>Oracle</strong> Rdb AST ASTAST AST <strong>Oracle</strong> Rdb AST 15.4 15.4.1 2 <strong>Oracle</strong> Rdb 16.2.5 16-12<strong>Oracle</strong> <strong>Rdb7</strong> Guide to DistributedTransactions15.4.2 <strong>Oracle</strong>Rdb DISTRIBTRAN DISTRIBTRAN DISTRIBTRAN <strong>Oracle</strong> Rdb SQL 15-11


15.5 SQL <strong>Oracle</strong> <strong>Rdb7</strong> Guide to Database Design and Definition<strong>Oracle</strong> <strong>Rdb7</strong> SQL Reference Manual15.5 ATTACH DECLARE ALIAS SP SQL> ATTACH 'ALIAS SP FILENAME personnel';ATTACH SQL SQL RDB$DBHANDLE RDB$DBHANDLE RDB$DBHANDLESQL SQL ALIAS 1 SQL RDB$DBHANDLE SQL SQL SQL RDB$DBHANDLE SQL 15-115-1315-12 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


15.5 15-1 SQL> ATTACH 'ALIAS SP FILENAME personnel';SQL> SELECT JOB_CODE, JOB_TITLE, MINIMUM_SALARY, MAXIMUM_SALARY1> FROM JOBS LIMIT TO 5 ROWS;%SQL-F-NODEFDB, There is no default databaseSQL> --SQL> SELECT JOB_CODE, JOB_TITLE, MINIMUM_SALARY, MAXIMUM_SALARYFROM SP.JOBS LIMIT TO 5 ROWS;;JOB_CODE JOB_TITLE MINIMUM_SALARY MAXIMUM_SALARYAPGM Associate Programmer $15,000.00 $24,000.00CLRK Clerk $12,000.00 $20,000.00ASCK Assistant Clerk $7,000.00 $15,000.00DMGR Department Manager $50,000.00 $100,000.00DSUP Dept. Supervisor $36,000.00 $60,000.005 rows selectedSQL>1 SQL$DATABASE SQL_DATABASE 15-215-131 RDB$DBHANDLE SQL 15-2 ...EXEC SQL DECLARE ALIAS FILENAME personnel;EXEC SQL DECLARE alias_1 ALIAS FILENAME mf_personnel;EXEC SQL SELECT EMPLOYEE_ID, LAST_NAMEINTO :employee_id1, :last_name1FROM EMPLOYEES WHERE EMPLOYEE_ID = '00301';EXEC SQL INSERT INTO alias_1.EMPLOYEES(EMPLOYEE_ID, LAST_NAME)VALUES (:employee_id1, :last_name1 );...2 RDB$DBHANDLE 15-13


15.5 1 15-315-14 2 15-3 2 /****************************************************************************** This routine transfers an employee from the EAST database to the WEST* database. It expects the distributed context structure as a parameter.* The employee record is selected first, deleted from the EAST database* and inserted into the WEST database.*****************************************************************************/...EXEC SQL DECLARE east ALIAS FOR FILENAME 2pceast;EXEC SQL DECLARE west ALIAS FOR FILENAME 2pcwest;...EXEC SQL USING CONTEXT :local_contextSELECT EMPLOYEE_ID,LAST_NAME,FIRST_NAME,MIDDLE_INITIAL,ADDRESS_DATA_1, CITY, STATE, POSTAL_CODE, SEX, BIRTHDAYINTO:local_employee.emp_id, :local_employee.emp_last_name,:local_employee.emp_first_name, :local_employee.emp_middle_initial,:local_employee.emp_address1, :local_employee.emp_city,:local_employee.emp_state, :local_employee.emp_zip,:local_employee.emp_sex, :local_employee.emp_birthFROM east.EMPLOYEESWHERE east.EMPLOYEES.EMPLOYEE_ID = :emp_id;printf("Deleting the record from the EAST database ¥n");EXEC SQL USING CONTEXT :local_contextDELETE FROM east.EMPLOYEES EWHERE E.EMPLOYEE_ID = :emp_id;printf("¥nInserting the employee record into WEST ¥n");EXEC SQL USING CONTEXT :local_contextINSERT INTO west.EMPLOYEES(EMPLOYEE_ID,LAST_NAME,FIRST_NAME,MIDDLE_INITIAL,ADDRESS_DATA_1,CITY,STATE, POSTAL_CODE, SEX, BIRTHDAY)VALUES(:local_employee.emp_id, :local_employee.emp_last_name,:local_employee.emp_first_name,:local_employee.emp_middle_initial,:local_employee.emp_address1, :local_employee.emp_city,:local_employee.emp_state, :local_employee.emp_zip,15-14 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


15.6 ...:local_employee.emp_sex, :local_employee.emp_birth); 15-315-14 2 2 DECLARE TRANSACTION SET TRANSACTION DECLARE TRANSACTION SET TRANSACTION 16.2 16-515.6 <strong>Oracle</strong> Rdb ■ DISCONNECT DISCONNECT ■■■DISCONNECT GLOBAL SQL DISCONNECT SQL DECLARETRANSACTION ■DISCONNECT ATTACH 15-15


15.6 15-16 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


16SQL ■■■■■■■■ 16-1


16.1 16.1 <strong>Oracle</strong> Rdb <strong>Oracle</strong> Rdb SQL 1 ATOMIC personnel JOB_HISTORY SALARY_HISTORY 2 2 1 <strong>Oracle</strong> Rdb 16.1.1 ■■1 / / / / Recovery-unit 16.2.3 16-81 1 16-2 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


16.1 SQL 1 / DECLARE ALIAS ATTACH 16.2.8 16-2116.4 16-24■■■■■RESERVING RESERVING <strong>Oracle</strong> Rdb <strong>Oracle</strong> Rdb <strong>Oracle</strong> Rdb WAITNOWAIT WAIT 16.2.6 16-14 16-3


16.1 ■16.7 16-39■■■1 16.1.2 ■■■ READ ONLY 16.2.4 16-10 16.5 16-25CREATEDELETEALTERGRANT REVOKE SHARED DATA DEFINITION <strong>Oracle</strong> Rdb <strong>Oracle</strong> Rdb 16-4 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


16.2 SQL <strong>Oracle</strong> Rdb SHARED EXCLUSIVE DATADEFINITION SHARED DATA DEFINITION EXCLUSIVE DATA DEFINITION ■1 16.2 16-516.2 SQL 2 ■■<strong>Oracle</strong> Rdb DECLARE TRANSACTION SETTRANSACTION DECLARE TRANSACTION DECLARE TRANSACTION SQL COMMIT ROLLBACK SQL COMMIT ROLLBACK SQL DECLARE TRANSACTION ■ SQL 16-5


16.2 SQL ■SQL SQL <strong>Oracle</strong> Rdb <strong>Oracle</strong> Rdb SQL SQL SQL SQL SQL 5.5 5-5SQL 6.6.2 6-12DECLARE TRANSACTION SET TRANSACTION SQL DECLARE TRANSACTION 1 DECLARE TRANSACTION SQL DECLARE TRANSACTIONSETTRANSACTION SET TRANSACTION SQL SETTRANSACTION SET TRANSACTION ■■ 2 16.3 16-21SET TRANSACTION DECLARE TRANSACTION 16.2.1 / DECLARE TRANSACTION SET TRANSACTION READ ONLY ■16-6 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


16.2 SQL ■■■■<strong>Oracle</strong> Rdb <strong>Oracle</strong> Rdb RESERVING RESERVING / / 16-7


16.2 SQL 16.2.2 / / INSERTDELETEUPDATECREATEALTERDROPGRANTREVOKE / SET TRANSACTION READ WRITE;<strong>Oracle</strong> Rdb SQL SQL EMPLOYEES <strong>Oracle</strong> Rdb EMPLOYEES <strong>Oracle</strong> Rdb 1 EXCLUSIVE WRITE SQL <strong>Oracle</strong> Rdb <strong>Oracle</strong> Rdb 16.2.3. / / 16-8 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


16.2 SQL Recovery-unit I/O COMMIT 2 2 1 SET TRANSACTIONON FIRST_DB USING (READ ONLY)AND ON SECOND_DB USING (BATCH UPDATE);SECOND_DB Recovery-unit COMMIT COMMIT 2 SET TRANSACTION BATCH UPDATE ■■SQL 16-9


16.2 SQL RMU Backup 1 RMU Restore 16.2.4 RESERVING SET TRANSACTION DECLARE TRANSACTION SQL DECLARE TRANSACTION READ WRITE WAIT;SQL SQL <strong>Oracle</strong> Rdb / RESERVING ■ SHARED READ■SHARED WRITE■■■■■■SHARED DATA DEFINITIONPROTECTED READPROTECTED WRITEEXCLUSIVE READEXCLUSIVE WRITEEXCLUSIVE DATA DEFINITION 16-116-11SET TRANSACTION RESERVING / 16-10 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


16.2 SQL 16-1 / SQL> SET TRANSACTION READ WRITERESERVING table_name FORshare modelock typeREADWRITEDATADEFINITIONSHAREDPROTECTEDEXCLUSIVESQLNU-2111A-RARESERVING SET TRANSACTION READ ONLYRESERVING EMPLOYEES FOR SHARED READ;RESERVING <strong>Oracle</strong> Rdb READ ONLY RESERVING 3 SET TRANSACTION READ ONLY RESERVINGEMPLOYEES FOR SHARED READ,JOBS FOR SHARED READ,DEPARTMENTS FOR SHARED READ; 16-11


16.2 SQL SET TRANSACTION EMPLOYEES COLLEGES DEGREES SET TRANSACTION READ WRITE RESERVINGEMPLOYEES FOR SHARED READ,COLLEGES FOR SHARED WRITE,DEGREES FOR EXCLUSIVE WRITE; 2 1 SET TRANSACTION READ WRITE RESERVINGEMPLOYEES FOR EXCLUSIVE READ,EMPLOYEES_TEMP FOR EXCLUSIVE WRITE;■■■<strong>Oracle</strong> Rdb <strong>Oracle</strong> Rdb <strong>Oracle</strong> Rdb <strong>Oracle</strong> Rdb computed-by 16.2.5 WAIT NOWAIT WAIT SET TRANSACTION READ ONLY;16-12 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


16.2 SQL SET TRANSACTION DECLARETRANSACTION NOWAIT NOWAIT NOWAIT SET TRANSACTION READ WRITE RESERVINGEMPLOYEES FOR PROTECTED WRITE,JOB_HISTORY FOR PROTECTED WRITE,SALARY_HISTORY FOR SHARED READ NOWAIT;NOWAIT 1. NOWAIT 2. 3. NOWAIT "The record you want is in use. Do you want to wait?" 4. Y y WAIT N n SET TRANSACTION DECLARETRANSACTION WAIT SET TRANSACTION 15 SET TRANSACTION READ WRITE WAIT 15;<strong>Oracle</strong> Rd 15 <strong>Oracle</strong> Rdb <strong>Oracle</strong> Rdb 16-13


16.2 SQL <strong>Oracle</strong> Rdb <strong>Oracle</strong> <strong>Rdb7</strong> SQL Reference Manual16.2.6 SET TRANSACTION WAIT <strong>Oracle</strong> Rdb 1 <strong>Oracle</strong> Rdb 3 ■SERIALIZABLE 1 <strong>Oracle</strong> Rdb ISOLATION LEVELSERIALIZABLE ■■REPEATABLE READ COUNTAVERAGE READ COMMITTED<strong>Oracle</strong> Rdb SET TRANSACTION DECLARE TRANSACTION / / 1 <strong>Oracle</strong> Rdb 16-14 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


16.2 SQL 16-116-15 16-1 READ COMMITTED REPEATABLE READ SERIALIZABLE : RESERVING RESERVING <strong>Oracle</strong> Rdb <strong>Oracle</strong> Rdb UPDATE ONLY <strong>Oracle</strong> Rdb COMMIT ROLLBACK 16.2.6.1 <strong>Oracle</strong> Rdb 16.2.6.2 <strong>Oracle</strong> Rdb 1 16-15


16.2 SQL 6 ATTACH 'FILENAME mf_personnel';SET TRANSACTION READ WRITEISOLATION LEVEL REPEATABLE READ;SELECT EMPLOYEE_ID, LAST_NAME, FIRST_NAME, MIDDLE_INITIALFROM EMPLOYEES WHERE EMPLOYEE_ID < '00170';EMPLOYEE_ID LAST_NAME FIRST_NAME MIDDLE_INITIAL00164 Toliver Alvin A.00165 Smith Terry D.00166 Dietrich Rick NULL00167 Kilpatrick Janet NULL00168 Nash Norman NULL00169 Gray Susan O.6 rows selectedmf_personnel 1 ATTACH 'FILENAME mf_personnel';SET TRANSACTION READ WRITE;INSERT INTO EMPLOYEES(EMPLOYEE_ID, LAST_NAME, FIRST_NAME,MIDDLE_INITIAL)VALUES ('00161','Muggs','Fred','J');1 row insertedCOMMIT; 6 2 Fred MuggsSELECT EMPLOYEE_ID, LAST_NAME,FIRST_NAME,MIDDLE_INITIALFROM EMPLOYEES WHERE EMPLOYEE_ID < '00170';EMPLOYEE_ID LAST_NAME FIRST_NAME MIDDLE_INITIAL00161 Muggs Fred J.00164 Toliver Alvin A.00165 Smith Terry D.00166 Dietrich Rick NULL00167 Kilpatrick Janet NULL00168 Nash Norman NULL00169 Gray Susan O.7 rows selected16-16 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


16.2 SQL <strong>Oracle</strong> Rdb <strong>Oracle</strong> Rdb REPEATABLE READ <strong>Oracle</strong> Rdb REPEATABLE READ 16.2.6.3 <strong>Oracle</strong> Rdb 1 / READ COMMITTED buried update anomaly■2 2 ■■ 1 2 2 1 2 2 1 2 1 READ COMMITTED REPEATABLE READ SERIALIZABLE 6 SET TRANSACTION READ WRITEISOLATION LEVEL READ COMMITTED; 16-17


16.2 SQL SELECT EMPLOYEE_ID, LAST_NAME, FIRST_NAME, MIDDLE_INITIALFROM EMPLOYEES WHERE EMPLOYEE_ID < '00170';EMPLOYEE_ID LAST_NAME FIRST_NAME MIDDLE_INITIAL00164 Toliver Alvin A.00165 Smith Terry D.00166 Dietrich Rick NULL00167 Kilpatrick Janet NULL00168 Nash Norman NULL00169 Gray Susan O.6 rows selectedmf_personnel 1 SET TRANSACTION READ WRITE;INSERT INTO EMPLOYEES(EMPLOYEE_ID, LAST_NAME, FIRST_NAME, MIDDLE_INITIAL)VALUES ('00161','Muggs','Fred','J');1 row insertedUPDATE EMPLOYEESSET FIRST_NAME = 'David',LAST_NAME = 'Garroway',MIDDLE_INITIAL = 'E'WHERE EMPLOYEE_ID = '00164';1 row updatedCOMMIT; ID Fred MuggsAlvinToliver David Garroway SELECT EMPLOYEE_ID, LAST_NAME, FIRST_NAME, MIDDLE_INITIALFROM EMPLOYEES WHERE EMPLOYEE_ID < '00170';EMPLOYEE_ID LAST_NAME FIRST_NAME MIDDLE_INITIAL00161 Muggs Fred J.00164 Garroway David E.00165 Smith Terry D.00166 Dietrich Rick NULL00167 Kilpatrick Janet NULL00168 Nash Norman NULL00169 Gray Susan O.7 rows selectedCOMMIT;<strong>Oracle</strong> Rdb Alvin Toliver 16-18 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


16.2 SQL READ COMMITTED ALGAdjustable Lock Granularity16.2.7 SERIALIZABLE SERIALIZABLE SERIALIZABLE REPEATABLE READ READCOMMITTED SERIALIZABLE 2 2 16-19


16.2 SQL 1 1 READ COMMITTED REPEATABLE READ T 100 READ COMMITTED T 25 10 READ COMMITTED 15 T UPDATE ONLY 2 10 <strong>Oracle</strong> Rdb <strong>Oracle</strong> Rdb ISOLATION LEVEL READCOMMITTED <strong>Oracle</strong> Rdb SQL 16-20 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


16.3 16.2.8 1 1 <strong>Oracle</strong> Rdb 1 <strong>Oracle</strong>Rdb FIRST_DB SECOND_DB ATTACH DECLARE ALIAS SET TRANSACTIONON FIRST_DB USING (READ ONLYRESERVING FIRST_DB.EMPLOYEES FOR SHARED READ)AND ON SECOND_DB USING (READ WRITERESERVING SECOND_DB.EMPLOYEES FOR EXCLUSIVE WRITE);<strong>Oracle</strong> Rdb <strong>Oracle</strong> Rdb 17 17-116.3 <strong>Oracle</strong> Rdb 1 SET TRANSACTION SQL SQL COMMIT ROLLBACK SQL <strong>Oracle</strong> Rdb DECLARE TRANSACTION DECLARE TRANSACTION <strong>Oracle</strong> Rdb<strong>Oracle</strong> Rdb ISOLATION LEVEL SERIALIZABLE / <strong>Oracle</strong> Rdb COMMIT ROLLBACK 16.8 16-42 16-21


16.3 16-216-22SET TRANSACTION SET TRANSACTION SQL 16-2 SET TRANSACTION SET TRANSACTION READ ONLY...COMMITSELECT......ROLLBACKSET TRANSACTION......COMMITSQLDECLARE TRANSACTIONSQLZK-1178A-RADECLARE TRANSACTION SET TRANSACTION SQL OPEN DECLARE TRANSACTION SET TRANSACTION SQL DECLARETRANSACTION <strong>Oracle</strong> Rdb DECLARE TRANSACTION <strong>Oracle</strong> Rdb 1 DECLARE TRANSACTION READ ONLY SET TRANSACTION READONLY COMMIT ROLLBACK 16-316-23SQL SQL DECLARE TRANSACTION 16-22 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


16.3 16-3 DECLARE TRANSACTION DECLARE TRANSACTION READ ONLYSELECT...INTO......COMMITSELECT...INTO......ROLLBACKOPEN CURSOR1......COMMITZK-1038A-RA1 DECLARE TRANSACTION SET TRANSACTION : DECLARE TRANSACTION SET TRANSACTION <strong>Oracle</strong> <strong>Rdb7</strong> SQL Reference Manual 16-416-24DECLARE TRANSACTION SET TRANSACTION 16-23


16.4 16-4 SET TRANSACTION DECLARE TRANSACTION DECLARE TRANSACTION READ ONLYSELECT......ROLLBACKSET TRANSACTION READ WRITEINSERT INTO......COMMITSELECT......COMMITZK-1039A-GE16.4 1 1 1 SQL 2 OpenVMS DECdtm <strong>Oracle</strong> Rdb 22 1 16-24 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


16.5 2 <strong>Oracle</strong><strong>Rdb7</strong> Guide to Distributed Transactions16.8 16-4216.5 <strong>Oracle</strong> Rdb ■■■16.5.1 <strong>Oracle</strong> Rdb <strong>Oracle</strong> Rdb / / 16.5.4 16-30<strong>Oracle</strong> Rdb ■■ 16-25


16.5 ■<strong>Oracle</strong> Rdb 500,000 1 <strong>Oracle</strong> Rdb Adjustable Lock GranularityALG16.5.2 <strong>Oracle</strong> Rdb RESERVING <strong>Oracle</strong> Rdb SQL <strong>Oracle</strong> Rdb<strong>Oracle</strong> Rdb 16-216-26 16-2 CRCWConcurrentReadConcurrentWritePR Protected Read 16-26 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


16.5 16-2 PW Protected Write CR EX Exclusive <strong>Oracle</strong> Rdb 1 1 (16.5.3 16-2810.5 10-32OPEN RESERVING <strong>Oracle</strong> Rdb UPDATE DELETE 16-27


16.5 / 16.5.3 16-516-292 NOWAIT 2 WAIT ■2 ■■2 16-516-29WAIT NOWAIT "await" "a conflict" / 16-28 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


16.5 16-5 READ ONLYREAD WRITESHAREDREADREAD WRITESHAREDWRITEREAD WRITEPROTECTEDREADREAD WRITEPROTECTEDWRITEREAD WRITEEXCLUSIVEREADREAD WRITEEXCLUSIVEWRITEREAD ONLYREAD WRITESHAREDREAD READ WRITESHAREDWRITEREAD WRITEPROTECTEDREADREAD WRITEPROTECTEDWRITEREAD WRITEEXCLUSIVEREADREAD WRITEEXCLUSIVEWRITEZK-1484A-GE<strong>Oracle</strong> Rdb / <strong>Oracle</strong> Rdb / / 1 COMMIT ROLLBACK CLOSE 16-29


16.5 <strong>Oracle</strong> Rdb 16.5.4 <strong>Oracle</strong> Rdb Before-image Before-image Before-image Before-image <strong>Oracle</strong> Rdb / 16.5.5 Recovery-unit I/O / / / NOWAIT 16-30 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


16.5 /1. A EXCLUSIVE WRITE 2. B WAIT RESERVING 3. B A 4. B 5. A SQL B EXCLUSIVE WRITE <strong>Oracle</strong> Rdb B WAIT B 16.5.6 1 ■■1 16-31


16.5 ID 1 3 1 1 1 Identification NumberID<strong>Oracle</strong> Rdb <strong>Oracle</strong> Rdb 1 1 EMPLOYEES EMPLOYEES16-32 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


16.6 I/O NULL 1 SELECT LAST_NAME, FIRST_NAME, JOB_CODE, JOB_START, SALARY_AMOUNTFROM EMPLOYEES E, JOB_HISTORY JH, SALARY_HISTORY SHWHERE ((JH.EMPLOYEE_ID = E.EMPLOYEE_ID)AND(SH.EMPLOYEE_ID = JH.EMPLOYEE_ID))AND (JOB_END IS NULL)AND (SALARY_END IS NULL);<strong>Oracle</strong> <strong>Rdb7</strong> Guide to Database Design and Definition<strong>Oracle</strong> <strong>Rdb7</strong> Guide to Database Performanceand Tuning16.6 I/O 1 1 1 1 ■1 16-33


16.6 I/O ■1 I/O I/O 2 16-116-34EMPLOYEES 2 dbkey dbkey 2 16-1 Set the flag to indicate that EMPLOYEE_ID is invalid and initializeother parameters.Perform VERIFY_EMPLOYEE section until a valid EMPLOYEE_ID is obtained.Perform UPDATE_EMPLOYEES section.VERIFY_EMPLOYEE section:Prompt the user for EMPLOYEE_ID value to determine which employee rowneeds an update.Verify that input characters represent a valid string for an employeeidentification number; prompt again if necessary.SET TRANSACTION READ WRITE RESERVING EMPLOYEES FOR SHARED READCheck the status parameter to ensure that the transaction startedsuccessfully; if not:Handle deadlock and lock conflict with timed retry of the16-34 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


16.6 I/O SET TRANSACTION statement, orStop the program with appropriate messages for other errors.Select the row in the EMPLOYEES table that has the input ID number.Check the status parameter to ensure that the operation was successful;if not:Handle deadlock and lock conflict with the ROLLBACK statement andthe timed retry of the SET TRANSACTION statement and row retrieval,or display messages, roll back, and stop the program forunexpected errors.If no row is found:Roll back.Tell the user that the entered employee number is not assignedto any employee and to enter a new value.If row is found:Set a predefined flag to indicate the EMPLOYEE_ID exists.Store the dbkey value for the row in a parameter.Store the row in the first of three identical sets of programparameters.Roll back.Display the row values stored in the parameters on the terminal.UPDATE_EMPLOYEES section:Prompt for change values and store them in the second set of parametersfor the row.Verify that valid characters are entered for all entries and promptfor corrections if necessary.SET TRANSACTION READ WRITE RESERVING EMPLOYEES FOR SHARED WRITECheck the status parameter to ensure that the transaction startedsuccessfully; if not:Handle deadlock or lock conflict with timed retry of theSET TRANSACTION statement, orStop the program with appropriate messages for other errors.Retrieve the row by the dbkey value and store it in the third setof parameters for the row.If no row found:Roll back.Tell the user that the row was unexpectedly deleted byanother user.Exit the program or loop.If row is found:Compare the values in the first and third sets of parametersto determine if another user has changed row.If yes:Roll back.Tell the user that an unexpected change occurred to the row.Stop the program.If no:Update the row, setting column values to those input by the 16-35


16.6 I/O user.Check the status parameter to ensure that the operation wassuccessful; if not:Handle lock conflict or deadlock with ROLLBACK andtimed retry of the entire transaction.Stop the program for unexpected errors.COMMIT 16-216-36JOB_HISTORY 16-116-34 / I/O 16-2 Perform INITIALIZE_FLAGS section.Perform VERIFY_EMPLOYEE section until a valid EMPLOYEE_ID is obtained.Perform VERIFY_ROW_VALUES section until valid SUPERVISOR_ID, JOB_CODE,and DEPARTMENT_CODE values are obtained.Perform UPDATE_JOB_HISTORY section.INITIALIZE_FLAGS section:Initialize all flags to indicate "invalid". (Flags are set to "valid"when values input by the user have passed program checks.)VERIFY_EMPLOYEE section:Prompt the user for the EMPLOYEE_ID value to determine for whichemployee the job history information needs an update.Verify that input characters represent a valid string for anemployee identification number; prompt again if necessary.SET TRANSACTION READ WRITE RESERVING EMPLOYEES FOR SHARED READCheck the status parameter to ensure that the transaction startedsuccessfully; if not:Handle deadlock and lock conflict with timed retry.Stop the program for unexpected errors.Select the row in the EMPLOYEES table that has the input ID number.Check the status parameter to ensure that the operation was successful;if not:Handle deadlock and lock conflict with ROLLBACK and timedretry of the statement.Roll back.Stop the program for unexpected errors.If no row is found:Roll back.Tell the user that the entered employee ID number is not yetassigned to any employee in the database; therefore, no update16-36 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


16.6 I/O to the JOB_HISTORY table using that number is allowed.If a row is found:Set a predefined flag to indicate EMPLOYEE_ID exists.Perhaps display the employee ID number and name for the user.Roll back.VERIFY_ROW_VALUES section:Prompt for the JOB_START date and for any of the following valueswhose associated flag is set to "invalid":JOB_CODE, DEPARTMENT_CODE, SUPERVISOR_ID.Verify that valid characters have been entered for first or revisedentries.Prompt for corrections if necessary.If the flag for SUPERVISOR_ID is set to "invalid":SET TRANSACTION READ WRITERESERVING EMPLOYEES FOR SHARED READCheck the status parameter to ensure that the transactionstarted successfully; if not:Handle deadlock and lock conflict with timed retry ofthe SET TRANSACTION statement.Stop the program for unexpected errors.Select the row in the EMPLOYEES table that has theinput supervisor ID.Check the status parameter to ensure that the operation wassuccessful; if not:Handle deadlock and lock conflict with ROLLBACK andtimed retry of the statement.Stop the program for unexpected errors.If a row is found, roll back and set the predefined flagto indicate that the SUPERVISOR_ID is valid.If no row is found, roll back.If the flag for DEPARTMENT_CODE is set to "invalid":SET TRANSACTION READ WRITERESERVING DEPARTMENTS FOR SHARED READCheck the status parameter to ensure that the transactionstarted successfully; if not:Handle deadlock and lock conflict with timed retry ofthe SET TRANSACTION statement.Stop the program for unexpected errors.Select the row in the DEPARTMENTS table that has the inputdepartment code.Check the status parameter to ensure that the operation wassuccessful; if not:Handle deadlock or lock conflict with ROLLBACK andtimed retry of the statement.Stop the program for unexpected errors.If a row is found:Roll back. 16-37


16.6 I/O Set the predefined flag to indicate that DEPARTMENT_CODEis valid.If no row is found, roll back.If the flag for JOB_CODE is set to "invalid":SET TRANSACTION READ WRITE RESERVING JOBS FOR SHARED READCheck the status parameter to ensure that the transactionstarted successfully; if not:Handle deadlock and lock conflict with timed retry ofthe SET TRANSACTION statement.Stop the program for unexpected errors.Select the row in the JOBS table that has the input job codevalue.Check the status parameter to ensure that the operation wassuccessful; if not:Handle deadlock and lock conflict with ROLLBACK andtimed retry of the statement.Stop the program for unexpected errors.If a row is found:Roll back.Set a predefined flag to indicate that JOB_CODE isvalid.If no row is found, roll back.If any flag indicates an input code or ID is still "invalid":Display messages that specify input values that failedverification checks.UPDATE_JOB_HISTORY section:SET TRANSACTION READ WRITERESERVING EMPLOYEES FOR SHARED READ,JOBS FOR SHARED READ,DEPARTMENTS FOR SHARED READ,JOB_HISTORY FOR SHARED WRITECheck the status parameter to ensure that the transaction startedsuccessfullu; if not:Handle deadlock and lock conflict with timed retry ofthe SET TRANSACTION statement.Stop the program for unexpected errors.Update the current JOB_HISTORY row where EMPLOYEE_ID is equal tothe input value for EMPLOYEE_ID and where JOB_END is null,setting JOB_END equal to the value input for JOB_START.Check the status parameter to ensure that the operation was successfulor a row was not found (an acceptable condition for newly hiredemployees); if not:Handle lock conflict and deadlock with ROLLBACK and timedretry of the statement.Roll back and stop the program for unexpected errors.Insert into the JOB_HISTORY table a new row using all input valuesand setting JOB_END to null.16-38 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


16.7 Check the status parameter to ensure that the operation was successful;if not:Handle lock conflict and deadlock with ROLLBACK and timedretry of the statement.Roll back and stop the program for unexpected errors.COMMITCheck the status parameter to ensure that the COMMIT was successful;if not:Display a message saying an unexpected error occurred.Roll back and stop the program. 16-216-36 / / 16.7 <strong>Oracle</strong> Rdb ■■■ SQL 1 16-39


16.7 16.7.1 16-4016.7.1 ■■DECLARE TRANSACTION SETTRANSACTION EVALUATE ■■■SQL /SQLOPTIONS=(CONSTRAINT=IMMEDIATE|DEFERRED) -s -'cmimmediate|deferred' SQLOPTIONS=(CONSTRAINT=IMMEDIATE) -s -'cm immediate' SET ALL CONSTRAINTSDEFERRED SQL CONSTRAINT=IMMEDIATE|DEFERRED -cm immediate|deferred CONSTRAINT=IMMEDIATE -cm immediate' SET ALL CONSTRAINTS DEFERRED SET ALL CONSTRAINTS SET ALL CONSTRAINTS IMMEDIATE SET ALL CONSTRAINTS DEFERRED ■■■NOT DEFERRABLE SET DEFAULT CONSTRAINT MODE SET ALLCONSTRAINTS SQL SETTRANSACTION EVALUATING NOT DEFERRABLE <strong>Oracle</strong> Rdb DEFERRABLE ON SET TRANSACTION EVALUATE AT VERB TIME COMMIT NOT DEFERRABLE DEFERRABLE <strong>Oracle</strong> Rdb COMMIT 16-40 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


16.7 COMMIT DEFERRABLE NOTDEFERRABLE ■■ DEFERRABLE <strong>Oracle</strong> Rdb COMMIT COMMIT COMMIT SQL COMMIT <strong>Oracle</strong> Rdb SQLV40 DEFERRABLE SQL92 NOT DEFERRABLE 16.7.2 <strong>Oracle</strong> Rdb ■■ 1 <strong>Oracle</strong> Rdb 16-41


16.8 <strong>Oracle</strong> Rdb <strong>Oracle</strong> Rdb ■ 2 MIN (A.NUMBER) > MAX (B.NUMBER)<strong>Oracle</strong> Rdb A B ■■ 1 A B B A ANSI/ISO SQL SET ALL CONSTRAINTS OFF 16.8 COMMIT ROLLBACK <strong>Oracle</strong> Rdb COMMIT ROLLBACK COMMIT ROLLBACK personnel SET TRANSACTION EMPLOYEES / 16-42 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


16.8 <strong>Oracle</strong> Rdb Recovery-unit .rujRecovery-unit <strong>Oracle</strong> Rdb Recovery-unit <strong>Oracle</strong> Rdb Recovery-unit UPDATE EMPLOYEES 16-616-43 16-6 Recovery-unit .rujpersonnel.ruj 1 2 3 1 2 3 ...Recovery-unit 1 2 3 1 2 3...EMPLOYEESpersonnelNU-2113A-RACOMMIT EMPLOYEES <strong>Oracle</strong>Rdb Recovery-unit ROLLBACK EMPLOYEES SQL Recovery-unit SQL EMPLOYEES Recovery-unit SQL 1 16-43


16.8 SQL OpenVMS ROLLBACK SQLSQL SQL EXIT SQL COMMIT C ompa q Tru64 UNIXCompaq Tru64 UNIX SQL <strong>Oracle</strong> Rdb OpenVMS SQL ■■■OpenVMS [Ctrl]+[Y] DCL STOP ■■1 After-image ALTER DATABASE Recovery-unit I/O 16-44 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


17SQL SQL SQL <strong>Oracle</strong> Rdb 1 SQL ■■■■■SQL 17-1


17.1 17.1 SQL 2 SQL SQL 17-117-21 17-1 SQL SQLSQL SQL SQL1 <strong>Oracle</strong> Rdb 17.1.1 SQL SQL SQL ■ SQL ■ SQL SQL SQL 17.1.2 17-317.1.3 17-4 SQL SQL SQL 17-2 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


17.1 1 SQL SQL SQL SQL SQLSQL SQL 2 ■■ SQL SQL SQL SQL SQL SQL SQL SQL 1 17.1.2 SQL 1 ■■■1 1 DECLARE ALIAS 17-117-4 SQL 2 17-3


17.1 17-1 SQL EXEC SQL DECLARE ALIAS FILENAME personnel;EXEC SQL DECLARE ALIAS_CORP ALIAS FILENAME corporate;personnel corporate 2 SQL DECLARE ALIAS SQL RDB$DBHANDLE DECLARE ALIAS SQL SQL SQL SQL DECLARE ALIAS DECLARE ALIAS SQL SQL SQL 17.1.3 1 ■■ SQL 17-217-4 2 17-2 RDB$DBHANDLEALIAS_CORPpersonnelcorporateNU-2385A-RA17-4 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


17.2 personnel RDB$DBHANDLE corporate ALIAS_CORP SQL SQL SQL SQL SQL 17.2 17-5 CONNECT 17.2 SQL 3 17-117-5CONNECTSET CONNECTDISCONNECT 17-1 SQL SQL CONNECTSET CONNECTDISCONNECTSET CONNECT DISCONNECT SQL 17.2.1 17-517.2.5 17-917.2.6 17-1017.2.1 CONNECT SQL CONNECT SET CONNECT CONNECT SET CONNECT 17-5


17.2 17.2.2 17-617.2.3 17-717.2.4 17-8CONNECT 17.2.5 17-917.2.2 CONNECT DEFAULT AS AS 3 CONNECT ■ CONNECT 3 2 CONNECT CONNECT TO 'ALIAS RDB$DBHANDLE, ALIAS ALIAS_CORP' AS 'OTHER';■DEFAULT AS DEFAULT CONNECT TO 'DEFAULT' AS 'OTHER';■AS CONNECT AS CONNECT AS 'OTHER';SQL CONNECT 17-317-7 OTHER 17-6 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


17.2 17-3 :RDB$DBHANDLE:ALIAS_CORPpersonnelcorporate:RDB$DBHANDLE:ALIAS_CORPpersonnelcorporateNU-2386A-RA17.2.3 2 CONNECT TO 'FILENAME personnel_west,ALIAS ALIAS_CORP FILENAME corporate_west' AS 'DEFAULT_WEST';personnel personnel_west corporate corporate_west CONNECT 17-417-8 17-7


17.2 17-4 :RDB$DBHANDLE:ALIAS_CORPpersonnelcorporateDEFAULT_WEST:RDB$DBHANDLE:ALIAS_CORPpersonnel_westcorporate_westNU-2387A-RA17.2.4 CONNECT ATTACH 17-517-9 CONNECT ATTACH CONNECT TO 'ALIAS RDB$DBHANDLE, ALIAS ALIAS_CORP,ATTACH ALIAS ALIAS_CUST FILENAME customers' AS 'AT_RUN_TIME';17-8 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


17.2 17-5 :RDB$DBHANDLE:ALIAS_CORPpersonnelcorporateAT_RUN_TIME:RDB$DBHANDLE:ALIAS_CORP:ALIAS_CUSTpersonnel corporate customersNU-2388A-RA17.2.5 CONNECT SQL 2 SETCONNECT ■■SET CONNECT connection-nameSET CONNECT DEFAULTSET CONNECT SQL SET CONNECT 17-9


17.3 17.2.6 DISCONNECT DISCONNECT■■■■■■1 SQL DISCONNECT DISCONNECT■■■■DISCONNECT ALL DISCONNECT DEFAULT DISCONNECT CURRENT DISCONNECT connection-name SQL ■■DISCONNECT ALL DISCONNECT ALL ANSI/ISO SQL DISCONNECT ALL COMMIT DISCONNECT CURRENT 17.3 SQL 17-217-11 SQL SET TRANSACTION 17-10 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


17.5 17.4 SQL SQL SQL SQL SQL SQL 17.4.1 SQL CONNECT -conn NOCONNECT -noconn SQL 1 17.4.2 SQL SQLOPTIONS=CONNECT -s ' -conn/SQLOPTIONS=NOCONNECT -s ' -noconn 17.5 SQL 17-217-11 C 17-317-13 1 2 2 / 17-2 SQL -- SQL module that uses connections for two concurrent read/write-- transactions.MODULE CURSOR_LOOPLANGUAGE C 17-11


17.5 AUTHORIZATION JONESPARAMETER COLONSDECLARE ALIAS FILENAME testDECLARE A CURSOR FOR SELECT CITY FROM SWHERE CITY IS NOT NULL-- Connection management routines.-- Create an explicit connection that duplicates the default database-- environment.PROCEDURE CONNECT(SQLCODE,:CONNECT_2 CHAR(31));CONNECT AS :CONNECT_2;-- Switch to the nondefault connection called CONNECT_2.PROCEDURE SET_CONNECT(SQLCODE,:CONNECT_2 CHAR(31));SET CONNECT :CONNECT_2;-- Switch to the default connection.PROCEDURE SET_CONNECT_DEFAULT(SQLCODE);SET CONNECT DEFAULT;-- Disconnect all available connections (CONNECT_2 and DEFAULT).PROCEDURE DISCONNECT(SQLCODE);DISCONNECT ALL;-- Open and fetch row information from cursor A in a read-only transaction.PROCEDURE OPEN_A(SQLCODE);OPEN A;PROCEDURE FETCH_A(SQLCODE,:RET_CITY CHAR(15));FETCH A INTO :RET_CITY;PROCEDURE CLOSE_A(SQLCODE);CLOSE A;-- Update rows that meet a certain program criteria.PROCEDURE UPDATE_P(SQLCODE,:PCITY CHAR(15));UPDATE MYP SET CITY_CODE = 'XXXXX' WHERE CITY = :PCITY;-- Start a read-only transaction for fetching rows.PROCEDURE RO_TXN(SQLCODE);SET TRANSACTION READ ONLY NOWAIT;-- Start a read/write transaction for updating rows.PROCEDURE RW_TXN17-12 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


17.5 (SQLCODE);SET TRANSACTION READ WRITE NOWAIT;-- Commit the update transaction.PROCEDURE COMMIT(SQLCODE);COMMIT; 17-317-13 17-217-11 17-3 C .../* Create the read-only transaction in the default connection. SQLimplicitly creates a default connection when a program executes itsfirst SQL statement.*/RO_TXN( &sqlcode );if (sqlcode != SQLCODE_SUCCESS)goto err;/* Create a second connection to handle update operations. */CONNECT( &sqlcode, updater );if (sqlcode != SQLCODE_SUCCESS)goto err;/* Return to the default connection to read rows. */SET_CONNECT_DEFAULT( &sqlcode );if (sqlcode != SQLCODE_SUCCESS)goto err;/* Open a cursor and read the first row. */OPEN_A( &sqlcode );if (sqlcode != SQLCODE_SUCCESS)goto err;FETCH_A( &sqlcode, city );while (sqlcode == SQLCODE_SUCCESS) {/* Test whether or not values in the row meet program criteria. If criteriais not met, the program loops back to read another row; otherwise itcontinues. */if (strcmp( city, "London ") == 0) {/* Switch to the nondefault connection. */SET_CONNECT( &sqlcode, updater );if (sqlcode != SQLCODE_SUCCESS)goto err;/* Create the read/write transaction for an update operation. */RW_TXN( &sqlcode );if (sqlcode != SQLCODE_SUCCESS)goto err;/* Update the rows that meet the criteria. */UPDATE_P( &sqlcode, city ); 17-13


17.5 if (sqlcode != SQLCODE_SUCCESS)goto err;/* Commit the change. */COMMIT( &sqlcode );if (sqlcode != SQLCODE_SUCCESS)goto err;/* Return to the default connection to read rows. */SET_CONNECT_DEFAULT( &sqlcode );if (sqlcode != SQLCODE_SUCCESS)goto err;}/* Read another row. */FETCH_A( &sqlcode, city );}/* Close cursor A. */CLOSE_A( &sqlcode );if (sqlcode != SQLCODE_SUCCESS)goto err;return;/* Error handling. */err:sql_signal();/* Disconnect all active connections. */DISCONNECT(&sqlcode);EXIT(0);}2 2 17-14 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


VI 6 ■■■SQL


18SQL SQL ■■■■■■■■■ : 11 11-1 SELECT <strong>Oracle</strong> <strong>Rdb7</strong> SQLReference Manual 18-1


18.1 18.1 18.1.1 SQL 1 SQL 1 1 1 ■1 ■ 18-118-2 18-1 4YesNo51236DECLARE EMPLROW CURSOR FORSELECT LAST_NAME, FIRST_NAME, CITYFROM EMPLOYEESLIMIT TO 4 ROWS;.OPENFETCHFETCHFETCHFETCHFETCHCLOSEToliverSmithDietrichKilpatrickAlvinTerryRickJanet()ChocoruaChocoruaBoscawenMarlowNU-2543A-RA18-2 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


18.1 18-118-21. DECLARE CURSOR ■■ EMPLROW 3 4 EMPLROW DECLARE EMPLROW CURSOR FORSELECT LAST_NAME, FIRST_NAME, CITY FROM EMPLOYEES2. OPEN OPEN EMPLROW;SQL FETCH 3. FETCH SQL SQL SQL EMPLROW FETCH EMPLROW;SQL SQL INTO FETCH EMPLROW SQL FETCH EMPLROW INTO :L_NAME_P, :F_NAME_P, CITY_P; 18-3


18.1 FETCH 5 FETCH 5 SQL FETCH SQL 18.7 18-15FETCH 4. "No data" SQLCODE SQLSTATE 5. UPDATE DELETE DELETE 6. CLOSE EMPLROW;sql_close_cursors() 18.3 18-8DISCONNECT 18-4 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


18.1 16 16-1<strong>Oracle</strong> Rdb OPEN : FETCH SQL SQLCAFETCH SQLCA SQLERRD 3<strong>Oracle</strong> <strong>Rdb7</strong> SQL Reference Manual SHOW SQLCA <strong>Oracle</strong> <strong>Rdb7</strong> SQL Reference Manual SQLCA 18.1.2 1 SELECTINSERTUPDATE " " OPEN SQL 18.1.3 ■ DELETE 18-5


18.2 ■11 SELECT INTOSELECT INTO SQL 1 SELECT EMPLOYEE_ID INTO :ID_NUMBER:ID_NUMBER_INDFROM DBH1.EMPLOYEESWHERE EMPLOYEE_ID = :INPUT_IDSELECT LAST_NAME, FIRST_NAME INTO :FULL_NAMEFROM DBH1.EMPLOYEESWHERE EMPLOYEE_ID = :INPUT_ID NULL 2 8 8-1 1 sql_report 18.2 SQL SQL 2 ■■ 18-118-218.4 18-9 LIST OF BYTEVARYING BYTE VARYING CHAR VARCHAR 18.6 18-1318-6 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


18.2 3 ■■■ " " DECLARE CURSOR SELECT SELECT SQL DECLARE CURSOR SELECT SQL SQL SELECT SELECT 18.8 18-17DECLARE CURSOR SELECT SELECT 18.9 18-18SQL ■■■■<strong>Oracle</strong>Rdb SHARED PROTECTEDREAD <strong>Oracle</strong> Rdb EXCLUSIVE <strong>Oracle</strong> Rdb EXCLUSIVE 18-7


18.3 ■■■■18.3 18.1.1 18-2OPEN CLOSE OPEN ■CLOSE ■■■COMMIT ROLLBACK SQL SQL REPEATABLE READ SQL DECLARE CURSOR WITH HOLD 18.5 18-1118-8 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


18.4 18.4 1 1 SQL FETCH 1 ■■■2 FETCH FETCH "no data" "no data" RDB$_STREAM_EOF SQL "%RDB-E-STREAM_EOF, attempt to fetchpast end of record stream." SQLCODE 100SQLSTATE 02000 10 10-1 FETCH "no data" "no data" FETCH INTO 18-118-9 MBMF 18-1 SQL> DECLARE CURRENT_MBMF TABLE CURSOR FOR1> SELECT JOB_CODE, EMPLOYEE_ID, JOB_START FROM JOB_HISTORY2> WHERE (DEPARTMENT_CODE = 'MBMF') AND3> (JOB_END IS NULL)4> ORDER BY JOB_CODE, JOB_START;SQL> --SQL> -- The OPEN statement creates the result table.SQL> --SQL> OPEN CURRENT_MBMF; 18-9


18.4 SQL> --SQL> -- The first FETCH statement retrieves the first row.SQL> --SQL> FETCH CURRENT_MBMF;JOB_CODE EMPLOYEE_ID JOB_STARTAPGM 00174 22-Sep-1981SQL> --SQL> -- Each subsequent FETCH statement retrieves theSQL> -- row positioned next in the result table.SQL> --SQL> FETCH CURRENT_MBMF;JOB_CODE EMPLOYEE_ID JOB_STARTASCK 00165 8-Mar-1981SQL> FETCH CURRENT_MBMF;JOB_CODE EMPLOYEE_ID JOB_STARTDMGR 00227 25-Nov-1981SQL> --SQL> -- The preceding row was the last row in the result table.SQL> -- Another FETCH statement reveals this fact.SQL> --SQL> FETCH CURRENT_MBMF;%RDB-E-STREAM_EOF, attempt to fetch past end of record streamSQL> --SQL> -- The CLOSE statement deletes the result table.SQL> --SQL> CLOSE CURRENT_MBMF;SQL> --SQL> -- However, the cursor declaration remains in effect duringSQL> -- an entire interactive session or program execution cycleSQL> -- unless you disconnect from the session using the DISCONNNECTSQL> -- statement or attach to another database using the same alias.SQL> --SQL> -- Another OPEN statement creates the result table again.SQL> --SQL> OPEN CURRENT_MBMF;SQL> --SQL> -- After the cursor is opened again, the FETCH statement startsSQL> -- data retrieval at the first row in the result table.SQL> --SQL> FETCH CURRENT_MBMF;JOB_CODE EMPLOYEE_ID JOB_STARTAPGM 00174 22-Sep-1981SQL> --SQL> -- If a cursor is already open, an OPEN statement generates anSQL> -- error message.SQL> --SQL> OPEN CURRENT_MBMF;18-10 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


18.5 %SQL-F-CURALROPE, Cursor CURRENT_MBMF was already openSQL> --SQL> -- The next FETCH statement retrieves the next row.SQL> FETCH CURRENT_MBMF;JOB_CODE EMPLOYEE_ID JOB_STARTASCK 00165 8-Mar-1981SQL> --SQL> -- A COMMIT or ROLLBACK statement implicitly executes a CLOSESQL> -- statement, which deletes the result table. An attempt toSQL> -- fetch a row after ending the transaction fails because noSQL> -- result table exists for the cursor declaration.SQL> --SQL> COMMIT;SQL> FETCH CURRENT_MBMF;%SQL-F-CURNOTOPE, Cursor CURRENT_MBMF is not openedSQL> FETCH 2 ■■ / COMMIT ROLLBACK / DISCONNECT DISCONNECT 15.6 15-15 : <strong>Oracle</strong> <strong>Rdb7</strong> Introduction to SQL DISCONNECT 18.5 18-11


18.5 ■■■■WITH HOLD PRESERVE ON COMMIT SQL PRESERVE SQL PRESERVE ON COMMIT <strong>Oracle</strong> Rdb WITH HOLD WITH HOLD PRESERVE ON ROLLBACK SQL WITH HOLD PRESERVE ALL WITH HOLD PRESERVE NONE SET HOLD CURSOR 18-218-12 18-118-9 18-2 SQL> DECLARE CURRENT_MBMF TABLE CURSOR WITH HOLD PRESERVE ON COMMIT FOR1> SELECT JOB_CODE, EMPLOYEE_ID, JOB_START FROM JOB_HISTORY2> WHERE (DEPARTMENT_CODE = 'MBMF') AND3> (JOB_END IS NULL)4> ORDER BY JOB_CODE, JOB_START;SQL> --SQL> OPEN CURRENT_MBMF;SQL> --SQL> -- The first FETCH statement retrieves the first row.SQL> FETCH CURRENT_MBMF;JOB_CODE EMPLOYEE_ID JOB_STARTAPGM 00174 22-Sep-1981SQL> FETCH CURRENT_MBMF;JOB_CODE EMPLOYEE_ID JOB_STARTASCK 00165 8-Mar-1981SQL> --SQL> -- Commit the transaction.SQL> COMMIT;SQL> --SQL> -- Because this is a holdable cursor using the WITH HOLDSQL> -- PRESERVE ON COMMIT clause, the cursor remains open andSQL> -- the row pointer retains its position. The next FETCH18-12 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


18.6 SQL> -- statement reads the next record.SQL> FETCH CURRENT_MBMF;JOB_CODE EMPLOYEE_ID JOB_STARTDMGR 00227 25-Nov-1981SET HOLD CURSOR WITH HOLD SET HOLD CURSORS SET HOLDCURSORS WITH HOLD SQL> SET HOLD CURSORS 'ON COMMIT';18.6 LIST OF BYTE VARYING 1 1 DECLARE CURSOR WHERE CURRENT OF WHERE CURRENTOF FETCH 18-318-13 ID RESUMES RESUME LIST OF BYTE VARYING 18-3 SQL> -- Declare the table cursor.SQL> DECLARE RESUME_CURS TABLE CURSOR FOR1> SELECT EMPLOYEE_ID, RESUME FROM RESUMES;SQL> -- 18-13


18.6 SQL> -- Open the table cursor.SQL> OPEN RESUME_CURS;SQL> --SQL> -- Fetch the first row. The table cursor returns the employee IDSQL> -- and segmented string identifier for the RESUME column.SQL> --SQL> FETCH RESUME_CURS;EMPLOYEE_ID RESUME00164 86:2:4SQL> --SQL> -- To read the contents of the RESUME column, you must declareSQL> -- a list cursor and position it on the row.SQL> --SQL> DECLARE LIST_CURS LIST CURSOR FOR1> SELECT RESUME WHERE CURRENT OF RESUME_CURS;SQL> --SQL> -- Open the list cursor.SQL> OPEN LIST_CURS;SQL> --SQL> -- Fetch the first segment of the list. Remember thatSQL> -- the table cursor is already opened and positioned onSQL> -- the row containing employee ID 00164.SQL> FETCH LIST_CURS;RESUMEThis is the resume for Alvin ToliverSQL> --SQL> -- Fetch the remaining segments of the list.SQL> FETCH LIST_CURS;RESUMEBoston, MASQL> FETCH LIST_CURS;RESUME<strong>Oracle</strong> CorporationSQL> FETCH LIST_CURS;RESUME%RDB-E-STREAM_EOF, attempt to fetch past end of record streamSQL> --SQL> -- To move to the next row, first close the list cursor, thenSQL> -- fetch the next table row.SQL> --SQL> CLOSE LIST_CURS;SQL> FETCH RESUME_CURS;EMPLOYEE_ID RESUME00165 86:2:8SQL> --SQL> -- Open the list cursor.SQL> OPEN LIST_CURS;18-14 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


18.7 SQL> -- Fetch the first segment of the list for employee 00165.SQL> FETCH LIST_CURS;RESUMEThis is the resume for Terry SmithSQL> --SQL> -- Close the cursors.SQL> CLOSE LIST_CURS;SQL> CLOSE RESUME_CURS;18.7 1 DECLARE BCURSOR SCROLL LIST CURSORFOR SELECT RESUME WHERE CURRENT OF ACURSOR;FETCH SCROLL ■■■■■■FETCH NEXTFETCH PRIORFETCH FIRSTFETCH LASTFETCH RELATIVE simple-value-expressionFETCH ABSOLUTE simple-value-expressionsimple-value-expression <strong>Oracle</strong> <strong>Rdb7</strong> SQLReference Manual 18-418-15 SQL C 18-4 .../* Declare a table cursor. */EXEC SQL DECLARE ONE TABLE CURSORFOR SELECT EMPLOYEE_ID, RESUME FROM RESUMESWHERE EMPLOYEE_ID = :sel_emp_id ; 18-15


18.7 EXEC SQL DECLARE TWO READ ONLY SCROLL LIST CURSORFOR SELECT RESUMEWHERE CURRENT OF ONE;EXEC SQL OPEN ONE;dump_error();EXEC SQL FETCH ONE INTO :emp_id, blob;dump_error();EXEC SQL OPEN TWO;dump_error();EXEC SQL FETCH LAST FROM TWO INTO :seg2;printf("Segment returned: %s¥n", seg2 );dump_error();EXEC SQL FETCH NEXT FROM TWO INTO :seg2;printf("Segment returned: %s¥n", seg2 );dump_error();EXEC SQL FETCH FIRST FROM TWO INTO :seg2;printf("Segment returned: %s¥n", seg2 );dump_error();EXEC SQL FETCH NEXT FROM TWO INTO :seg2;printf("Segment returned: %s¥n", seg2 );dump_error();EXEC SQL FETCH NEXT FROM TWO INTO :seg2;printf("Segment returned: %s¥n", seg2 );dump_error();EXEC SQL FETCH NEXT FROM TWO INTO :seg2;printf("Segment returned: %s¥n", seg2 );dump_error();EXEC SQL FETCH NEXT FROM TWO INTO :seg2;printf("Segment returned: %s¥n", seg2 );dump_error();EXEC SQL FETCH FIRST FROM TWO INTO :seg2;printf("Segment returned: %s¥n", seg2 );dump_error();EXEC SQL FETCH LAST FROM TWO INTO :seg2;printf("Segment returned: %s¥n", seg2 );dump_error();EXEC SQL FETCH PRIOR FROM TWO INTO :seg2;printf("Segment returned: %s¥n", seg2 );dump_error();EXEC SQL FETCH ABSOLUTE 1 FROM TWO INTO :seg2;printf("Segment returned: %s¥n", seg2 );dump_error();two_s = 2;EXEC SQL FETCH ABSOLUTE :two_s FROM TWO INTO :seg2;printf("Segment returned: %s¥n", seg2 );dump_error();two_l = 2;18-16 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


18.8 EXEC SQL FETCH ABSOLUTE :two_l FROM TWO INTO :seg2;printf("Segment returned: %s¥n", seg2 );dump_error();...18.8 SQL SELECT SQL SELECT DECLARE CURSOR SELECT PREPARE 18-518-17 SQL 18-5 -- This module uses dynamic cursors to fetch rows one at a time.--MODULEC_MOD_DYN_CURSLANGUAGE GENERALAUTHORIZATION RDB$DBHANDLEPARAMETER COLONSDECLARE ALIAS FILENAME personnel-- Declare the dynamic cursor. Use a statement name to identify-- a prepared SELECT statement.DECLARE CURSOR1 CURSOR FOR STMT_NAME-- Prepare the statement from a statement entered at run time.-- Specify that SQL write information about the number and-- data type of select list items to the SQLDA.PROCEDURE PREP_STMT(SQLCODE,:COMMAND_STRING CHAR (256));PREPARE STMT_NAME FROM :COMMAND_STRING;PROCEDURE DESCRIBE(SQLCODE,SQLDA);DESCRIBE STMT_NAME SELECT LIST INTO SQLDA;PROCEDURE OPEN_CURSOR(SQLCODE); 18-17


18.9 OPEN CURSOR1;PROCEDURE FETCH_CURSOR(SQLCODE,SQLDA);FETCH CURSOR1 USING DESCRIPTOR SQLDA;PROCEDURE CLOSE_CURSOR(SQLCODE);CLOSE CURSOR1;PROCEDURE ROLLBACK(SQLCODE);ROLLBACK; SQL 11 11-118.9 SQL SELECT SELECT DECLARE CURSOR SELECT PREPARE 18-618-18 SQL 18-6 ---- This module uses extended dynamic cursors to fetch rows one at a time.--MODULEMOD_C_EXTDYN_CURSLANGUAGE CAUTHORIZATION RDB$DBHANDLEPARAMETER COLONSDECLARE ALIAS FILENAME personnel-- Prepare the statement from a statement entered at run time.PROCEDURE PREP_STMT(SQLCODE,:STMTID INTEGER,:COMMAND_STRING CHAR (256),SQLDA);PREPARE :STMTID FROM :COMMAND_STRING;-- Specify that SQL write information about the number and-- data type of select list items to the SQLDA.PROCEDURE DESCRIBE18-18 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


18.9 (SQLCODE,:STMTID INTEGER,SQLDA);DESCRIBE :STMTID SELECT LIST INTO SQLDA;-- Declare an extended dynamic cursor.PROCEDURE DEC_CUR_FROM_STMT(SQLCODE,:CURSOR_NAME CHAR(32),:STMTID INTEGER );DECLARE :CURSOR_NAME CURSOR FOR :STMTID;PROCEDURE OPEN_CURSOR_NAME(SQLCODE,:CURSOR_NAME CHAR(32));OPEN :CURSOR_NAME;PROCEDURE FETCH_CURSOR_NAME(SQLCODE,:CURSOR_NAME CHAR(32),SQLDA);FETCH :CURSOR_NAME USING DESCRIPTOR SQLDA;PROCEDURE CLOSE_CURSOR_NAME(SQLCODE,:CURSOR_NAME CHAR(32));CLOSE :CURSOR_NAME;PROCEDURE ROLLBACK(SQLCODE);ROLLBACK; SQL 11 11-1 18-19


18.9 18-20 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


19■■■■■■ 19-1


19.1 19.1 SQL INSERT INSERT 19.2 19-2<strong>Oracle</strong> <strong>Rdb7</strong> Guide toDatabase Design and Definition"sql_load" 19.2 INSERT INSERT 2 ■■INSERT...VALUESINSERT...SELECTINSERT...VALUES 1 INSERT...SELECT 1 19.2.1 INSERT...VALUES INSERT INSERT...VALUES VALUES VALUES 19-119-2 sql_load_employees.sc EMPLOYEES 19-1 C .../*In the INSERT statement, the list of names in the VALUES clause correspondsto the host variables containing the values. The list of names that followsthe INSERT clause names the columns in the table that are to be inserted.*/EXEC SQL-- Insert the row.19-2 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


19.2 INSERT INTO EMPLOYEES(EMPLOYEE_ID, LAST_NAME, FIRST_NAME, MIDDLE_INITIAL,ADDRESS_DATA_1, CITY, STATE, POSTAL_CODE, SEX, BIRTHDAY,STATUS_CODE)VALUES(:emp_id, :last, :first, :middle:middle_ind,:address, :city, :state, :zip, :sex,:date_out, :status);... NULL NULL 19-119-2 MIDDLE_INITIAL NULLNULL SQL NULL 8.10 8-1819.2.2 INSERT...SELECT INSERT 2 INSERT...SELECT INSERT SQL SQL INSERT ■■ INSERT UNION 1 19-3


19.3 ■■<strong>Oracle</strong> Rdb <strong>Oracle</strong> Rdb "what if" 1 INSERT ■■SET TRANSACTION EXCLUSIVE WRITE 19.3 LIST OF BYTE VARYING DECLARE CURSOR FROM DECLARE CURSOR WHERE CURRENT OF WHERE CURRENT OF 18.6 18-1319-4 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


19.4 FETCH SQL sql_resumes 19.4 UPDATE UPDATE ■■■UPDATE UPDATE UPDATE...RETURNING : <strong>Oracle</strong> <strong>Rdb7</strong> SQL Reference ManualUPDATE DECLARE CURSOR CREATE VIEW FETCH INTO 19.4.1 UPDATE 1 UPDATE SET UPDATE UPDATE table-or-view-name SET list-of-column-assignmentsWHERE condition(s)-identifying-row(s)-to-be-modified ;UPDATE WHERE JOB_HISTORY ID SQL EXEC SQL UPDATE JOB_HISTORY SET JOB_END = :BINTIMOUTWHERE EMPLOYEE_ID = :ID-NUMBERAND JOB_END IS NULL; 19-5


19.4 ...EXEC SQL UPDATE SALARY_HISTORY SET SALARY_END = :BINTIMOUTWHERE EMPLOYEE_ID = :ID-NUMBERAND SALARY_END IS NULL;...19.4.2 UPDATE UPDATE UPDATE DECLARE cursor-name CURSOR FORselect-expressionFOR UPDATE OF list-of-columns-to-be-modified ;OPEN cursor-name;-+FETCH cursor name;| Repeat FETCH andUPDATE table-or-view-name| UPDATE statementsSET list-of-column-assignments | to change eachWHERE CURRENT OF cursor-name ; | row in the cursor.-+ FOR UPDATE FOR UPDATE FOR UPDATE SQL DECLARE CURSOR SELECT SELECT ANSI/ISO SQL <strong>Oracle</strong> Rdb DECLARE CURSOR WHERE 1 19-219-6 SQL UPDATE C sql_terminate.sc 19-2 C 19-6 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


19.4 /* ABSTRACT:** This program demonstrates the use of a cursor to fetch and update* rows in the database using the C precompiler.** This program prompts the operator for the employee ID and termination* date of an employee, until the operator asks to exit. It uses* the employee ID to check for the employee by opening a cursor* and fetching the employee row. If the employee is found in the* database, it updates three tables with the employee's status and* termination date. Then, it commits the transaction and prompts* the operator for the next request.*/.../* Declare the cursor to be used for fetching employee records. */EXEC SQL DECLARE EMPLROW CURSOR FORSELECT EMPLOYEE_ID, STATUS_CODE FROM EMPLOYEESWHERE EMPLOYEE_ID = :employee_id;.../* Open the cursor that had been previously declared. */EXEC SQL OPEN EMPLROW;.../* Fetch a row from the opened cursor. */EXEC SQL FETCH EMPLROW INTO :e_id, :status_code;.../* Update the EMPLOYEES table. */EXEC SQL UPDATE EMPLOYEESSET STATUS_CODE = '0'WHERE CURRENT OF EMPLROW;...19.4.3 UPDATE...RETURNING UPDATE...RETURNING 1 19-7


19.5 dbkey dbkey UPDATE dbkey EXEC SQL UPDATE JOB_HISTORYSET JOB_END = :BINTIMOUTWHERE EMPLOYEE_ID = :ID-NUMBERAND JOB_END IS NULLRETURNING DBKEY INTO :TERM_DBKEY;dbkey DBKEY ROWID RETURNING dbkey EXEC SQL UPDATE ACCOUNTSET AMOUNT = AMOUNT + :TXNWHERE ACCOUNT_NUMBER = :ACCNUMRETURNING AMOUNT INTO :NEW_AMOUNT;19.5 DELETE DELETE DELETE DELETE FROM EMPLOYEESWHERE EMPLOYEE_ID = '00164';DELETE CURRENT OF DELETE -- Declare the cursor.DECLARE DEL_CURSOR CURSOR FORSELECT DEPARTMENT_CODE, DEPARTMENT_NAMEFROM DEPARTMENTS;OPEN DEL_CURSOR;-- Fetch the row.FETCH DEL_CURSOR;-- Delete the current row.DELETE FROM DEPARTMENTS WHERE CURRENT OF DEL_CURSOR;19-8 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


19.7 FOR UPDATE DECLARE CURSOR SELECT SELECT ANSI/ISO SQL <strong>Oracle</strong> Rdb DECLARECURSOR WHERE 1 : DELETE <strong>Oracle</strong> <strong>Rdb7</strong> SQL Reference ManualSQL 19.6 LIST 19-319-9 NULL 19-3 SQL> -- Set the list column, RESUME, to NULLSQL> UPDATE RESUMES1> SET RESUME = NULL2> WHERE EMPLOYEE_ID ='00164';1 row updatedSQL> select * from resumes;EMPLOYEE_ID RESUME00164 NULL00165 86:2:800166 86:2:123 rows selected19.7 1 <strong>Oracle</strong> <strong>Rdb7</strong>Guide to Database Design and DefinitionCURRENT_TIMESTAMP 19-9


19.7 19-10 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


20<strong>Oracle</strong> Rdb <strong>Oracle</strong> Rdb SQL ANSI/ISO SQL SQL <strong>Oracle</strong> Rdb ■■■SQL SQL : SQL ■■<strong>Oracle</strong> <strong>Rdb7</strong> SQL Reference Manual SQL SQL <strong>Oracle</strong> <strong>Rdb7</strong> Guide to Database Design and Definitioncorporate_data 20-1


20.1 20.1 SQL <strong>Oracle</strong> Rdb ■■ 1 RDB$SCHEMA 1 RDB$CATALOG 1 RDB$CATALOG 1 RDB$SCHEMA 1 1 20-120-2 20-1 SQL CBACBA.. . . . . . . . ......NU-2243A-RACREATE DATABASE ALTER DATABASE MULTISCHEMA IS ON <strong>Oracle</strong> Rdb SQL 1 20-2 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


20.2 SQL 20.2 SQL SQL 20.2.1 SQL <strong>Oracle</strong> Rdb 1 1 SQL SQL 20-120-3 20-1 SQL RDB$CATALOGAUTHORIZATION SQL ALIAS SCHEMA SQL RDB$CATALOG CATALOG 20-3


20.2 SQL RESTRICT RIGHTS SQL ANSI/ISO SQL RIGHTS INVOKERSQL 20.2.2 SQL C 20-120-4SQL sql_msdb_mod.sqlmod samples 20-1 SQL ---------------------------------------------------------------------------- This module shows how to use SQL module language when working with a-- multischema database and using multischema naming conventions. The-- C program sql_msdb.c with which this module is linked uses the sample-- multischema database corporate_data.---------------------------------------------------------------------------- Header Information Section--------------------------------------------------------------------------MODULE sql_msdb_mod -- Module nameLANGUAGE C -- Language of calling programCATALOG ADMINISTRATION -- Set default catalog (1)20-5SCHEMA PERSONNEL -- Set default schema (2)20-5PARAMETER COLONS -- Require colons before parameter names---------------------------------------------------------------------------- DECLARE Statements Section--------------------------------------------------------------------------DECLARE ALIAS FILENAME corporate_data -- Declare the database.-- Declare table cursor for the DEPARTMENTS table in the ACCOUNTING schema.DECLARE DEPT_CURSOR TABLE CURSOR FORSELECT DEPARTMENT_CODE, DEPARTMENT_NAME, MANAGER_IDFROM ACCOUNTING.DEPARTMENTS (3)20-6ORDER BY DEPARTMENT_CODE-- Declare table cursor for the EMPLOYEES table in the PERSONNEL schema.DECLARE EMP_CURSOR TABLE CURSOR FORSELECT E.EMPLOYEE_ID, E.LAST_NAME, E.FIRST_NAMEFROM EMPLOYEES E, JOB_HISTORY JH (4)20-6WHERE E.EMPLOYEE_ID = JH.EMPLOYEE_IDAND JH.DEPARTMENT_CODE = :DEPT_CODEAND JH.JOB_END IS NULLORDER BY E.LAST_NAME---------------------------------------------------------------------------- Procedure Section20-4 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


20.2 SQL --------------------------------------------------------------------------(5)20-6-- Opens the cursor declared for the DEPARTMENTS table.PROCEDURE OPEN_DEPT_CURSOR(SQLCODE);OPEN DEPT_CURSOR;-- Opens the cursor declared for the EMPLOYEES table.PROCEDURE OPEN_EMP_CURSOR(SQLCODE,:DEPT_CODE CHAR(4));OPEN EMP_CURSOR;-- Fetches data from the opened cursor for the DEPARTMENTS table.PROCEDURE FETCH_DEPT_DATA(SQLCODE,:DEPT_CODE CHAR(4),:DEPT_NAME CHAR(20),:DEPT_MAN_ID CHAR(5));FETCH DEPT_CURSOR INTO:DEPT_CODE, :DEPT_NAME, :DEPT_MAN_ID;-- Fetches data from the opened cursor for the EMPLOYEES table.PROCEDURE FETCH_EMP_DATA(SQLCODE,:EMP_IDCHAR(5),:EMP_LAST_NAME CHAR(20),:EMP_FIRST_NAME CHAR(20));FETCH EMP_CURSOR INTO:EMP_ID, :EMP_LAST_NAME, :EMP_FIRST_NAME;-- Closes the DEPT_CURSOR cursor for the DEPARTMENTS table.PROCEDURE CLOSE_DEPT_CURSOR(SQLCODE);CLOSE DEPT_CURSOR;-- Closes the EMP_CURSOR cursor for the EMPLOYEES table.PROCEDURE CLOSE_EMP_CURSOR(SQLCODE);CLOSE EMP_CURSOR; 20-120-4(1) CATALOG CATALOG RDB$CATALOG ADMINISTRATION ACCOUNTING PERSONNEL (2) SCHEMA 20-5


20.3 SQL AUTHORIZATION SQL"%SQL-F-SCHNOTDEF, Schema SCHWARTZ is not defined." SQL (3) ACCOUNTING DEPARTMENTS ACCOUNTING PERSONNEL ACCOUNTING DEPARTMENTS DEPARTMENTS SQL PERSONNEL DEPARTMENTS MANAGER_ID (4) PERSONNEL EMPLOYEES JOB_HISTORY PERSONNEL (5) samples 20-120-4C SQL corporate_data SQL C SQL SQL ANSI/ISO SQL SQL FLAG_NONSTANDARD -std SQL SQL <strong>Oracle</strong> <strong>Rdb7</strong> SQLReference Manual20.3 SQL SQL samples sql_msdb_pre.sc 20-6 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


20.3 SQL 20.3.1 SQL SQL DECLARE MODULE 20-220-7SQL 20-2 SQL RDB$DBHANDLERDB$CATALOG■■■RDB$DBHANDLE RDB$DBHANDLE 1 1 SQL DECLARE MODULE RIGHTS SQL ANSI/ISO SQL RIGHTS RESTRICTED SQL SQL SQL RIGHTS INVOKER RDB$CATALOGSQL RDB$CATALOGRDB$SCHEMA <strong>Oracle</strong> Rdb 20-7


20.3 SQL ■RDB$SCHEMA DECLARE MODULE SCHEMA CATALOG 20.3.2 20-220-8 C 20-2 C /* ABSTRACT:This sample precompiled C program lists the employees assigned toeach department defined in the sample multischema corporate_datadatabase. */#include main(){/* Declare return status variable for error handling. */int SQLCODE;/* Declare module to specify SQL standard dialect, including quoting rules. */EXEC SQL DECLARE MODULE SQL_MODULEDIALECT SQL92; (1)20-9/* Variables for program use. */char emp_id[6],emp_last_name[21],emp_first_name[21],dept_name[21],dept_code[5],dept_man_id[6];/* Declare the corporate_data database. */EXEC SQL DECLARE ALIAS FILENAME corporate_data; (2)20-9/* Declare the cursor for the DEPARTMENTS table. */EXEC SQL DECLARE DEPT_CURSOR TABLE CURSORFOR SELECTDEPARTMENT_CODE, DEPARTMENT_NAME, MANAGER_ID FROM20-8 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


20.3 SQL "RDB$DBHANDLE.ADMINISTRATION".ACCOUNTING.DEPARTMENTS (3)20-9ORDER BY DEPARTMENT_CODE;/* Declare the cursor for the EMPLOYEES table. */EXEC SQL DECLARE EMP_CURSOR TABLE CURSORFOR SELECTE.EMPLOYEE_ID, E.LAST_NAME,E.FIRST_NAME FROM"RDB$DBHANDLE.ADMINISTRATION".PERSONNEL.EMPLOYEES E,"RDB$DBHANDLE.ADMINISTRATION".PERSONNEL.JOB_HISTORY JHWHERE E.EMPLOYEE_ID = JH.EMPLOYEE_IDAND JH.DEPARTMENT_CODE = :dept_codeAND JH.JOB_END IS NULLORDER BY E.LAST_NAME;/* Print the report title. */printf("%20s DEPARTMENT EMPLOYEE LISTING¥n¥n"," ");/* Open the DEPARTMENTS cursor. */EXEC SQL OPEN DEPT_CURSOR;while (1){/* Fetch the department data. */EXEC SQL FETCH DEPT_CURSOR INTO:dept_code,:dept_name,:dept_man_id;... 20-220-8(1) DECLARE MODULE DIALECT ANSI/ISO ANSI/ISO SQLSQL92SQL "dialect SQLV40 (2) MULTISCHEMA IS ON DECLARE ALIAS MULTISCHEMA IS OFF SQL (3) SCHEMA CATALOG 20-9


20.3 SQL "RDB$HANDLE.ADMINISTRATION".ACCOUNTING.DEPARTMENTS RDB$HANDLE ADMINISTRATION ACCOUNTING DEPARTMENTS 3 "1 DECLARE MODULE DIALECT SQL92 QUOTING RULES SQL92 1 RDB$DBHANDLE 20-10 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


ASQL <strong>Oracle</strong> Rdb ■■■■ <strong>Oracle</strong> Rdb SQL A-1


A.1 A.1 ■SET RADIX POINT SHOW RADIX POINT ■■SET DIGIT SEPARATOR SHOW DIGIT SEPARATOR SET CURRENCY SIGN SHOW CURRENCY SIGN C ompa q Tru64 UNIXC ompa q Tru64 UNIX■■DATE VMS OpenVMS SET DATE FORMAT SHOW DATE FORMAT Compaq Tru64 UNIX OpenVMS SET LANGUAGE SHOW LANGUAGE Compaq Tru64 UNIX A.1.1 A-2 SET SHOW <strong>Oracle</strong> <strong>Rdb7</strong> SQL Reference ManualA.1.1 Compaq Tru64 UNIX C ompa q Tru64 UNIX1 <strong>Oracle</strong> Rdb POSIX jaJP/usr/lib/dbs/sql/vnn/lib/ja_JP/ POSIX iso639lang POSIX iso3166terr C_C SQL /usr/lib/dbs/sql/vnn/lib/C_C/sqlmsg.mdfCompaq Tru64 UNIX A-2 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


A.3 A.2 <strong>Oracle</strong> Rdb ASCII ■■OpenVMS National character setNCSNSC 2 SQL <strong>Oracle</strong> <strong>Rdb7</strong> SQL Reference Manual A.3 SQL CONTAININGSTARTING WITHLIKE ■■■CONTAININGCONTAINING a AáàäÁÀ ä ae ch ll 1 CONTAINING 'C'CcçÇ CHchChcH STARTING WITHSTARTING WITH STARTING WITH'C' STARTING WITH 'ç' ch ll 1 SPANISHSTARTING WITH 'c' char cat LIKELIKE STARTING WITH LIKE LIKE Ç LIKE ç LIKE ch ll 1 SQL A-3


A.4 <strong>Oracle</strong> Rdb SPANISH LIKE c char cat ■■ ñ n ç c ü u x z y <strong>Oracle</strong> <strong>Rdb7</strong> SQL Reference ManualA.4 <strong>Oracle</strong> Rdb <strong>Oracle</strong> Rdb : DEC_KANJI ASCII DEC Multinational Character SetMCSMCS A-1A-4<strong>Oracle</strong> Rdb A-1 <strong>Oracle</strong> Rdb *1 *1 MCS KANJIHANZIHANYUSICGCCKOREAN A-4 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


A.4 <strong>Oracle</strong> Rdb A-1 <strong>Oracle</strong> Rdb *11. ASCII ASCII MCS 2. 3. DEC_HANZIDEC_KOREANDEC_HANYUDEC_SICGCC *1 <strong>Oracle</strong> <strong>Rdb7</strong> SQL Reference ManualDEC_KANJI 1. ASCII ASCII MCS 2. JIS X0201 3. 4. KANJI JIS X0208 SQL A-5


A.4 <strong>Oracle</strong> Rdb A-6 <strong>Oracle</strong> <strong>Rdb7</strong> SQL


! " ( )?$SQL_VARCHAR 6-178-28$$: :;;= ( )=? @ ( )@__2 16-2416-25AAda SQLDA11-9SQL 6-146-76-156-7SQL 4-13SQL 3-814-387-410-168-278-27RDB$ 10-188-278-276-156-14SQL 6-66-147-136-15Ada ACSAda LINK ACSAda 6-14Ada SQL SQLALIAS 20-3SQL 3-10ALIGN_RECORDS 8-28-ansi SQL 6-8ANSI_FORMAT SQL 6-18ANSI/ISO SQL 1-1COBOL 6-18SQL 1-43-14 SQL 20-6 -1


20-1AST (AST) ATOMIC 12-15ATTACH 15-115-215-3FILENAME 15-115-4PATHNAME 15-2USER 15-515-615-1315-910-33AUTHORIZATION 20-420-5SQL 3-1013-313-4AVG NULL 8-18BBEGIN 13-813-712-3BIND ON CREATE 14-714-32BIND SCOPE CREATE 14-714-42BY DESCRIPTOR SQL 4-13CCALL 12-412-1414-214-3213-1013-1113-11CASCADE DROP FUNCTION 13-1314-8DROP PROCEDURE 13-1314-8CASE 13-7CASE 12-312-8CAST 9-49-69-89-129-139-149-159-179-17CATALOG 20-320-5SQL 3-9CDD/PlusCHAR 8-26SQL 4-17 SQL4-5CHECK 4-14CLOSE 18-418-8 SQL 11-3511-3516-2918-11-cm SQL 16-40SQL 16-40COBOL COPY 8-8EXECUTE IMMEDIATE 11-6SQLCODE6-18SQL 6-76-7SQL SQL 3-814-4010-168-308-30 SQL6-18ANSI/ISO 6-18SQL 6-66-186-186-56-18 SQL6-187-13COBOL 6-18COBOL END PROGRAM 6-18COMMIT 16-4216-44 -2


Recovery-unit 16-43SQL 4-718-818-1118-1213-916-4110-3512-17Compaq Tru64 C 7-3COMPILETIME 15-3COMPUTED BY 14-30CONNECT SQL 17-11SQL 17-11CONNECT 15-317-517-517-6-conn SQL 17-11SQL 17-11CONSTRAINT SQL 16-40SQL 16-40COUNT 8-18CREATE DATABASE SQL 4-166-5CREATE FUNCTION 14-414-914-1314-24CREATE MODULE 13-313-413-3CREATE PROCEDURE 14-6CREATE VARIANT 14-5CURRENT_TIMESTAMP 19-99-3C Compaq Tru64C 7-3INCLUDE SQLCA 8-10INTEGER 8-29NULL 4-176-168-98-2811-208-12SMALLINT 8-29SQLDA11-9SQL SQL 8-12SQL 20-4SQL 3-8VAX C 6-176-1710-3014-39SQLCA8-28SQLCODE8-278-2810-168-128-278-284-176-178-288-278-276-17 SQL6-16SQL 6-66-76-76-167-13C NULL 8-98-128-2811-20C SMALLINT 8-29C 8-29DDanish A-4.dbsrc 15-215-515-8DEC C Compaq Tru64 C DECIMAL 8-26DECLARE ALIAS 15-215-3COMPILETIME 15-3EXTERNAL 7-77-12GLOBAL 7-77-12RUNTIME 15-4SQL 17-4SQL 20-9SQL 3-114-515-124-54-6USER 15-515-6 -3


7-76-137-12 SQL6-511-7 FILENAME 15-4DECLARE CURSOR 18-3FOR UPDATE 19-619-9SCROLL 18-418-15SQL 3-114-74-7WHERE CURRENT OF 18-1319-4WITH HOLD 18-818-1118-1110-518-718-1518-7 DECLARE CURSOR , DECLARECURSOR 18-76-518-1119-619-9 DECLARE CURSOR DECLARE CURSOR SQL DECLARE CURSOR DECLARE MODULE 6-11DEFAULT DATE FORMAT 9-320-7DECLARE STATEMENT SQL 3-126-13DECLARE TABLE 6-11SQL 3-124-166-135-56-5DECLARE TRANSACTION 16-516-1016-22RESERVING 16-1013-17SET TRANSACTION 16-5SQL 3-1216-106-1316-2212-186-516-15 / 16-816-616-10DECLARE SQL 3-11DECLARE 12-4DECLARE CONSTANT 12-5DECnet 15-9DEFAULT DATE FORMAT DECLARE MODULE 9-39-3DEFAULT DECLARE 12-5DEFERRABLE 16-40DELETE 19-8SQL 4-84-8WHERE 19-819-88-1015-1418-5DESCRIBE 11-4MARKERS 11-811-23SELECT LIST 11-811-19 SQL11-3311-3311-3512-18DESCRIBE MARKERS 11-811-23DESCRIBE SELECT LIST 11-811-19DIALECT DECLARE MODULE 20-9DISCONNECT 15-1517-517-1018-418-1115-15DISTRIBTRAN 15-11DROP FUNCTION 13-1214-8DROP MODULE 13-1213-1213-12DROP PROCEDURE 13-1214-8 -4


DROP TABLE 19-4EEND MODULE 13-5END-EXEC 6-56-6END 13-813-712-3EXCLUSIVE 16-2716-2816-3016-30EXEC SQL 6-4EXECUTE IMMEDIATE 11-412-18EXECUTE 11-4 SQL11-3211-3311-3211-3312-18Extend_source , SQL 6-20EXTERNAL NAME 14-514-7EXTERNAL_GLOBAL SQL 7-77-9SQL 7-77-9EXTERNAL DECLARE ALIAS 7-77-12-extern 7-117-12EXTRACT 9-89-12FFETCH 18-3INTO 18-3SQL 4-84-810-3518-1518-158-1018-318-418-3 SQL11-411-3511-3519-518-9FETCH SCROLL 18-15FILENAME ATTACH 15-1215-4DECLARE ALIAS 15-3Finnish A-4FLAG_NONSTANDARD 3-14 ANSI/ISO SQL 20-6FOR UPDATE OF 19-6FOR UPDATE 19-9-form ansi SQL 6-86-18FORTRAN END 6-21SQLCODE6-21SQL 6-76-7SQL ; SQL 3-814-3714-4010-168-308-306-20DO 6-21IF 6-21SQLCA 6-20SQL 6-66-206-206-217-13FORTRAN DO 6-21FORTRAN END 6-21FORTRAN 6-21FORTRAN SQL -5


FOR 12-312-1013-1212-2112-1312-13French A-4FROM SQL 8-38-11GG_FLOAT 6-8GENERAL CREATE FUNCTION 14-5CREATE PROCEDURE 14-7LANGUAGE 14-38GENERAL SQL 3-84-12GET DIAGNOSTICS 10-312-412-2112-2212-23GLOBAL DECLARE ALIAS 7-77-12HHAVING SQL 4-78-24IIF 12-412-612-1713-1212-7FOR 12-10 FORTRAN6-21IF ELSEIF 12-7IF THEN 12-7INCLUDE SQLCA 10-7INCLUDE 8-38-8FROM DICTIONARY 8-88-9Pascal6-22SQLCA 8-48-8EXTERNAL 8-108-10SQLCA 110-7SQLDA2 8-58-88-11SQLDA 8-58-88-11SQL 4-178-88-116-4INOUT 13-6INSERT 19-2SELECT 19-3SQL 4-84-8VALUES 19-28-2214-308-1019-319-419-319-219-319-419-49-29-3 NULL 19-319-3INTERVAL 9-29-49-129-18SQL 9-59-2INTO 18-3FETCH 18-9SELECT 18-6IN 13-613-8ISO ANSI/ISO SQL LLANGUAGE CREATE FUNCTION 14-5CREATE PROCEDURE 14-7SQL 3-84-114-12C 4-17GENERAL 3-84-17 -6


13-4-lc_proc SQL 4-4-lcosi 5-37-11LEAVE 12-412-13LINK ACSAda 7-47-47-5LINK DCL7-2LINK SQL$USER 7-2LIST OF BYTE VARYING 18-6-list SQL 6-8LNK$LIBRARY 7-2LONG_SQLCODE 8-28LOOP 12-412-912-1312-13-lots 5-37-11-lrdbshr 5-37-11-lrdbsql 5-37-11-lsqlcode 8-28-l SQL 6-6MMake sqllibs.make 7-11-match SQL 6-8MAX NULL 8-18MIN NULL 8-18MODULE SQL 3-6MULTISCHEMA IS ON 20-2Multivendor MIA10-18NNOCONNECT SQL 17-11SQL 17-11NOEXTERNAL_GLOBAL SQL 7-77-9SQL 7-77-9-noextern 7-117-12NOG_FLOAT 6-17NOOPTIMIZE 7-13NOPARAMETER_CHECK SQL 5-4Norwegian A-3NOT ATOMIC 12-15NOT DEFERRABLE 16-40Not found 18-9SQLCODE 10-8WHENEVER 10-11Not found 10-11NOTIFY CREATE 14-814-41NOWAIT 16-1316-28NULL 18-68-2119-38-1813-813-613-1113-118-178-18OOBJECT 6-8OpenVMS Linker LIBRARY 7-2SHAREABLE 7-37-57-6OPEN 18-318-8SQL 4-74-7 SQL11-411-35 -7


11-356-516-27<strong>Oracle</strong> RallyRally OUT 13-6PPARAMETER COLONS 3-118-12PARAMETER STYLE CREATE FUNCTION 14-5CREATE PROCEDURE 14-7PARAMETER_CHECK SQL 5-4Pascal SQL 6-76-7SQL SQL 3-814-3714-4010-168-318-31 SQL6-22SQL 6-66-227-136-23Pascal SQL 6-23PASSWORD_DEFAULT 15-7-pass SQL 15-7SQL 15-7PATHNAME DECLARE ALIAS 15-3PL/I SQLDA11-9SQL 6-76-7SQL SQL 3-810-168-318-318-31 SQL6-23SQL 6-67-13PREPARE 11-418-1718-1811-3211-3311-3512-1811-35PRESERVE DECLARE CURSOR 18-12PROTECTED 16-716-2716-28PSECT 7-37-6QQUOTING RULES DECLARE MODULE 20-9RRDB$_DEADLOCK RDB$LU_STATUS 10-34RDB$_INTEG_FAIL RDB$LU_STATUS 10-31RDB$_LOCK_CONFLICT RDB$LU_STATUS 10-34RDB$_NO_DUP RDB$LU_STATUS 10-31RDB$_NOT_VALID RDB$LU_STATUS 10-31RDB$CATALOG 20-2SQL 20-7SQL 20-320-7RDB$CLIENT_DEFAULTS.DAT 15-515-8RDB$DBHANDLE 15-1215-13AUTHORIZATION 3-11 -8


SQL 20-7RDB$DBHANDLE 3-11RDB$INTERRELATIONS 13-14RDB$LU_STATUS 10-1310-1510-16"valid if" 10-3110-3110-3110-3410-34RDB$MESSAGE_VECTOR 10-310-510-1310-1410-15 sql_signal 10-27RDB$REMOTE 15-9RDB$ROUTINES 14-514-7RDB$SCHEMA 20-220-8RDB_DEBUG_FLAGS_OUTPUT 12-19RDB_DEBUG_FLAGS 12-18RDB_RTX_SHRMEM_PAGE_CNT 14-3414-44RDB_VALIDATE_ROUTINE 13-21RDBSERVER 15-9RDMS$DEBUG_FLAGS_OUTPUT 12-19RDMS$DEBUG_FLAGS 12-18RDMS$RTX_SHRMEM_PAGE_CNT 14-3414-44RDMS$VALIDATE_ROUTINE 13-21RDMS$VERSION_VARIANT 15-9READ COMMITTED 16-1416-1716-1916-2016-19READ 16-28Recovery-unit .ruj16-4316-27RELEASE 11-4REPEATABLE READ 16-1416-1516-1716-2016-19Reserve 16-28RESERVING 16-3DECLARE TRANSACTION 16-10EXCLUSIVE 16-12SET TRANSACTION 16-1016-15 / 16-1216-11RESTRICT DROP FUNCTION 13-1314-8DROP PROCEDURE 13-1314-8RETURNS 13-8CREATE FUNCTION 14-5RETURN 13-713-9RIGHTS AUTHORIZATION 3-10DECLARE MODULE 20-720-4ROLLBACK 16-4216-44Recovery-unit 16-43SQL 4-710-1210-3518-818-1118-1213-912-17ROWID 19-8.ruj Recovery-unit .rujSSCHEMA 20-320-5SQL 3-9SELECT INTO 18-618-6SQL 4-78-1015-14 SQL11-311-1911-2211-3211-3511-311-22SELECT -9


SQL11-211-3211-3311-1811-811-5SERIALIZABLE 16-316-1416-1516-19SET ALL CONSTRAINTS 16-40SET CONNECT 17-517-917-5SET DEFAULT CHARACTER SET 3-7SET DEFAULT CONSTRAINT MODE 16-40SET DIALECT 3-7SET FLAGS NOPREFIX 12-20TRACE 12-18SET HOLD CURSOR 18-13SET IDENTIFIER CHARACTER SET 3-7SET LITERAL CHARACTER SET 3-7SET NATIONAL CHARACTER SET 3-7SET NOEXECUTE 13-22SET TRANSACTION 16-21DECLARE TRANSACTION16-22DECLARE TRANSACTION 16-6RESERVING 16-1013-17SQL 3-12WAIT NOWAIT 16-1216-1016-2213-916-1216-2717-1016-1216-2712-176-516-15 / 16-816-616-616-10SET 19-6SET 12-4SHARED 16-28SHOW FUNCTION 13-20SHOW PROCEDURE 13-20SIGNAL 10-312-412-22Spanish A-3SQLDECLARE TRANSACTION 16-10SET TRANSACTION16-516-22DISCONNECT 17-5 DECLARE CURSOR 11-411-1918-718-17SQL INCLUDE 8-8SQL$DATABASE 15-215-13SQL$GET_ERROR_TEXT 10-30sql_get_error_text sql$persmsg 10-30SQL$SAMPLE 1-5SQL$SIGNAL sql_signal sql_all_datatypes 8-27SQL 8-31SQL_ALTERNATE_SERVICE_NAME 15-10sql_close_cursors 18-4SQL_DATABASE 15-215-13sql_deregister_error_handler 10-410-1910-2010-2410-25sql_dynamic 11-4sql_get_error_handler 10-410-1910-2010-2410-25sql_get_error_text 10-28sql_get_message_vector 10-310-1310-14sql_load_jobhist 19-2sql_rdb_headers.h 6-17sql_register_error_handler 10-410-1810-2010-2310-2410-25sql_report 18-6sql_signal 10-410-27sql_sqlda.h 8-511-10sql_terminate 19-6 -10


10-410-30SQLCA 8-410-510-7C 8-28FORTRAN 6-20SQL 4-413-813-6 SQL6-5FORTRAN 6-21SQLCA 10-7SQLCODE_DEADLOCK 10-34SQLCODE_EOS 10-8SQLCODE_LOCK_CONFLICT 10-34SQLCODE_NOT_VALID 10-31SQLCODE_SUCCESS 10-8SQLCODE 8-410-310-610-7C 8-28SQL 4-4"valid if" 10-3110-3110-810-810-810-3110-810-810-3410-3413-813-610-610-7C 8-27FORTRAN6-2012-23 SQL6-5COBOL 6-18FORTRAN 6-2110-36SQLDA8-511-911-1011-911-104-5SQLDA28-511-911-104-5SQLDA2 11-9SQLDA 11-9SQLERRD 8-10FORTRAN 6-2010-7sqllibs.make 7-11SQLLIBS 5-37-11SQLSTATE 8-410-310-5SQL 4-410-610-610-610-610-3410-3413-813-610-5C 8-2712-23 SQL6-510-36SQL SQLDA SQLDA2 SQL SQLCA SQLCA SQL SQL 6-1Ada 6-147-13Ada 6-14COBOL 6-18COBOL 19-6COMPILETIME 15-3C 6-16EXEC SQL 6-4FETCH 18-3FORTRAN 6-207-13INCLUDE 8-8 -11


Pascal 6-227-13Pascal 6-23PL/I 6-23RDB$DBHANDLE 20-7SQL 6-46-56-106-96-56-56-66-76-116-9-ansi6-8ANSI_FORMAT6-18-cm deferred16-40-cm immediate10-3716-40-conn17-11CONNECT17-11CONSTRAINTS=IMMEDIATE10-37-extern7-11EXTERNAL_GLOBAL7-77-9-form ansi6-86-18-l6-6LIST6-10-list6-86-10-match6-8-noconn17-11NOCONNECT17-11-noextern7-11NOEXTERNAL_GLOBAL7-77-9-pass15-7PASSWORD_DEFAULT15-7-user15-7USER_DEFAULT15-7:8-1217-116-78-1217-1117-116-61-29-36-7 (-)6-56-58-129-512-712-121-320-920-820-720-108-248-2615-3SQL 2-1SQL 7-1SQL ATTACH15-1CALL12-412-1413-1114-32CASE12-312-8CLOSE18-4 SQL11-35COMMIT16-4216-4412-17CREATE FUNCTION14-414-914-1314-24CREATE PROCEDURE14-6DECLARE CURSOR18-3DECLARE TRANSACTION16-516-812-18DELETE19-8DESCRIBE11-411-3311-3512-18DROP FUNCTION13-12DROP PROCEDURE13-12EXECUTE11-411-3211-3312-18EXECUTE IMMEDIATE11-412-18FETCH18-3 SQL11-411-3518-3FOR12-312-10GET DIAGNOSTICS12-412-2112-22IF12-412-6INCLUDE SQLCA10-7INSERT19-2 -12


LEAVE12-412-13LOOP12-9OPEN18-3 SQL11-411-35PREPARE11-411-3211-3311-3512-18RELEASE11-4RETURN13-713-9ROLLBACK16-4216-4412-17SELECT SQL11-311-2211-32SELECT SQL SQL11-211-511-8SET ALL CONSTRAINTS16-40SET DEFAULT CONSTRAINT MODE16-40SET FLAGSNOPREFIX 12-20TRACE 12-18SET HOLD CURSOR18-13SET TRANSACTION16-616-812-17SET 12-4SIGNAL12-412-22SQL 4-2TRACE12-412-18UPDATE19-5WHENEVER10-10 DECLARE CURSOR11-411-1911-2311-3211-358-8SQL 4-144-1510-510-7SQL 5-22-42-3 DECLARE CURSOR11-411-1911-2311-212-16-43-410-4RDB$LU_STATUS 10-15SQLCODE 10-7WHENEVER 10-10SQL Ada 6-6COBOL 6-6C 6-6FORTRAN 6-6Pascal 6-6PL/I 6-6SQL 3-14-14-65-1COMPILETIME 15-3DECLARE 3-11FROM DICTIONARY 8-11FROM 8-11FROM 8-38-11PARAMETER COLONS 3-113-1015-1210-73-93-84-114-12:8-125-24-1417-113-113-103-41-212-123-4DECLARE 3-11PARAMETER COLONS 3-113-103-93-83-63-93-63-104-24-1412-1312-712-1112-173-124-3 -13


4-44-104-41-220-420-620-33-68-248-26SQL 3-13-23-44-15-1C 8-288-12INTEGER 8-29SMALLINT 8-29SQL 4-16SQL 5-517-115-4SQL Rally3-2SQL FROM DICTIONARY 8-11SQL FROM 8-3SQL BASIC 3-8SQL DECLARE 3-11SQL GENERAL 4-12SQL PLI 3-8SQL LANGUAGE 3-8SQL MODULE 3-6SQL 3-84-114-12SQL 5-3SQL 4-24-144-24-94-104-44-54-154-24-103-124-34-4SQL 12-712-1112-17SQL SQL 4-24-14SQL 4-9SQL 5-2-cm deferred16-40-cm immediate10-3716-40-conn17-11CONNECT17-11CONSTRAINTS=IMMEDIATE10-37-extern7-11EXTERNAL_GLOBAL7-77-9FLAG_NONSTANDARD3-1420-6-lc_proc4-45-25-2LONG_SQLCODE8-28-lsqlcode8-28-noconn17-11NOCONNECT17-11-noextern7-11NOEXTERNAL_GLOBAL7-77-9NOPARAMETER_CHECK5-4PARAMETER_CHECK5-4-pass15-7PASSWORD_DEFAULT15-7-std3-1420-6-user15-7USER_DEFAULT15-75-217-1117-1117-1117-111-29-39-81-220-6SQL 5-37-11SQL sql_deregister_error_handler10-19sql_get_error_handler10-19sql_get_error_text10-28sql_get_message_vector10-1310-14sql_register_error_handler10-18 -14


sql_signal10-2710-410-186-1710-30-std 3-14 ANSI/ISO SQL 20-6SUM NULL 8-18SYSTEM LOGICAL_NAME TRANSLATION CREATE 14-34TTCP/IP 15-915-10TIMESTAMP 9-10SQL 9-59-2TIME SQL 9-5TRACE 12-412-18UUCX 15-10UNION 19-3UNIVERSAL 14-2614-27UPDATABLE DECLARE 12-5UPDATE...RETURNING dbkey 19-8UPDATE 19-5dbkey 19-8FOR 12-10RETURNING 19-7SQL 4-84-819-88-2218-419-619-58-1015-1418-619-6UPDATE RETURNING 19-719-8UPDATE SET =19-6USER_DEFAULT 15-7-user SQL 15-7SQL 15-7USER 15-6USING 15-6VVARCHAR 8-28C 6-17 SQL4-5WWAIT 16-12WAIT 16-1216-28WHENEVER 10-310-10CONTINUE 10-12FORTRAN DO 6-21NOT FOUND 10-11SQLERROR 10-11SQLWARNING 10-11SQL 4-1610-1210-1210-1110-12WHERE CURRENT OF DECLARE CURSOR 19-4UPDATE 19-6WHERE 19-5DELETE 19-8SQL 4-7UPDATE 19-58-2414-30WHILE LOOP 12-9WHILE 12-4WITH HOLD DECLARE CURSOR 18-818-12WRITE 16-28 -15


16-2814-38-28-128-1212-15_Ada 8-27-6-5DATE VMS9-15SQL 3-1410-3614-456-86-129-1213-1313-1313-1413-1613-1713-1713-1713-1513-1313-18RDB$INTERRELATIONS 13-1413-1313-1318-67-6sql_rdb_headers.h6-1710-30sql_sqlda.h8-511-108-48-188-25SQL 8-20 SQL8-208-48-1818-6C8-27FETCH 8-21INSERT 8-208-228-23SQL 8-208-31UPDATE 8-20WHERE 8-20WHERE HAVING 8-248-218-228-218-208-2413-813-613-118-188-188-188-258-18 SQL8-208-188-2215-1016-2816-3116-3316-28"3-7 (’)_>INCLUDE FROM DICTIONARY 8-9NULL SQLSQL 12-716-17 CONTAINING A-3 LIKE A-3 -16


STARTING WITH A-315-1215-13RDB$DBHANDLE15-13SQL 3-107-77-916-315-2SQL 20-7SQL 20-315-13SQL 15-1216-2115-1320-77-1220-3SQLCODE 10-810-31RDB$LU_STATUS10-31SQLCODE10-317-1315-310-110-3110-3110-3510-3210-3410-357-1310-1210-2710-27SQL 6-106-1010-32RDB$LU_STATUSRDB$_NOT_VALID10-31RDB$_DEADLOCK10-34RDB$_INTEG_FAIL10-31RDB$_LOCK_CONFLICT10-34RDB$_NO_DUP10-31SQLCODE10-31SQLCODE_DEADLOCK10-34SQLCODE_EOS10-8SQLCODE_LOCK_CONFLICT10-34SQLCODE_NOT_VALID10-31SQLCODE_SUCCESS10-8SQLSTATE10-31RDB$MESSAGE_VECTOR 10-1310-14sql_get_error_text 10-28sql_get_message_vector 10-1310-14sql_signal 10-27SQL 10-410-1810-214-42SQLCODE 10-8WHENEVER 10-1110-2sql_get_error_text 10-28sql_signal 10-27SQLCODE 10-11WHENEVER 10-1110-1210-210-410-1210-2710-1612-2212-23sql_get_error_text 10-28sql_signal 10-2710-3010-31C SQLCODE8-27 -17


SQLSTATE8-27SQL 4-46-57-126-87-12CompaqTru64 UNIX7-10OpenVMS7-2OpenVMS Linker 7-314-2614-2714-2818-1CLOSE 18-4CLOSE 18-4COMMIT 18-818-1118-12DECLARE 4-718-3FETCH 18-3FOR 12-10OPEN 4-718-3OPEN 18-3ROLLBACK 18-818-1118-1210-810-1118-318-818-418-718-1811-3218-6 SELECT 18-618-518-219-619-819-918-318-218-918-618-318-318-318-418-316-2718-1118-1218-518-918-418-1518-718-1718-3SQL 4-718-1118-318-218-618-918-718-718-818-711-2318-718-1711-3518-718-1818-418-818-318-512-1018-618-818-1118-619-918-618-1319-418-1318-818-819-616-2918-314-45LANGUAGE GENERAL 14-3814-414-314-1114-1314-3014-3114-3814-914-414-514-3814-914-2314-3114-414-514-12 -18


14-4514-612-1414-214-314-3212-1414-614-614-614-45Ada14-38COBOL14-40C 14-39FORTRAN14-3714-40LANGUAGE 14-514-7Pascal14-3714-4014-3214-3414-3514-4514-3614-3 , 14-1114-1314-2414-3014-3214-3414-4414-914-2614-2714-2814-2914-2514-2614-2714-314-714-314-3214-1014-2314-314-714-4314-3414-4114-214-814-314-814-4414-3614-3514-42 DECLARE CURSOR 11-411-1911-2318-718-1811-3211-3511-411-1911-2311-3211-3518-718-18 UNIQUE 10-3113-1810-3110-31 NOT NULL 10-31 UNIQUE 10-3120-2RDB$CATALOG 20-220-7SQL 3-920-220-3SQL 20-7SQL 20-3CAST9-49-8EXTRACT9-8NULL 8-1814-4513-110-210-4SQLCODE 10-6SQLSTATE 10-5SQLCODE 10-8SQLSTATE 10-618-9SQLCODE 10-8SQLSTATE 10-6WHENEVER 10-1112-2212-23 SQL16-44ANSI/ISO SQL20-1 -19


A-213-1212-1513-10A-43-73-8SQL 10-718-318-918-219-519-619-819-219-518-316-25SQL 8-10INSERT 18-318-318-418-418-318-2CompaqTru64 UNIX 14-297-2sql_register_error_handler 10-237-107-314-25OpenVMS Alpha 14-27OpenVMS VAX 14-267-67-77-67-57-97-314-3414-4416-316-1016-2716-28EXCLUSIVE16-1016-2716-28PROTECTED16-716-1016-2716-28SHARED16-2816-2816-28SQL 3-616-32 / 13-314-714-32SQLLIBS5-37-11SQLCODE 10-11FORTRAN 6-20A-218-2FETCH 18-318-518-518-418-718-718-418-418-818-1118-1218-318-318-1518-818-218-518-518-718-15 -20


DISTRIBTRAN15-1114-3313-313-413-12SQL 20-7SQL 20-418-5SQL 6-13SQL 3-2SQL 4-114-1214-38 / A-213-1618-919-518-716-2018-716-15ATTACH 15-13RDB_DEBUG_FLAGS12-18RDB_DEBUG_FLAGS_OUTPUT12-19RDB_RTX_SHRMEM_PAGE_CNT14-3414-44RDB_VALIDATE_ROUTINE13-21SQL_ALTERNATE_SERVICE_NAME15-10SQL_DATABASE15-2.dbsrc15-215-515-8RDB$CLIENT_DEFAULTS.DAT15-515-88-15COBOL 6-19FORTRAN 6-22SQL 8-5SQL 8-25SQL 8-258-24Ada6-14COBOL6-18C 6-17FORTRAN6-21Pascal6-22PL/I6-238-319-419-48-314-16A-1<strong>Oracle</strong> Rdb A-1FROM 8-11INCLUDE 8-88-9SQL 3-6SQL 4-4:SQL 3-118-128-125-56-86-12SQL 6-12DECLARE MODULE 6-11SQL 5-56-1220-320-86-86-86-12SQL SQL SQL 5-2SQL 17-11SQL 5-2 SQL 17-11 -21


6-76-714-714-3214-819-819-913-1213-1213-1219-9NULL 8-1813-133-141-51-5A-214-4514-97-27-17-1 LINK DCL7-213-44-914-1014-23SQL 6-9SQL 5-210-3110-3112-1316-4412-13FOR 12-13LOOP 12-1312-12A-413-9CONTAINING A-3LIKE A-3STARTING WITH A-3 SQL 11-9A-4A-3A-4A-45-310-1610-16SQLLIBS5-37-11DCLSQL 5-26-66-77-57-914-2820-2RDB$SCHEMA20-220-8SQL 3-9 -22


20-220-220-3SQL 20-7SQL 20-33-918-418-155-6SQL 5-614-314-716-2116-2216-23SQLCODE10-6SQLCODE , SQLCA,SQLSTATE SQLSTATE10-513-813-613-1113-1113-1NULL 13-813-813-1213-1213-713-913-813-813-813-1NULL 13-613-1112-1413-1012-14CALL13-1113-613-1013-613-1113-1213-513-613-613-1112-1513-1013-63-613-213-1213-313-113-313-1313-1413-1313-18 / 13-313-1613-413-2013-2113-413-413-413-313-413-1713-1513-1413-18 SQL 13-1813-213-2013-21.snpEXCLUSIVE 16-3016-3016-2716-304-16SQL DO FORTRAN6-21IF FORTRAN6-21Pascal6-22SQLCODE COBOL6-18SQLCODE FORTRAN6-21 SQL COBOL6-186-7FORTRAN6-20FORTRAN6-20FORTRAN6-209-19 -23


18-7TIMESTAMP 9-29-29-210-3110-3114-3010-3116-4016-4016-1216-2710-3210-3716-3916-41Verb 16-3916-3916-40<strong>Oracle</strong> Rdb 15-1114-3415-815-53-73-73-717-217-317-317-217-217-217-23-73-73-73-73-73-717-1CONNECT 17-517-6DISCONNECT 17-5SET CONNECT 17-5SQL 17-1117-11SQL 17-11SQL 17-1117-1117-1117-218-417-317-917-317-217-5 C 17-1117-13 SQL 17-1117-1017-517-217-1017-217-217-417-217-2 SQL17-817-1012-2117-517-317-3;SQL 3-124-144-156-4 SQL6-618-38-2FROM INCLUDE FROM 8-3 -24


FOR 12-1018-314-3018-8list18-83GL3-219-9 SQLEXIT 16-44SET FLAGS 12-1816-4412-312-122-44-24-1413-1213-1016-9A-2SQLCA 14-4113-4$SQL_VARCHAR6-178-28CHAR4-178-26C 8-29C SMALLINT8-29DATE8-78-22DATE ANSI9-19-39-49-69-89-13SQL 9-59-3DATE VMS9-139-159-14INTERVAL9-29-49-129-18SQL 9-59-2LIST OF BYTE VARYING18-6SQL 4-10SQL 8-26TIME9-5TIMESTAMP9-29-59-10VARCHAR6-1713-813-68-228-5SQL 4-104-118-11 RDB$RELATIONS 8-96-178-68-28Ada8-27C8-27SQL 8-318-78-2610 8-26SQLCASQL 10-7SQLDA2SQL 211-9SQLDASQL 11-9DMLSQL1-1DDLEXECUTE IMMEDIATE 11-8SQL1-1SQL 4-7 SQL6-54-16SQLCODE 10-8 -25


SQLSTATE 10-619-29-2FETCH 18-416-318-2118-116-328-1218-616-2819-519-616-28 2 19-5 1 19-619-518-519-518-619-615-1215-1516-316-215-1219-215-16-1210-3117-215-1515-115-22 15-1215-115-215-410-3516-915-319-219-2<strong>Oracle</strong> Rdb 20-116-2520-120-1020-320-1015-217-317-717-417-617-217-217-317-217-317-314-1610-3115-15DISCONNECT 15-1519-219-215-22 15-12ATTACH SQL$DATABASE 15-215-13SQL_DATABASE 15-215-1310-3517-517-416-2819-219-519-619-419-49-216-1016-10 NULL 8-18 NULL 8-1819-816-2518-6 -26


19-3DECLARE TABLE 10-3210-3414-4510-3210-3415-1110-3412-1813-1713-1720-97-57-9 DECLARE CURSOR 11-411-1911-2318-718-17SQL 3-11 SQL11-1CAST 9-17CLOSE 11-35DESCRIBE 11-411-3311-35EXECUTE IMMEDIATE 11-411-6EXECUTE 11-411-3211-33FETCH 11-411-35OPEN 11-4PREPARE 11-411-3211-3311-35RELEASE 11-4SELECT 11-311-1911-2211-3211-35SQLDA11-9SQLDA211-911-211-411-1911-2311-3211-3511-517-811-3211-3511-411-1911-2311-211-3211-3511-3211-3211-3511-338-411-3311-211-8 SELECT 11-211-3211-3311-811-59-179-1912-1812-1811-211-211-1311-311-411-19 SQL 11-311-411-19DESCRIBE 11-411-811-1911-411-1911-2318-718-17DISTRIBTRAN 15-1114-4415-1115-1116-22 16-2416-25Recovery-time 16-4316-210-3514-316-3316-4216-4316-4416-26-1216-4216-44CompaqTru64 UNIX16-4416-4416-2116-2216-2316-1216-2717-1016-216-216-1016-21 -27


16-216-516-2216-216-1216-2716-816-4416-1216-212-1712-2116-2116-22 / 16-816-1216-616-3016-3016-1216-4216-4316-4416-1213-17COMMIT 16-42ROLLBACK 16-42DECLARE TRANSACTION DECLARETRANSACTION SET TRANSACTION ON 16-2119-914-3116-1216-27$Ada 8-278-27Ada 6-14SQL 3-6SQL 4-34-4SQL 4-1012-12 (--)3-615-12SQL 20-7SQL 3-10SQL 20-320-315-515-615-715-812-412-612-1112-1213-26-17SQLCA C 8-28SQLDA 11-11C 4-176-178-28- - (-)_6-5 (--)SQL 3-615-616-216-816-916-44INSERT 19-4SQL 6-10SQL 5-4SQL 5-419-3 -28


13-212-212-216-288-1NULL 8-48-18sql_get_error_text 10-28SQL 6-5SQL 4-124-13SQL 4-44-54-13SQL 4-58-413-613-818-64-138-48-128-38-58-27Ada8-27COBOL8-30C 8-278-28FORTRAN8-30FROM 8-11INCLUDE 8-8Pascal8-31PL/I8-31SQL 4-54-68-318-28-28-128-5SQL 4-1015-4 SQL11-3211-3511-3211-3511-3311-3211-358-48-12SQL 8-268-68-126-56-5 (-)6-58-311-28-38-128-138-158-138-248-3SQL 4-138-26BY DESCRIPTOR CHECK4-14CHECK 4-144-134-124-124-44-54-84-1011-211-811-17CAST 9-17DESCRIBE 11-811-1911-911-109-1711-211-813-813-619-9A-2ANSI/ISO SQL 9-1DATE9-3DATE ANSI9-39-49-69-89-13SQL 9-59-3DATE VMS9-139-149-15CompaqTru64 UNIX9-15 SQL 9-199-14INSERT 9-3INTERVAL9-29-49-129-18SQL 9-59-2SQL 9-5SQL 9-5 -29


SQL 9-8TIMESQL 9-5TIMESTAMP9-29-10SQL 9-59-12 SQL 9-69-29-2 SQL9-1719-98-7 , 16 9-149-59-49-49-129-39-49-139-12 (AST)15-1115-1418-516-1218-519-33-76-1215-116-14READ COMMITTED16-17REPEATABLE READ16-1512-112-212-12CALL 13-10SQL 4-1512-712-1112-1712-15 SQL6-412-710-612-1012-2312-312-1313-713-813-1213-513-713-10 SQL12-3 SQL12-1812-412-612-1112-1512-612-1212-212-22 SET 12-412-186-46-4COBOL6-18SQL 4-166-4SQL 4-166-4A-1A-47-1115-915-1015-94-24-1512-112-28-6C 6-176-17SQL DCL6-6 SQLAda 6-14COBOL 6-18FORTRAN 6-20Pascal 6-22PL/I 6-23 -30


SQL 6-56-412-2CASE12-8FOR12-10IF12-6LEAVE12-13LOOP12-9WHILE 12-915-815-10DEBUG 7-13SQL Ada6-14COBOL6-18C 6-16FORTRAN6-20Pascal6-22PL/I6-23SQL 1-3SQL 3-13-44-15-18-18 UPDATE 19-610-2710-3410-3218-518-52-12-1 SQL 3-43-14sql_all_datatypes8-27sql_all_datatypes_ada.sqlmod8-31sql_all_datatypes.sc8-27sql_dynamic11-39sql_multi_stmt_dyn.sqlada11-39sql_report18-6sql_terminate10-3019-610-419-618-618-1818-1519-318-179-519-56-27-127-110-216-44 SQL 5-36-217-117-1117-1315-315-152-47-13Ada8-27COBOL8-30C 8-27FORTRAN8-30Pascal8-31PL/I8-31SQL 4-58-319-39-198-83-116-26-4SQL 6-5SQL 6-46-5 SQL 6-210-3120-18-127-17-112-17-67-6 -31


7-77-97-67-97-13DEBUG 7-13EDIT 7-14 SQL 2-4SQL 3-124-24-34-44-10SQL 14-214-4513-113-154-94-10Ada6-14COBOL6-18C 6-17FORTRAN6-21Pascal6-22PL/I6-2316-4216-2415-1116-3<strong>Oracle</strong> Rdb 16-20READ COMMITTED16-17REPEATABLE READ16-15RESERVING 16-15SERIALIZABLE16-316-1516-1416-1516-1516-2016-1916-20sql_rdb_headers.h6-1710-30sql_sqlda.h8-511-1014-43Pascal 6-238-312-412-412-4 , C 6-1718-818-11SQL 6-13SQL 3-214-388-128-88-128-128-2NULL 8-48-48-48-32-1 SQL 1-318-9SQL 11-211-81 18-620-2 -32


SQL 20-620-10SQL 20-320-620-1SQL 20-920-220-220-220-220-220-220-720-220-820-220-6SQL 20-620-10SQL 20-320-620-9 C 20-420-6 SQL 20-420-10SQL 20-920-1SQL 20-6 SQL20-820-210-3216-2810-34WHENEVER 10-1213-18SQL 13-18sql_get_error_text 10-28sql_signal 10-2710-30 , 10-30Multivendor MIAsql$persmsg 10-3010-3014-3414-4416-28EXCLUSIVE16-1016-2716-28PROTECTED16-1016-2716-28SHARED16-1016-2816-44 / 16-816-616-28SQL 7-1113-513-7SQL SQL SQL SQL C NULL 4-176-168-98-128-2811-208-2214-1215-515-615-715-815-6 -33


16-216-816-12RESERVING 16-1218-718-816-716-3016-216-6EXCLUSIVE 16-3016-2816-3016-30Ada6-15SQL7-27-11FOR 12-13LOOP 12-1312-12LOOP 12-13FOR 12-1312-1218-1319-918-1518-1319-419-518-618-1318-618-1319-418-1319-518-1518-819-518-8Ada6-14SQL 4-166-4NULL C 8-12FROM 8-11INCLUDE 8-88-915-215-3 RDB$RELATIONS 8-9DECnet15-6TCP/IP15-615-1015-915-1115-515-815-415-915-56-1015-415-515-615-715-87-1LNK$LIBRARY 7-3SQL$USER 7-3SQL 5-3SQL 5-37-11CompaqTru64 UNIX7-10OpenVMS7-27-54-33-67-117-117-2sql_close_cursors18-4sql_deregister_error_handler10-19sql_get_error_handler10-19sql_get_error_text10-28sql_get_message_vector10-1310-14 -34


sql_register_error_handler10-18SQL 14-214-4513-118-91-51-510-210-410-4SQLCODE 10-8SQLSTATE 10-5WHENEVER 10-1010-212-1512-2218-98-38-1816-12PROTECTED 16-719-416-79-17SQL 6-106-10A-2READ COMMITTED 16-19REPEATABLE READ 16-17SERIALIZABLE 16-1516-2616-3116-3216-2816-2816-2918-1118-1216-2516-3116-3116-2516-2516-1016-2516-2716-12no-wait 16-2816-2816-1216-2916-2510-3216-3016-2510-3216-3010-3216-10READ16-28WRITE16-2816-2716-27no-wait 16-2816-2814-4516-28ATTACH 15-13LNK$LIBRARY7-2 -35


RDB$ROUTINES14-514-7RDBSERVER15-9RDMS$DEBUG_FLAGS12-18RDMS$DEBUG_FLAGS_OUTPUT12-19RDMS$RTX_SHRMEM_PAGE_CNT14-3414-44RDMS$VALIDATE_ROUTINE13-21RDMS$VERSION_VARIANT15-9SQL$DATABASE15-214-514-714-2514-3415-2 -36

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!