使用 Pl/SQL 语言的动态查询

Dynamic query using Pl/SQL language

提问人:Vamshikrishna Mergu 提问时间:8/30/2023 最后编辑:Vamshikrishna Mergu 更新时间:8/30/2023 访问量:44

问:

如何使用动态 PL/SQL 查询获取日期格式..?dd/mm/yyyy

我尝试了很多选择,但没有任何效果。任何人都可以建议以以下格式获取出生日期的正确方法(dd/mm/yyyy)

V_DYNAMICSQL := 'select to_char(a.dat_of_birth) Date_of_birth
from genmst_customer a'

Execute immediate v_dynamicsql;
Oracle Date PLSQL 日期格式化

评论

1赞 Thorsten Kettner 8/30/2023
为什么需要将日期作为特定格式的字符串?是否要将其写入文件?通常,我们只需选择原始日期,然后让显示日期的应用程序根据用户的设置(例如 Windows 日期设置)对其进行格式化。很少需要用 格式化日期。如果确实需要此格式,请指定格式:。为什么在这里使用动态 SQL?TO_CHARto_char(a.dat_of_birth, 'dd/mm/yyyy')

答:

0赞 Littlefoot 8/30/2023 #1

to_char本身是不够的 - 您还应该提供格式模型

示例表:

SQL> desc genmst_customer
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ENAME                                              VARCHAR2(10)
 DAT_OF_BIRTH                                       DATE

SQL> select * from genmst_customer;

ENAME      DAT_OF_BI
---------- ---------
CLARK      09-JUN-81
KING       17-NOV-81
MILLER     23-JAN-82

PL/SQL程序;注意第 #5 行中的格式模型。我只获取一行:

SQL> set serveroutput on
SQL> declare
  2    v_dynamicsql varchar2(500);
  3    result       varchar2(20);
  4  begin
  5    v_dynamicsql := q'[select to_char(a.dat_of_birth, 'dd/mm/yyyy')]' ||
  6                     ' from genmst_customer a where rownum = 1';
  7    execute immediate v_dynamicsql into result;
  8    dbms_output.put_line('Result = ' || result);
  9  end;
 10  /
Result = 09/06/1981

PL/SQL procedure successfully completed.

SQL>

[编辑],根据您的评论。

如果要使用 alias 和 refcursor,没问题。下面是一个示例:

SQL> create or replace function f_test
  2    return sys_refcursor
  3  is
  4    rc sys_refcursor;
  5  begin
  6    open rc for select name, to_char(dat_of_birth, 'dd/mm/yyyy') as dob
  7                from genmst_customer
  8                where rownum <= 3;
  9    return rc;
 10  end;
 11  /

Function created.

SQL> select f_test from dual;

F_TEST
--------------------
CURSOR STATEMENT : 1

CURSOR STATEMENT : 1

NAME       DOB
---------- ----------
SMITH      17/12/1980
ALLEN      20/02/1981
WARD       22/02/1981


SQL>

评论

0赞 Vamshikrishna Mergu 8/30/2023
如果我想使用该列的别名并使用 sysrefcursor 显示它怎么办
0赞 Littlefoot 8/30/2023
无;如果你愿意,可以使用它。无论是否存在别名,结果仍将位于 RESULT 局部变量中。
0赞 Littlefoot 8/30/2023
我编辑了我的答案并添加了显示您要求的示例。请看一看。
1赞 MT0 8/30/2023 #2

无需使用动态 SQL,因为查询没有任何动态内容。您可以只选择值作为(没有格式),然后在要显示它时,可以使用并提供格式模型:DATETO_CHAR

DECLARE
  v_date_of_birth GENMST_CUSTOMER.DAT_OF_BIRTH%TYPE;
BEGIN
  SELECT dat_of_birth
  INTO   v_date_of_birth
  FROM   genmst_customer
  WHERE  id = 1;

  DBMS_OUTPUT.PUT_LINE(TO_CHAR(v_date_of_birth, 'dd/mm/yyyy'));
END;
/

其中,对于示例数据:

CREATE TABLE genmst_customer (id, dat_of_birth) AS
SELECT 1, DATE '1970-01-01' FROM DUAL UNION ALL
SELECT 2, DATE '1980-01-01' FROM DUAL UNION ALL
SELECT 3, DATE '1990-01-01' FROM DUAL UNION ALL
SELECT 4, DATE '2000-01-01' FROM DUAL;

输出:

01/01/1970

小提琴