2013-02-04 28 views
1

是否有任何实用程序从Oracle to_char格式模式返回java.text.SimpleDateFormat模式?Oracle日期模式到java日期模式

create or replace type type_sample as object (
    f_id number, 
    f_name varchar2(100), 
    f_start_date date, 
    f_end_date date 
) 
/

SET SERVEROUTPUT ON 
DECLARE 
    xmltype1   SYS.XMLType; 
    message    type_sample; 
BEGIN 
    message := new type_sample(1, 'Manohar', current_date, sysdate); 
    xmltype1 := XMLtype.createXML(message); 
    DBMS_OUTPUT.PUT_LINE('out_errm : '|| xmltype1.getStringVal()); 
END; 
/

<TYPE_SAMPLE><F_ID>1</F_ID><F_NAME>Manohar</F_NAME><F_START_DATE>26-JAN-13</F_START_DATE>**<F_END_DATE>26-JAN-13</F_END_DATE>**</TYPE_SAMPLE> 

我有上面的XML来自DataBase。这里的日期格式是基于会话运行上述代码的不同格式。

我在这里可以做的是,可以从java端获得该会话的dateformat模式。如果我可以将dateformat模式(oracle db)转换为java.text.SimpleDateFormat模式,我的问题就解决了。你能帮我解决吗?


我在这里没有得到预期的答案。可能是我的介绍没有清楚地解释问题。

现在我会问一个简单的问题。据我所知java.text.SimpleDateFormat毕竟是java.text.DateFormat的一个实现。日期格式的此实现可以了解以下模式字母

G Era designator 
y Year 
M Month in year 
w Week in year 
W Week in month 
D Day in year 
d Day in month 
F Day of week in month 
E Day in week 
a Am/pm marker 
H Hour in day (0-23) 
k Hour in day (1-24) 
K Hour in am/pm (0-11) 
h Hour in am/pm (1-12) 
m Minute in hour 
s Second in minute 
S Millisecond 
z Time zone 
Z Time zone 

是否有java.text.DateFormat中的任何其他实现,通过它可以了解其他一些模式信集团?如果有的话,请让我知道。

+0

我通常不会主张将日期放入字符串中,但是因为它将隐式地为XML负载完成......无论如何将对象字段设置为varchars并使用'to_char ()'在创建对象时使用明确的格式掩码?将会话NLS排除在等式之外,而Java方面只需要识别一种格式。不知道您是否可以在对象内强制执行格式 - 可能是接受日期并进行转换的构造函数? –

+0

谢谢亚历克斯。但是我们有很多现有的类型,其中日期字段已经存在。重新定义这些类型对于我和我们的团队来说是一项乏味的任务。我的疑问是,我可以将会话的nls格式字符串传递给java端。有没有什么办法从该数据库的nls字符串中绘制java.text.SimpleDateFormat字符串?因为格式化模式不同于Oracle到Java。 例如05-Feb-2013在oracle中被表示为DD-MON-YYYY,并且在java中它是dd-MMM-yyyy。 – Manohar

+0

您不能将'NLS_DATE_FOTMAT'设置为从应用程序启动的所有会话都相同吗?当连接打开时,或者使用登录触发器显式地使用'alter session',或许? –

回答

0

来自XML的日期之一是26-JAN-13。这将是“DD-MMM-YY”的SimpleDateFormat

SimpleDateFormat oracleFormat = new SimpleDateFormat("dd-MMM-yy"); 
Date date = oracleFormat.parse(dateString); 
0

你问的不太一样,但这里有一个不同的方法,以避免会话的NLS参数的不确定性。你可以做的对象转换发生,所以你可以使用一个明确的日期格式掩码,它已经是一个字符串时,将其转换为XML:

create or replace type type_sample as object (
    f_id number, 
    f_name varchar2(100), 
    f_start_date varchar2(10), 
    f_end_date varchar2(10), 
    constructor function type_sample(self in out nocopy type_sample, 
     f_id number, f_name varchar2, f_start_date date, f_end_date date) 
     return self as result 
) 
/

create or replace type body type_sample as 
    constructor function type_sample(self in out nocopy type_sample, 
     f_id number, f_name varchar2, f_start_date date, f_end_date date) 
     return self as result is 
    begin 
     self.f_id := f_id; 
     self.f_name := f_name; 
     self.f_start_date := to_char(f_start_date, 'YYYY-MM-DD'); 
     self.f_end_date := to_char(f_end_date, 'YYYY-MM-DD'); 
     return; 
    end; 
end; 
/

有你如何创建对象没有变化:

set serveroutput on 
declare 
    xmltype1 sys.xmltype; 
    message type_sample; 
begin 
    message := new type_sample(1, 'Manohar', current_date, sysdate); 
    xmltype1 := xmltype.createxml(message); 
    dbms_output.put_line('out_errm : '|| xmltype1.getStringVal()); 
end; 
/

out_errm : <TYPE_SAMPLE><F_ID>1</F_ID><F_NAME>Manohar</F_NAME><F_START_DATE>2013-02-04</F_START_DATE><F_END_DATE>2013-02-04</F_END_DATE></TYPE_SAMPLE> 

的日期始终是在XML格式YYYY-MM-DD不管会话的NLS_DATE_FORMAT(这恰好是在本次会议DD-MON-RR)的。你当然可以使用任何你想要的固定格式,你只需要同意对象和Java之间的格式。

(我想我假设这是唯一的对象将被用于;否则把日期字符串不是一个好主意......)。