0

テーブルを作成し、別のプロシージャを呼び出していくつかの値をテーブルに挿入する動的 SQL を使用するストアド プロシージャがあります。ストアド プロシージャは、いくつかのセッション設定も設定します。その 1 つがNLS_DATE_FORMAT.

このパラメーターは、プロシージャーの実行時には機能しません。SYSTEM(所有者) の下で、ADMINDBA、接続、およびリソースの特権を持つユーザーの下でプロシージャを実行しようとしましたが、目的の形式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)。

ありがとう。

4

1 に答える 1