【问题标题】:Is there a way to embed an alter query into a oracle sql procedure?有没有办法将更改查询嵌入到 oracle sql 过程中?
【发布时间】:2020-08-06 04:33:33
【问题描述】:

我正在尝试创建一个我可以调用的过程,它会改变日期格式,我遇到了一些问题,可以使用一些帮助。

如果我试试这个代码:

create or replace PROCEDURE DATE_SESSION IS 

BEGIN
    ALTER SESSION SET NLS_date_format = 'MM/DD/YYYY';
END;

我收到此错误:

Error starting at line : 1 in command -
DATE_SESSION
Error report -
Unknown Command

如果我尝试这段代码:

create or replace PROCEDURE DATE_SESSION IS 

    BEGIN
        EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_date_format = 'MM/DD/YYYY';';
    END;

然后执行它:

DATE_SESSION

我收到此错误:

Error starting at line : 1 in command -
DATE_SESSION
Error report -
Unknown Command

任何见解将不胜感激。

【问题讨论】:

    标签: oracle stored-procedures plsql oracle-sqldeveloper procedure


    【解决方案1】:

    你必须使用双撇号。
    我不建议丢弃日期值的时间部分。

    BEGIN
        EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_date_format=''MM/DD/YYYY''';
    END;
    

    【讨论】:

      【解决方案2】:

      如果您要使用大量动态 SQL,则值得学习替代引用语法。这种语法让我们可以在代码中嵌入代码,而不会增加单引号的数量。这使代码更具可读性和更易于测试。

      create or replace procedure date_session is 
      begin
          execute immediate
          q'[
              alter session set nls_date_format = 'MM/DD/YYYY'
          ]';
      end;
      /
      

      但是,我想知道这个问题是否是X-Y problem。更改日期格式的目的是为了让不同的客户可以以他们喜欢的格式查看数据。在存储过程中设置格式让我想知道它是否被设置为修复一些愚蠢地假设特定日期格式的程序。您应该永远必须更改会话级别的日期格式才能使程序正常工作。如果是这种情况,最好修改原始程序并删除任何隐式日期转换。 (另一方面,我们不能总是控制源代码,所以这些解决方案有时是必要的。)

      【讨论】:

      • 每日提示:将其转换为内部日期后,您可以完全忽略格式。只有在再次输出时才需要它。然后明确指定您想要的格式。
      • 感谢乔恩的反馈。是的,这是上游采购日期翻译操作。我无法控制它们的格式,但在我的查询上运行它以确保所有日期都符合这种格式。我可能应该只运行 TO_DATE(,'MM/DD/YYY')。这可能是一条更好的前进道路。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-03
      • 1970-01-01
      • 2019-09-02
      相关资源
      最近更新 更多