mirror of
https://github.com/FirebirdSQL/firebird.git
synced 2025-01-22 20:43:02 +01:00
Added some docs.
This commit is contained in:
parent
90901bc746
commit
d44367f80b
65
doc/sql.extensions/README.cursors
Normal file
65
doc/sql.extensions/README.cursors
Normal 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.
|
64
doc/sql.extensions/README.leave_labels
Normal file
64
doc/sql.extensions/README.leave_labels
Normal 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.
|
Loading…
Reference in New Issue
Block a user