8
0
mirror of https://github.com/FirebirdSQL/firebird.git synced 2025-01-22 14:03:03 +01:00

Added some docs.

This commit is contained in:
dimitr 2005-01-06 18:32:22 +00:00
parent 90901bc746
commit d44367f80b
2 changed files with 129 additions and 0 deletions

View File

@ -0,0 +1,65 @@
---------------------
PSQL cursors (FB 2.0)
---------------------
Function:
Allows explicit cursor operations.
Author:
Dmitry Yemanov <dimitr@users.sf.net>
Syntax rules:
DECLARE [VARIABLE] <cursor_name> CURSOR FOR ( <select_statement> );
OPEN <cursor_name>;
FETCH <cursor_name> INTO <var_name> [, <var_name> ...];
CLOSE <cursor_name>;
Example(s):
1. DECLARE C CURSOR FOR ( SELECT RDB$RELATION_NAME
FROM RDB$RELATIONS );
BEGIN
OPEN C;
WHILE (1 = 1) DO
BEGIN
FETCH C INTO :RNAME;
IF (ROW_COUNT = 0) THEN
LEAVE;
SUSPEND;
END
CLOSE C;
END
2. 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 RDB$FIELD_POSITION );
BEGIN
FOR
SELECT RDB$RELATION_NAME
FROM RDB$RELATIONS
INTO :RNAME
DO
BEGIN
OPEN C;
FETCH C INTO :FNAME;
CLOSE C;
SUSPEND;
END
END
Note(s):
1. Cursor declaration is allowed only in the beginning of a PSQL block/procedure/trigger
(like a regular local variable declaration).
2. Cursor names are required to be unique in the given context. They cannot interfere
with FOR SELECT cursor (declared via the AS CURSOR clause) names. But a cursor can
share its name with any variable in this context, as possible operations are different.
3. Positioned updates and deletes with cursors using the WHERE CURRENT OF clause are allowed.
4. Attempts to fetch from or close a FOR SELECT cursor are prohibited.
5. Attempts to open cursor which is already open, as well as to fetch from or close cursor
which is already closed, will fail.
6. All cursors which were not explicitly closed will be closed automatically on exit of
the current PSQL block/procedure/trigger.
7. ROW_COUNT system variable can be used to check whether the last FETCH statement returned
any row.

View File

@ -0,0 +1,64 @@
----------------------------------------
PSQL labels and LEAVE statement (FB 2.0)
----------------------------------------
Function:
Allows to stop execution of the current block and unwind to the specified label.
After that execution continues from the statement following by the terminated loop statement.
Author:
Dmitry Yemanov <dimitr@users.sf.net>
Syntax rules:
<label_name>: <loop_statement>
...
LEAVE [<label_name>]
Where <loop_statement> is one of: WHILE, FOR SELECT, FOR EXECUTE STATEMENT
Example(s):
1. FOR
SELECT COALESCE(RDB$SYSTEM_FLAG, 0), RDB$RELATION_NAME
FROM RDB$RELATIONS
ORDER BY 1
INTO :RTYPE, :RNAME
DO
BEGIN
IF (RTYPE = 0) THEN
SUSPEND;
ELSE
LEAVE; -- exits current loop
END
2. CNT = 100;
L1:
WHILE (CNT >= 0) DO
BEGIN
IF (CNT < 50) THEN
LEAVE L1; -- exists WHILE loop
CNT = CNT - l;
END
3. STMT1 = 'SELECT RDB$RELATION_NAME FROM RDB$RELATIONS';
L1:
FOR
EXECUTE STATEMENT :STMT1 INTO :RNAME
DO
BEGIN
STMT2 = 'SELECT RDB$FIELD_NAME FROM RDB$RELATION_FIELDS WHERE RDB$RELATION_NAME = ';
L2:
FOR
EXECUTE STATEMENT :STMT2 || :RNAME INTO :FNAME
DO
BEGIN
IF (RNAME = 'RDB$DATABASE') THEN
LEAVE L1; -- exits the outer loop
ELSE IF (RNAME = 'RDB$RELATIONS') THEN
LEAVE L2; -- exits the inner loop
ELSE
SUSPEND;
END
END
Note(s):
LEAVE without explicit lable means interrupting the current (most inner) loop.