The following BASIC program uses an SQL Module to query system
tables
PROGRAM SYSTEM_RELATION
! This BASIC program interactively prompts a user to enter a name
! of a system table (table). Next, the program calls an SQL
! Module which uses a cursor to read the system table that the
! user entered. Upon reading the fields (domains) of the system
! table, the program displays a message to the user as to whether
! the fields in a system table can be updated.
OPTION TYPE = EXPLICIT, SIZE = INTEGER LONG
ON ERROR GOTO ERR_ROUTINE
!
! Declare variables and constants
!
DECLARE STRING Column_name, Table_name
DECLARE INTEGER Update_yes, sqlcode
DECLARE INTEGER CONSTANT TRIM_BLANKS = 128, UPPER_CASE = 32
EXTERNAL SUB SET_TRANSACTION (LONG)
EXTERNAL SUB OPEN_CURSOR(LONG,STRING)
EXTERNAL SUB FETCH_COLUMN(LONG,STRING,INTEGER)
EXTERNAL SUB CLOSE_CURSOR(LONG)
EXTERNAL SUB COMMIT_TRANS (LONG)
!
! Prompt for table name
!
INPUT 'Name of Table'; Table_name
Table_name = EDIT$(Table_name, UPPER_CASE)
PRINT 'Starting query'
PRINT 'In '; Table_name; ' Table, columns:'
!
! Call the SQL module to start the transaction.
!
CALL SET_TRANSACTION(Sqlcode)
!
! Open the cursor.
!
CALL OPEN_CURSOR(Sqlcode, Table_name)
GET_LOOP:
WHILE (Sqlcode = 0)
!
! Fetch each column
!
CALL FETCH_COLUMN(Sqlcode, Column_name, Update_yes)
IF (Sqlcode = 0)
THEN
!
! Display returned column
!
PRINT ' '; EDIT$(Column_name, TRIM_BLANKS);
IF (update_yes = 1)
THEN
PRINT ' can be updated'
ELSE
PRINT ' cannot be updated'
END IF
END IF
NEXT
ERR_ROUTINE:
IF Sqlcode = 100
THEN
PRINT "No more rows."
RESUME PROG_END
ELSE
PRINT "Unexpected error: ", Sqlcode, Err
RESUME PROG_END
END IF
PROG_END:
!
! Close the cursor, commit work and exit
!
CALL CLOSE_CURSOR(Sqlcode)
CALL COMMIT_TRANS(Sqlcode)
END PROGRAM
The following module provides the SQL procedures that are called
by the preceding BASIC program.
-- This SQL module provides the SQL procedures that are called by the
-- preceding BASIC program, System Table
-----------------------------------------------------------------
-- Header Information Section
-----------------------------------------------------------------
MODULE SQL_SYSTEM_REL_BAS -- Module name
LANGUAGE BASIC -- Language of calling program
AUTHORIZATION SQL_SAMPLE -- Authorization ID
--------------------------------------------------------------------
-- DECLARE Statements Section
--------------------------------------------------------------------
DECLARE ALIAS FILENAME 'MF_PERSONNEL' -- Declaration of the database.
DECLARE SELECT_UPDATE CURSOR FOR
SELECT RDB$FIELD_NAME, RDB$UPDATE_FLAG
FROM RDB$RELATION_FIELDS
WHERE RDB$RELATION_NAME = table_name
ORDER BY RDB$FIELD_POSITION
--------------------------------------------------------------------
-- Procedure Section
--------------------------------------------------------------------
-- Start a transaction.
PROCEDURE SET_TRANSACTION
SQLCODE;
SET TRANSACTION READ WRITE;
-- Open the cursor.
PROCEDURE OPEN_CURSOR
SQLCODE
table_name RDB$RELATION_NAME;
OPEN SELECT_UPDATE;
-- Fetch a row.
PROCEDURE FETCH_COLUMN
SQLCODE
field_name RDB$FIELD_NAME
update_flag RDB$UPDATE_FLAG;
FETCH SELECT_UPDATE INTO :field_name, :update_flag;
-- Close the cursor.
PROCEDURE CLOSE_CURSOR
SQLCODE;
CLOSE SELECT_UPDATE;
-- Commit the transaction.
PROCEDURE COMMIT_TRANS
SQLCODE;
COMMIT;