Cursor Loop
Use of cursors in WHILE and LOOP statements is called a cursor loop. Generally, OPEN, FETCH, and CLOSE statements are called in this kind of loop. The following describes a loop that simplifies a cursor loop without the need for these operations. This mode is applicable to a static cursor loop, without executing four steps about a static cursor.
Precautions
- The UPDATE operation for the queried table is not allowed in the loop statement.
- The variable loop_name is automatically defined and is valid only in this loop. Its type is the same as that in the query result of select_statement. The value of loop_name is the query result of select_statement.
- The specific type of the loop_name variable is not parsed during compilation. If the specific type needs to be parsed (for example, loop_name is used as the input and output parameters of an overloaded function or stored procedure), a compilation error is reported.
- The %FOUND, %NOTFOUND, and %ROWCOUNT attributes access the same internal variable in GaussDB. Transactions and the anonymous block do not support multiple cursor accesses at the same time.
Examples
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
gaussdb=# BEGIN FOR ROW_TRANS IN SELECT first_name FROM hr.staffs LOOP DBE_OUTPUT.PRINT_LINE (ROW_TRANS.first_name ); END LOOP; END; / -- Execution result: gaussdb=# Tom ANONYMOUS BLOCK EXECUTE -- Create a table. gaussdb=# CREATE TABLE integerTable1( A INTEGER) DISTRIBUTE BY hash(A); gaussdb=# CREATE TABLE integerTable2( B INTEGER) DISTRIBUTE BY hash(B); gaussdb=# INSERT INTO integerTable2 VALUES(2); -- Multiple cursors share the parameters of cursor attributes. gaussdb=# DECLARE CURSOR C1 IS SELECT A FROM integerTable1;-- Declare the cursor. CURSOR C2 IS SELECT B FROM integerTable2; PI_A INTEGER; PI_B INTEGER; BEGIN OPEN C1;-- Open the cursor. OPEN C2; FETCH C1 INTO PI_A; ---- The values of C1%FOUND and C2%FOUND are FALSE. FETCH C2 INTO PI_B; ---- The values of C1%FOUND and C2%FOUND are TRUE. -- Determine the cursor status. IF C1%FOUND THEN IF C2%FOUND THEN DBE_OUTPUT.PRINT_LINE('Dual cursor share parameter.'); END IF; END IF; CLOSE C1;-- Close the cursor. CLOSE C2; END; / ANONYMOUS BLOCK EXECUTE -- Delete the temporary table. gaussdb=# DROP TABLE integerTable1; gaussdb=# DROP TABLE integerTable2; |
Feedback
Was this page helpful?
Provide feedbackThank you very much for your feedback. We will continue working to improve the documentation.