テーブルを作成し、別のプロシージャを呼び出していくつかの値をテーブルに挿入する動的 SQL を使用するストアド プロシージャがあります。ストアド プロシージャは、いくつかのセッション設定も設定します。その 1 つがNLS_DATE_FORMAT
.
このパラメーターは、プロシージャーの実行時には機能しません。SYSTEM
(所有者) の下で、ADMIN
DBA、接続、およびリソースの特権を持つユーザーの下でプロシージャを実行しようとしましたが、目的の形式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 を調べましたが、私が見つけた最良の方法は、各ユーザーのログオン後に値を設定するトリガーでした。私はこれに反対しているわけではありませんが、次のセッション パラメータを設定するトリガーを作成することなく、パラメータを 1 回設定するよりグローバルな方法があるかどうかを調べたいと思います。
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
)。
ありがとう。