有没有一种方法可以将alter查询嵌入到oracle sql过程中?

时间:2020-04-23 00:17:55

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

我正在尝试创建一个可以调用的过程,该过程将更改日期格式,并且出现一些问题并且可以使用一些帮助。

如果我尝试此代码:

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

任何见识将不胜感激。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

如果要使用大量动态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。打算更改日期格式,以便不同的客户端可以查看其首选格式的数据。在存储过程中设置格式使我想知道是否要设置它来修复某些愚蠢地假定为特定日期格式的程序。您应该从不必须更改会话级别日期格式以使程序正常工作。如果真是这样,那么最好修改原始程序并删除任何隐式日期转换。 (另一方面,我们不能始终控制源代码,因此有时需要这些解决方案。)