我有一个带有动态 SQL 的存储过程,它创建一个表并调用另一个过程将一些值插入到表中。存储过程还设置了一些会话设置,其中之一是NLS_DATE_FORMAT
.
程序运行时,此参数不起作用。我已经尝试在SYSTEM
(所有者)和ADMIN
具有 DBA、Connect 和 Resource 权限的用户下运行该过程,但它总是以格式DD-MON-RR
而不是所需的MM/DD/YYYY
. 在 SQL Developer 中,在 DBA->Database Configuration->Current Database Properties 下,NLS_DATE_FORMAT
也以DD-MON-RR
.
有没有办法为整个数据库改变这个?我找到并尝试了以下方法,但它根本不起作用(这包括停止和重新启动数据库):
ALTER SYSTEM SET NLS_DATE_FORMAT = 'MM/DD/YYYY' SCOPE=SPFILE;
我查看了 SPFILE 和 init.ora 的答案,但我发现最好的是一个触发器,它会在每个用户登录后设置值。我不反对这一点,但我想知道是否有一种更全局的方式来设置参数一次,而无需创建设置以下会话参数的触发器:
ALTER SESSION SET NLS_DATE_FORMAT = 'MM/DD/YYYY';
这是我的存储过程的相关部分:
CREATE OR REPLACE
PROCEDURE DATE_DIM_PROCEDURE(P_DATE DATE)
AUTHID CURRENT_USER --Not sure why this is needed since my only two users, but it throws an error without it
IS
V_START_DATE DATE := '01/01/1950';
V_CURRENT_DATE DATE := V_START_DATE;
V_END_DATE DATE := '12/31/2099';
BEGIN
EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_LANGUAGE = ''AMERICAN'' ';
EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_TERRITORY = ''AMERICA'' ';
EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_CALENDAR = ''GREGORIAN'' ';
EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_DATE_FORMAT = ''MM/DD/YYYY'' ';
EXECUTE IMMEDIATE 'CREATE TABLE (...)';
WHILE V_CURRENT_DATE <= V_END_DATE
NEW_DATE(P_DATE); --Procedure call that inserts values into table
LOOP;
END DATE_DIM_PROCEDURE;
一旦过程运行(并调用后续过程来插入值),当我打开表时,对于任何用户,NLS_DATE_FORMAT
都没有改变(即它仍然是格式DD-MON-RR
而不是MM/DD/YYYY
)。
谢谢。