At 06:43 a.m. 13/10/2015, [email protected] [firebird-support] wrote:
>I have 2 questions from the code below.
>
>Where do you come up with RDB$FIELD_NAME?
It is a column in the system table RDB$RELATION_FIELDS. The RDB$-- tables
exist in all Firebird databases. They store your metadata. Look in Appendix V
of Vol. 2. They are useful for examples in a book, since you can query them
yourself.
>How can you use :RNAME IN THE WHERE clause?
In PSQL, you can.
>Where is it getting its value from? It seems like it is just a variable in
>psql without being assigned a value.
You have misquoted the example text; but the variable RNAME is declared
beneath the header. In the declaration of the cursor, it is a placeholder for
the value that will be assigned to it in the FOR...SELECT loop (which you have
misquoted).
>...
>
>AS
>
> DECLARE RNAME CHAR(31)
>
> DECLARE FNAME CHAR(31)
>
> DECLARE C CURSOR FOR
>
>(SELECT RDB$FIELD_NAME FROM RDB$RELATION_FIELDS
>
>WHERE RDB$RELATION_NAME = :RNAME
>
>ORDER BY...);
The above sets up the explicit cursor but it's not opened yet.
Keyword FOR (missing from your pruned example) sets up an implicit cursor that
is
going to embed the explict one - the objective of the example
FOR
SELECT RDB$RELATION_NAME /* a value */
INTO :RNAME /* the previously declared variable */
DO
BEGIN
OPEN C; /* open the cursor, for which the variable RNAME now has a value
obtained from the FOR SELECT loop */
... /* Inside the block, the current RNAME variable enables the cursor to
fetch all the RDB$FIELD_NAME values for that relation into the
variable FNAME; the SUSPEND statement in there passes the
current FNAME value to a buffer, which the caller is retrieving with
a SELECT .... from <selectable SP> statement. */
CLOSE C;
...
END
That BEGIN...END block will be executed until the FOR loop runs out of "next"
values for the variable RNAME.
...
END
HTH,
Helen