Discussions
Categories
- 196.9K All Categories
- 2.2K Data
- 239 Big Data Appliance
- 1.9K Data Science
- 450.3K Databases
- 221.7K General Database Discussions
- 3.8K Java and JavaScript in the Database
- 31 Multilingual Engine
- 550 MySQL Community Space
- 478 NoSQL Database
- 7.9K Oracle Database Express Edition (XE)
- 3K ORDS, SODA & JSON in the Database
- 546 SQLcl
- 4K SQL Developer Data Modeler
- 187K SQL & PL/SQL
- 21.3K SQL Developer
- 295.9K Development
- 17 Developer Projects
- 138 Programming Languages
- 292.6K Development Tools
- 107 DevOps
- 3.1K QA/Testing
- 646K Java
- 28 Java Learning Subscription
- 37K Database Connectivity
- 155 Java Community Process
- 105 Java 25
- 22.1K Java APIs
- 138.1K Java Development Tools
- 165.3K Java EE (Java Enterprise Edition)
- 18 Java Essentials
- 160 Java 8 Questions
- 86K Java Programming
- 80 Java Puzzle Ball
- 65.1K New To Java
- 1.7K Training / Learning / Certification
- 13.8K Java HotSpot Virtual Machine
- 94.3K Java SE
- 13.8K Java Security
- 204 Java User Groups
- 24 JavaScript - Nashorn
- Programs
- 442 LiveLabs
- 38 Workshops
- 10.2K Software
- 6.7K Berkeley DB Family
- 3.5K JHeadstart
- 5.7K Other Languages
- 2.3K Chinese
- 171 Deutsche Oracle Community
- 1.1K Español
- 1.9K Japanese
- 232 Portuguese
how to fetch data into the cursor.

Hi using cursor, i need to fetch the end date from fnd_user table and update it in XXDEV_CU165_HR_APPR_LIMITS table.How to achieve this.
PROCEDURE XX_PROC IS
CURSOR CUR_INACTIVE_USER IS
SELECT fu.user_id,fu.end_date
FROM fnd_user fu, cu165_hr_appr_limits hral,
where fu.employee_id =hral.person_id
AND fu.end_date IS NOT NULL;
BEGIN
FOR rec_inactive_user IN cur_inactive_user LOOP
UPDATE XXDEV_CU165_HR_APPR_LIMITS HRAL
SET HRAL.END_DATE_ACTIVE = (
SELECT FU.END_DATE
FROM FND_USER FU
WHERE FU.EMPLOYEE_ID = HRAL.PERSON_ID
)
WHERE EXISTS(
SELECT 1
FROM FND_USER FU
WHERE FU.EMPLOYEE_ID = HRAL.PERSON_ID
AND FU.END_DATE IS NOT NULL
)
AND (
HRAL.END_DATE_ACTIVE IS NULL
OR
HRAL.END_DATE_ACTIVE > sysdate
);
END LOOP;
COMMIT;
END XX_PROC;
Answers
-
Using PL/SQL for something that can be done via relatively simple SQL statement is in most cases inefficient. Anyway:
CREATE OR REPLACE PROCEDURE XX_PROC IS CURSOR CUR_INACTIVE_USER IS SELECT FU.EMPLOYEE_ID, FU.END_DATE FROM FND_USER FU, CU165_HR_APPR_LIMITS HRAL, WHERE FU.EMPLOYEE_ID = HRAL.PERSON_ID AND FU.END_DATE IS NOT NULL AND ( HRAL.END_DATE_ACTIVE IS NULL OR HRAL.END_DATE_ACTIVE > SYSDATE ); BEGIN FOR REC_INACTIVE_USER IN CUR_INACTIVE_USER LOOP UPDATE XXDEV_CU165_HR_APPR_LIMITS HRAL SET HRAL.END_DATE_ACTIVE = REC_INACTIVE_USER.END_DATE WHERE HRAL.PERSON_ID = REC_INACTIVE_USER.EMPLOYEE_ID; END LOOP; COMMIT; END XX_PROC; /
SY.
-
Why do you need the cursor? One update is enough and is definitely more efficient than that cursor loop.
-
Here the requirement is
We need the closing of NASA user access to simultaneously close the same users “ fuldmagter” in the Fuldmagtsregister in NASA. Consequently the closing functionality in the FMP will have to be changed to immediately closing instead of closing the “ Fuldmagt” within the change to a new date, and we need the Fuldmagtsregister table to be linked to the NASA user Table.
Here cu165_hr_appr_limits is a Fuldmagtsregister table and fnd_user is the NASA user Table.so i thought of using cursor loop to update.
Is this the efficient way to achieve above requriment
CREATE OR REPLACE PROCEDURE XX_PROC IS CURSOR CUR_INACTIVE_USER IS SELECT FU.EMPLOYEE_ID, FU.END_DATE FROM FND_USER FU, CU165_HR_APPR_LIMITS HRAL, WHERE FU.EMPLOYEE_ID = HRAL.PERSON_ID AND FU.END_DATE IS NOT NULL AND ( HRAL.END_DATE_ACTIVE IS NULL OR HRAL.END_DATE_ACTIVE > SYSDATE ); BEGIN FOR REC_INACTIVE_USER IN CUR_INACTIVE_USER LOOP UPDATE XXDEV_CU165_HR_APPR_LIMITS HRAL SET HRAL.END_DATE_ACTIVE = REC_INACTIVE_USER.END_DATE WHERE HRAL.PERSON_ID = REC_INACTIVE_USER.EMPLOYEE_ID; END LOOP; COMMIT; END XX_PROC; /
-
Is this the efficient way to achieve above requriment
no. Use
MERGE
instead.merge into REC_INACTIVE_USER hral using ( /* sql from cursor */ SELECT FU.EMPLOYEE_ID, FU.END_DATE FROM FND_USER FU, CU165_HR_APPR_LIMITS HRAL, WHERE FU.EMPLOYEE_ID = HRAL.PERSON_ID AND FU.END_DATE IS NOT NULL AND ( HRAL.END_DATE_ACTIVE IS NULL OR HRAL.END_DATE_ACTIVE > SYSDATE ) ) REC_INACTIVE_USER on ( HRAL.PERSON_ID = REC_INACTIVE_USER.EMPLOYEE_ID ) /* same WHERE clause */ When matched then update set HRAL.END_DATE_ACTIVE = REC_INACTIVE_USER.END_DATE; /* same SET clause */