RDB$DB_KEY lets you retrieve a specific record from the database
using a logical pointer called a database key (dbkey). A dbkey
indicates a specific record in the database. You can retrieve
this key as though it were a field in the record. Once you
have retrieved the database key, you can use it to retrieve
its associated record directly, as part of a record selection
expression. The database key gives you the ability to keep
track of a subset of records in the database and retrieve them
repeatedly, without using data manipulation syntax.
1 – Examples
The following programs demonstrate the use of the RDB$DB_KEY
value expression in a record selection expression. The programs
sort the EMPLOYEES relation in ascending order of employee ID.
Then, using the first 100 records from the sorted EMPLOYEES
relation, the programs build two arrays: rdb_key_array and rdb_
name_array. In building these arrays within a FOR statement,
these programs create a one-to-one correspondence between the
elements in the rdb_key_array and the rdb_name_array. Each time a
new element is added to each of these arrays the next EMPLOYEES
record from the sorted stream is printed.
This one-to-one correspondence allows the programs to step
through the EMPLOYEES records indirectly. This is demonstrated in
the second FOR statement. The second FOR statement loops through
the rdb_key_array in reverse order; each time the address of
an array element in rdb_key_array is incremented, an EMPLOYEES
record is accessed (also in reverse sorted order) and the
employee's last name is printed.
1.1 – C Example
#include <stdio.h>
DATABASE PERS = FILENAME "PERSONNEL";
main()
{
DECLARE_VARIABLE rdb_key_array[100] SAME AS EMPLOYEES.RDB$DB_KEY;
DECLARE_VARIABLE rdb_name_array[100] SAME AS EMPLOYEES.LAST_NAME;
int cnt = 0;
READY PERS;
START_TRANSACTION READ_ONLY;
FOR FIRST 100 E IN EMPLOYEES SORTED BY E.EMPLOYEE_ID
rdb_key_array[cnt] = E.RDB$DB_KEY;
strcpy (rdb_name_array[cnt], E.LAST_NAME);
printf("%s - 1st pass\n", E.LAST_NAME);
++cnt;
END_FOR;
for ( cnt = --cnt; cnt >= 0; --cnt)
FOR E IN EMPLOYEES
WITH E.RDB$DB_KEY = rdb_key_array[cnt]
if ( strcmp( E.LAST_NAME, rdb_name_array[cnt]) != 0 )
printf("%s DOES NOT MATCH %s\n",
E.LAST_NAME, rdb_name_array[cnt]);
else printf("%s - 2nd pass\n", E.LAST_NAME);
END_FOR;
COMMIT;
FINISH;
}
1.2 – Pascal Example
program db_key (input,output);
DATABASE PERS = FILENAME 'PERSONNEL';
type
Rdb_Key_Type = BASED ON EMPLOYEES.RDB$DB_KEY;
Rdb_Name_Type = BASED ON EMPLOYEES.LAST_NAME;
var
Rdb_Key_Array : ARRAY [1..101] OF Rdb_Key_Type;
Rdb_Name_Array : ARRAY [1..101] OF Rdb_Name_Type;
Cnt : INTEGER := 1;
begin
READY PERS;
START_TRANSACTION READ_ONLY;
FOR FIRST 100 E IN EMPLOYEES SORTED BY E.EMPLOYEE_ID
Rdb_Key_Array[Cnt] := E.RDB$DB_KEY;
Rdb_Name_Array[Cnt] := E.LAST_NAME;
WRITELN(E.LAST_NAME, ' - 1st pass');
Cnt := Cnt + 1;
END_FOR;
for Cnt := Cnt - 1 downto 1 do
FOR E IN EMPLOYEES
WITH E.RDB$DB_KEY = Rdb_Key_array[Cnt]
if E.LAST_NAME <> Rdb_Name_Array[Cnt]
then
writeln (E.LAST_NAME, 'DOES NOT MATCH',
Rdb_Name_Array[Cnt])
else
writeln (E.LAST_NAME, ' - 2nd pass');
END_FOR;
COMMIT;
FINISH;
end.
2 – Format
(B)0[mdb-key =
qqq> context-var qqq> . qqq> [4mRDB$DB_KEY[m qq>
2.1 – Format arguments
context-var A context variable. A temporary name that
you associate with a relation. You define
a context variable in a relation clause.
For more information see the entry on
Context Variables.