If you are trying to run something like ALTER SESSION SET in logon trigger you will get
ORA-04092 or if you are trying to do it with DBMS_SESSION you will get ORA-06512.
The solution is to create a procedure and then call procedure from the trigger i.e.:
--
-- procedure to set NLS_DATE_FORMAT using DBMS_SESSION package
--
CREATE OR REPLACE PROCEDURE SET_NLSDATEFORMAT AS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
DBMS_SESSION.SET_NLS('NLS_DATE_FORMAT','YYYYMMDD');
COMMIT;
END;
/
- OR -
--
-- procedure to set NLS_TIMESTAMP_TZ_FORMAT using dynamic sql
--
CREATE OR REPLACE PROCEDURE SET_NLSTIMESTAMPFORMAT AS
PRAGMA AUTONOMOUS_TRANSACTION;
i NUMBER;
x INTEGER;
v_format VARCHAR2(50);
BEGIN
i:=dbms_sql.open_cursor;
v_format := 'YYYYMMDD HH24:MI:SS';
dbms_sql.parse(i,'ALTER SESSION SET nls_date_format=''' || v_format || '''',
DBMS_SQL.NATIVE);
x:=dbms_sql.execute(i);
dbms_sql.parse(i,'ALTER SESSION SET nls_timestamp_tz_format=''' || v_format || '''',
DBMS_SQL.NATIVE);
x:=dbms_sql.execute(i);
dbms_sql.parse(i,'ALTER SESSION SET nls_timestamp_format=''' || v_format || '''',
DBMS_SQL.NATIVE);
x:=dbms_sql.execute(i);
dbms_sql.close_cursor(i);
COMMIT;
EXCEPTION
WHEN OTHERS THEN
IF DBMS_SQL.IS_OPEN(i) THEN
DBMS_SQL.CLOSE_CURSOR(i);
END IF;
RAISE;
END;
/
--
-- logon trigger to set session parameters when user connects to database
--
CREATE OR REPLACE TRIGGER SET_NLSDATEFORMAT_ONLOGIN AFTER LOGON ON DATABASE
DECLARE
uname VARCHAR2(50);
BEGIN
uname := SYS_CONTEXT('USERENV','SESSION_USER');
IF uname = 'SCOTT' THEN
--SET_NLSDATEFORMAT;
SET_NLSTIMESTAMPFORMAT;
END IF;
END;
/
You could use the above trigger and stored procedure to modify other session parameters for a
specific user.
|