There is an action block that has multiple READ statements with the (Select Only) flag set. Following the READ statements is a CREATE that does an ASSOCIATE to the entities referenced in the READ statements. The generated code creates a CURSOR FOR (with 'SELECT ... FOR UPDATE OF ...') for the READ statements. Why is there a CURSOR FOR when the (Select Only) flag is set?
Action Block code:
+=>READ (Select Only) db_key Entity1
! WHERE DESIRED db_key Entity1 Attr1 = Attr1nr
+> WHEN successful
+> WHEN not found
+--
+=>READ (Select Only) db_key Entity2
! WHERE DESIRED db_key Entity2 Attr2 = Attr2nr
+> WHEN successful
+> WHEN not found
+--
+->CREATE Entity3
! SET ... TO ...
! ASSOCIATE WITH db_key Entity1 WHICH ... IT
! ASSOCIATE WITH db_key Entity2 WHICH ... IT
+> WHEN successful
+> WHEN already exists
+--
Generated code:
EXEC SQL DECLARE CUR_1234567890_1 CURSOR FOR
SELECT
...
FOR UPDATE OF ...
Release : 8.6
Component : Gen Generators
The CREATE statement is making ASSOCIATE calls that reference the entities that were just read. So, the generator will always generate a cursor regardless of the 'Select Only' property because the row needs to be locked as it is being referenced in the UPDATE generated to do the ASSOCIATE.
Related article: SELECT 'FOR UPDATE' statements in Gen generated code