orakle
05-15-2003, 03:10 PM
Hi All ,
I am trying to INSERT updated_by and Updated_date with ctut_id and sysdate
When user trying to update any record.
IF USER scott is logged into system and trying to update table
Then I need to get his id number(CTUT_ID) into updated_by
And sysdate into updated_date
Suppose
SQL> select * from ora_system_user;
CTUT_ID CURRENT_USER_ID CREATED_BY CREATED_D UPDATED_BY UPDATED_D
--------- ------------------------------ ---------- --------- ---------- ---------
117 KKING 117 15-MAY-03
118 SCOTT 117 15-MAY-03
119 EXAMPLE1 117 15-MAY-03 117 15-MAY-03
120 EXAMPLE2 117 15-MAY-03 118 15-MAY-03
121 EXAMPLE3 117 15-MAY-03 117 15-MAY-03
Here is my code
SQL> DESC ORA_SYSTEM_USER
Name Null? Type
------------------------------- -------- ----
CTUT_ID NOT NULL NUMBER(12)
CURRENT_USER_ID NOT NULL VARCHAR2(30)
CREATED_BY NUMBER(12)
CREATED_DATE DATE
UPDATED_BY NUMBER(12)
UPDATED_DATE DATE
• PLSQL temporary tables are contained in a package
• To ensure that variables are global is to put in a package
CREATE OR REPLACE PACKAGE SYSTEMUSER as
TYPE t_UPDATED_BY is TABLE OF ora_system_user.UPDATED_BY%TYPE
INDEX BY BINARY_INTEGER;
TYPE t_UPDATED_DATE is TABLE OF ora_system_user.UPDATED_DATE%TYPE
INDEX BY BINARY_INTEGER;
TYPE t_CTUT_ID is TABLE OF ora_system_user.CTUT_ID%TYPE
INDEX BY BINARY_INTEGER;
U_SYSTEMUPDATEDBY T_UPDATED_BY;
U_SYSTEMUPDATEDDATE T_UPDATED_DATE;
U_SYSTEMCTUTID T_CTUT_ID;
U_NUMENTRIES BINARY_INTEGER := 0;
END PA_TDBX_UPD_ORASYSTEMUSER;
• This Trigger will use to insert the values for Created_date and Created_by columns
• A counter variable V_NUMENTRIES is used .
• So that Statement level trigger references it and then resets to zero after processing.
• This is necessary ,so that next statement issued by this session will have the correct value.
CREATE OR REPLACE TRIGGER TIBU_SYSTEMUSER
BEFORE UPDATE ON ORA_SYSTEM_USER
FOR EACH ROW
BEGIN
IF :NEW.CREATED_DATE <> :OLD.CREATED_DATE
THEN
:NEW.CREATED_DATE := :OLD.CREATED_DATE;
END IF;
IF
:NEW.CREATED_BY <> :OLD.CREATED_BY THEN
:NEW.CREATED_BY := :OLD.CREATED_BY;
END IF;
:NEW.UPDATED_DATE := ‘1-JAN-2003’;
:NEW.UPDATED_BY := 0;
SYSTEMUSER.U_NUMENTRIES :=
SYSTEMUSER.U_NUMENTRIES + 1;
SYSTEMUSER.U_SYSTEMUPDATEDBY(SYSTEMUSER.U_NUMENTRIES) := :NEW.UPDATED_BY;
SYSTEMUSER.U_SYSTEMUPDATEDDATE(SYSTEMUSER.U_NUMENTRIES) := :NEW.UPDATED_DATE;
SYSTEMUSER.U_SYSTEMCTUTID(SYSTEMUSER.U_NUMENTRIES) := :NEW.CTUT_ID;
END TIBU_SYSTEMUSER;
/
This Trigger is used to set the columns Created_by, Created_date when inserting values
CREATE OR REPLACE TRIGGER TIAU_ORASYSTEMUSER
AFTER UPDATE ON ORA_SYSTEM_USER
DECLARE
U_ID NUMBER;
U_CTUTID ORA_SYSTEM_USER.CTUT_ID%TYPE;
U_CREATEDBY ORA_SYSTEM_USER.CREATED_BY%TYPE;
U_CREATEDDATE ORA_SYSTEM_USER.CREATED_DATE%TYPE;
CUBY NUMBER(12);
BEGIN
FOR U_LOOPINDEX IN 1..SYSTEMUSER.U_NUMENTRIES LOOP
U_CTUTID := SYSTEMUSER.U_SYSTEMCTUTID(V_LOOPINDEX);
U_CREATEDBY := SYSTEMUSER.U_SYSTEMCREATEDBY(V_LOOPINDEX);
U_CREATEDDATE := SYSTEMUSER.U_SYSTEMCREATEDDATE(V_LOOPINDEX);
SELECT COUNT(*) INTO U_ID
FROM ORA_SYSTEM_USER
WHERE CURRENT_USER_ID = USER;
IF U_ID > 0 THEN
SELECT CTUT_ID INTO CUBY
FROM ORA_SYSTEM_USER
WHERE CURRENT_USER_ID = USER;
UPDATE ORA_SYSTEM_USER
SET CREATED_DATE = SYSDATE,
CREATED_BY = CUBY
WHERE CTUT_ID = U_CTUTID;
ELSE
RAISE_APPLICATION_ERROR(-20000,'NO USER FOUND IN TABLE');
END IF;
END LOOP;
SYSTEMUSER.U_NUMENTRIES := 0;
END TIAU_ORASYSTEMUSER;
I am getting the following errors
SQL> UPDATE ORA_SYSTEM_USER
2 SET CURRENT_USER_ID = 'EXAMPLE10'
3 WHERE CTUT_ID = 119;
UPDATE ORA_SYSTEM_USER
*
ERROR at line 1:
ORA-00036: maximum number of recursive SQL levels (50) exceeded
ORA-00036: maximum number of recursive SQL levels (50) exceeded
ORA-00036: maximum number of recursive SQL levels (50) exceeded
ORA-06512: at "TIAU_ORASYSTEMUSER", line 13
ORA-04088: error during execution of trigger 'KKISHORE.TIAU_ORASYSTEMUSER'
ORA-06512: at " TIAU_ORASYSTEMUSER", line 20
ORA-04088: error during execution of trigger 'KKISHORE.TIAU_ORASYSTEMUSER'
ORA-06512: at " TIAU_ORASYSTEMUSER", line 20
ORA-04088: error during execution of trigger 'KKISHORE.TIAU_ORASYSTEMUSER'
ORA-06512: at "TIAU_ORASYSTEMUSER", line 20
ORA-04088: error during execution of trigger 'KKISHORE.TIAU_ORASYSTEMUSER'
ORA-06512: at " TIAU_ORASYSTEMUSER", line 20
ORA-04088: error during execution of trigger 'KKISHORE.TIAU_ORASYSTEMUSER'
ORA-06512: at "TIAU_ORASYSTEMUSER", line 20
ORA-04088: error during execution of trigger 'KKISHORE.TIAU_ORASYSTEMUSER'
ORA-06512: at "TIAU_ORASYSTEMUSER", line 20
ORA-04088:9 8Hi All ,
I am trying to INSERT updated_by and Updated_date with ctut_id and sysdate
When user trying to update any record.
IF USER scott is logged into system and trying to update table
Then I need to get his id number(CTUT_ID) into updated_by
And sysdate into updated_date
Suppose
SQL> select * from ora_system_user;
CTUT_ID CURRENT_USER_ID CREATED_BY CREATED_D UPDATED_BY UPDATED_D
--------- ------------------------------ ---------- --------- ---------- ---------
117 KKING 117 15-MAY-03
118 SCOTT 117 15-MAY-03
119 EXAMPLE1 117 15-MAY-03 117 15-MAY-03
120 EXAMPLE2 117 15-MAY-03 118 15-MAY-03
121 EXAMPLE3 117 15-MAY-03 117 15-MAY-03
Here is my code
SQL> DESC ORA_SYSTEM_USER
Name Null? Type
------------------------------- -------- ----
CTUT_ID NOT NULL NUMBER(12)
CURRENT_USER_ID NOT NULL VARCHAR2(30)
CREATED_BY NUMBER(12)
CREATED_DATE DATE
UPDATED_BY NUMBER(12)
UPDATED_DATE DATE
• PLSQL temporary tables are contained in a package
• To ensure that variables are global is to put in a package
CREATE OR REPLACE PACKAGE SYSTEMUSER as
TYPE t_UPDATED_BY is TABLE OF ora_system_user.UPDATED_BY%TYPE
INDEX BY BINARY_INTEGER;
TYPE t_UPDATED_DATE is TABLE OF ora_system_user.UPDATED_DATE%TYPE
INDEX BY BINARY_INTEGER;
TYPE t_CTUT_ID is TABLE OF ora_system_user.CTUT_ID%TYPE
INDEX BY BINARY_INTEGER;
U_SYSTEMUPDATEDBY T_UPDATED_BY;
U_SYSTEMUPDATEDDATE T_UPDATED_DATE;
U_SYSTEMCTUTID T_CTUT_ID;
U_NUMENTRIES BINARY_INTEGER := 0;
END PA_TDBX_UPD_ORASYSTEMUSER;
• This Trigger will use to insert the values for Created_date and Created_by columns
• A counter variable V_NUMENTRIES is used .
• So that Statement level trigger references it and then resets to zero after processing.
• This is necessary ,so that next statement issued by this session will have the correct value.
CREATE OR REPLACE TRIGGER TIBU_SYSTEMUSER
BEFORE UPDATE ON ORA_SYSTEM_USER
FOR EACH ROW
BEGIN
IF :NEW.CREATED_DATE <> :OLD.CREATED_DATE
THEN
:NEW.CREATED_DATE := :OLD.CREATED_DATE;
END IF;
IF
:NEW.CREATED_BY <> :OLD.CREATED_BY THEN
:NEW.CREATED_BY := :OLD.CREATED_BY;
END IF;
:NEW.UPDATED_DATE := ‘1-JAN-2003’;
:NEW.UPDATED_BY := 0;
SYSTEMUSER.U_NUMENTRIES :=
SYSTEMUSER.U_NUMENTRIES + 1;
SYSTEMUSER.U_SYSTEMUPDATEDBY(SYSTEMUSER.U_NUMENTRIES) := :NEW.UPDATED_BY;
SYSTEMUSER.U_SYSTEMUPDATEDDATE(SYSTEMUSER.U_NUMENTRIES) := :NEW.UPDATED_DATE;
SYSTEMUSER.U_SYSTEMCTUTID(SYSTEMUSER.U_NUMENTRIES) := :NEW.CTUT_ID;
END TIBU_SYSTEMUSER;
/
This Trigger is used to set the columns Created_by, Created_date when inserting values
CREATE OR REPLACE TRIGGER TIAU_ORASYSTEMUSER
AFTER UPDATE ON ORA_SYSTEM_USER
DECLARE
U_ID NUMBER;
U_CTUTID ORA_SYSTEM_USER.CTUT_ID%TYPE;
U_CREATEDBY ORA_SYSTEM_USER.CREATED_BY%TYPE;
U_CREATEDDATE ORA_SYSTEM_USER.CREATED_DATE%TYPE;
CUBY NUMBER(12);
BEGIN
FOR U_LOOPINDEX IN 1..SYSTEMUSER.U_NUMENTRIES LOOP
U_CTUTID := SYSTEMUSER.U_SYSTEMCTUTID(V_LOOPINDEX);
U_CREATEDBY := SYSTEMUSER.U_SYSTEMCREATEDBY(V_LOOPINDEX);
U_CREATEDDATE := SYSTEMUSER.U_SYSTEMCREATEDDATE(V_LOOPINDEX);
SELECT COUNT(*) INTO U_ID
FROM ORA_SYSTEM_USER
WHERE CURRENT_USER_ID = USER;
IF U_ID > 0 THEN
SELECT CTUT_ID INTO CUBY
FROM ORA_SYSTEM_USER
WHERE CURRENT_USER_ID = USER;
UPDATE ORA_SYSTEM_USER
SET CREATED_DATE = SYSDATE,
CREATED_BY = CUBY
WHERE CTUT_ID = U_CTUTID;
ELSE
RAISE_APPLICATION_ERROR(-20000,'NO USER FOUND IN TABLE');
END IF;
END LOOP;
SYSTEMUSER.U_NUMENTRIES := 0;
END TIAU_ORASYSTEMUSER;
I am getting the following errors
SQL> UPDATE ORA_SYSTEM_USER
2 SET CURRENT_USER_ID = 'EXAMPLE10'
3 WHERE CTUT_ID = 119;
UPDATE ORA_SYSTEM_USER
*
ERROR at line 1:
ORA-00036: maximum number of recursive SQL levels (50) exceeded
ORA-00036: maximum number of recursive SQL levels (50) exceeded
ORA-00036: maximum number of recursive SQL levels (50) exceeded
ORA-06512: at "TIAU_ORASYSTEMUSER", line 13
ORA-04088: error during execution of trigger 'KKISHORE.TIAU_ORASYSTEMUSER'
ORA-06512: at " TIAU_ORASYSTEMUSER", line 20
ORA-04088: error during execution of trigger 'KKISHORE.TIAU_ORASYSTEMUSER'
ORA-06512: at " TIAU_ORASYSTEMUSER", line 20
ORA-04088: error during execution of trigger 'KKISHORE.TIAU_ORASYSTEMUSER'
ORA-06512: at "TIAU_ORASYSTEMUSER", line 20
ORA-04088: error during execution of trigger 'KKISHORE.TIAU_ORASYSTEMUSER'
ORA-06512: at " TIAU_ORASYSTEMUSER", line 20
ORA-04088: error during execution of trigger 'KKISHORE.TIAU_ORASYSTEMUSER'
ORA-06512: at "TIAU_ORASYSTEMUSER", line 20
ORA-04088: error during execution of trigger 'KKISHORE.TIAU_ORASYSTEMUSER'
ORA-06512: at "TIAU_ORASYSTEMUSER", line 20
ORA-04088:9 8Hi All ,