提问人:Vamshikrishna Mergu 提问时间:8/30/2023 最后编辑:Vamshikrishna Mergu 更新时间:8/30/2023 访问量:44
使用 Pl/SQL 语言的动态查询
Dynamic query using Pl/SQL language
问:
如何使用动态 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;
答:
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,因为查询没有任何动态内容。您可以只选择值作为(没有格式),然后在要显示它时,可以使用并提供格式模型:DATE
TO_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
评论
TO_CHAR
to_char(a.dat_of_birth, 'dd/mm/yyyy')