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.See the reply and handling status in My Cloud VOC.
For any further questions, feel free to contact us through the chatbot.
Chatbot