Home » SQL & PL/SQL » SQL & PL/SQL » XML trouble. (Oracle 11g R1/win7)
XML trouble. [message #452867] Sun, 25 April 2010 13:40 Go to next message
Squall616
Messages: 18
Registered: April 2010
Location: Poland
Junior Member
First of all, welcome everyone Wink

I have a big problem that came up latly which is importing XML files into oracle database.
The point is that I have extracted whole PostgreSQL database into XML files - 236 tables - 1 XML file for every table and now I'm about to import them into Oracle tables.
First of all, I would like to point out that I already have the structure of all the tables in oracle database, the files only carry the data (records) that need to be imported into oracle.

I've been trying to make it running and I can't do anything more serious about it for over a week :/

I will show You all example:
insert into ps_sprawozdania(miesiac, umowa_rok, umowa_nr, nr_korekty, nazwa, data_potw, data_exp, status_potw)
 select
   extractvalue(column_value,'/NewDataSet/Cust/miesiac'),
   extractvalue(column_value,'/NewDataSet/Cust/umowa_rok'),
   extractvalue(column_value,'/NewDataSet/Cust/umowa_nr'),
   extractvalue(column_value,'/NewDataSet/Cust/nr_korekty'),
   extractvalue(column_value,'/NewDataSet/Cust/nazwa'),
   extractvalue(column_value,'/NewDataSet/Cust/data_potw'),
   extractvalue(column_value,'/NewDataSet/Cust/data_exp'),
   extractvalue(column_value,'/NewDataSet/Cust/status_potw')
from table(xmlsequence(xmltype(bfilename('c:\test\','ps_sprawozdania.xml'))));


That was one of my attempts to import data from file "ps_sprawozdania.xml" into table "ps_sprawozdnaia" into oracle.
Here are 2 records from the XML file to show you Its structure
 <NewDataSet>
 <Cust>
  <miesiac>7</miesiac> 
  <umowa_rok>2008</umowa_rok> 
  <umowa_nr>051/210412/01/000/08</umowa_nr> 
  <nr_korekty>0</nr_korekty> 
  <nazwa>Sprawozdanie z realizacji umowy nr 051/210412/01/000/08 za miesiąc Lipiec</nazwa> 
  <data_potw>2008-07-29T00:00:00+02:00</data_potw> 
  <data_exp>2008-07-29T00:00:00+02:00</data_exp> 
  <status_potw>Z</status_potw> 
  </Cust>
 <Cust>
  <miesiac>2</miesiac> 
  <umowa_rok>2007</umowa_rok> 
  <umowa_nr>051/210412/10/000/07</umowa_nr> 
  <nr_korekty>0</nr_korekty> 
  <nazwa>Sprawozdanie z realizacji umowy nr 051/210412/10/000/07 za miesiąc Luty</nazwa> 
  <status_potw>N</status_potw> 
  </Cust>
</NewDataSet>


And I've heard that this method CAN work, yet I can't make it working :/

The other way I've found on this forum is more nice and clear and I would be very grateful if anyone could help me show how to conver it to my situation.
declare 
  insCtx DBMS_XMLSave.ctxType;
  v_tablename VARCHAR2(30) := 'test' ;
  v_rows number; 
  v_record_count number; 
  java_uncaught_exception   EXCEPTION;
  PRAGMA EXCEPTION_INIT( java_uncaught_exception , -29532 );
begin
  insctx := DBMS_XMLSave.newcontext(v_tablename); 
  DBMS_XMLSave.setRowTag(insctx,'rowtest'); 
  DBMS_XMLSave.setDateFormat(insctx,'dd/MM/yyyy');
  DBMS_XMLSave.setPreserveWhitespace(insctx);
  DBMS_XMLSave.propagateoriginalexception (insCtx, true);
        v_rows := DBMS_XMLSave.insertxml(insctx,'<?xml version = ''1.0''?><test><rowtest><C1>7</C1>2<C2></C2><C3>02/08/2009</C3></rowtest><rowtest><C1>5</C1><C2>3</C2><C3>01/01/2008</C3></rowtest></test>');
  DBMS_XMLSave.closeContext(insctx);

  v_record_count := v_record_count + 1;
  dbms_output.put_line(v_rows);
  dbms_output.put_line(v_record_count);
EXCEPTION
  WHEN java_uncaught_exception THEN
  DBMS_OUTPUT.put_line (   'Error inserting to table! '
                                     || v_tablename
                                     || ' - '
                                     || SUBSTR (SQLERRM, 1, 175)
                                    );
  WHEN DUP_VAL_ON_INDEX THEN
    NULL;
  WHEN OTHERS THEN
    DBMS_OUTPUT.put_line (   'Error inserting to table '
                                     || v_tablename
                                     || ' - '
                                     || SUBSTR (SQLERRM, 1, 175)
                                    );
END;



The point is that in this example you handle with XML data, not XML files like I need to do :/

If anyone would be so kind to help me and solve this problem I would be very grateful Smile

Thanks all in advance Smile
Re: XML trouble. [message #452870 is a reply to message #452867] Sun, 25 April 2010 15:06 Go to previous messageGo to next message
BlackSwan
Messages: 26766
Registered: January 2009
Location: SoCal
Senior Member
http://www.orafaq.com/forum/?SQ=48c76fd753afd050cc6bc1d90b6e8fc2&t=search&srch=xml&btn_submit=Search&field=all&fo rum_limiter=10&search_logic=AND&sort_order=DESC&author=

A possibility would be to access the PostgreSQL DB directly via a database link to avoid the complexity of XML altogether.
Re: XML trouble. [message #452871 is a reply to message #452870] Sun, 25 April 2010 15:10 Go to previous messageGo to next message
Squall616
Messages: 18
Registered: April 2010
Location: Poland
Junior Member
The point is that I would like it to have under some procedures - to keep for example one procedure for 1 table or if it is possible to make - 1 procedure for all tables - yet because I am working on some kind of migration project. The idea of it is to synchronize the databases from PostgreSQL ( the one I will be always moving from) to the Oracle one ( target database)

The part - moving out of PostgreSQL - I've managed to solved easily in .NET Visual studio, and the part of inserting data into Oracle should be managed by procedures. (In the end I would like to supply a user GUI for it under Oracle forms)
Re: XML trouble. [message #452872 is a reply to message #452867] Sun, 25 April 2010 15:58 Go to previous messageGo to next message
JRowbottom
Messages: 5933
Registered: June 2006
Location: Sunny North Yorkshire, ho...
Senior Member
One thing that you're doing wrong is the way you're using Bfilename.

If you look at the documentation you'll see that the first parameter needs to be a directory object, not just a file path.

Details of how to create a directory are here
Re: XML trouble. [message #452941 is a reply to message #452872] Mon, 26 April 2010 07:41 Go to previous messageGo to next message
Squall616
Messages: 18
Registered: April 2010
Location: Poland
Junior Member
Ok, thanks for this help, so now I have something like this:
CREATE OR REPLACE DIRECTORY testing1 AS 'c:\test\';

-----------

CREATE OR REPLACE DIRECTORY succeeded.



Then back to my code:
insert into ps_sprawozdania(miesiac, umowa_rok, umowa_nr, nr_korekty, nazwa, data_potw, data_exp, status_potw)
 select
   extractvalue(column_value,'/NewDataSet/Cust/miesiac'),
   extractvalue(column_value,'/NewDataSet/Cust/umowa_rok'),
   extractvalue(column_value,'/NewDataSet/Cust/umowa_nr'),
   extractvalue(column_value,'/NewDataSet/Cust/nr_korekty'),
   extractvalue(column_value,'/NewDataSet/Cust/nazwa'),
   extractvalue(column_value,'/NewDataSet/Cust/data_potw'),
   extractvalue(column_value,'/NewDataSet/Cust/data_exp'),
   extractvalue(column_value,'/NewDataSet/Cust/status_potw')
from table(xmlsequence(xmltype(bfilename('testing1','ps_sprawozdania.xml'))));



And I am still getting:

SQL Error: ORA-06553: PLS-306: wrong number or types of arguments in call to  'XMLTYPE'
06553. 00000 -  "PLS-%s: %s"
*Cause:    
*Action:



And I'm almost sure thats 100% exactly same as I saw in some of examples :/

Can anyone help?
Re: XML trouble. [message #452944 is a reply to message #452941] Mon, 26 April 2010 08:22 Go to previous messageGo to next message
JRowbottom
Messages: 5933
Registered: June 2006
Location: Sunny North Yorkshire, ho...
Senior Member
At least we know what error you're getting now, which helps.

If you look at the example here, you'll see that you need to specify a character set for the bfile - xmltype conversion.

Here's a little example I knoced together to check that it works. Stick your file in c:\dev\temp\test.xml and check that the load works - once you've got that, the rest of it is just finicky xpath mannipulations:
create directory load_dir as'c:\dev\temp';

grant read on directory load_dir to public;
grant write on directory load_dir to public;

create table test_007 (col_1  xmltype);

insert into test_007 (col_1)
  values (xmltype(bfilename('LOAD_DIR','test.xml'),nls_charset_id('AL32UTF8')));


To be fair to you - I can't find anywhere where the parameters for XMLType are spelled out.
Re: XML trouble. [message #452967 is a reply to message #452944] Mon, 26 April 2010 11:13 Go to previous messageGo to next message
Squall616
Messages: 18
Registered: April 2010
Location: Poland
Junior Member
Okay, I've found the parameters (can't post links yet :/) they should be like :

INSERT INTO project1 VALUES
(10, xmltype(bfilename('XMLDIR', 'demo2.xml'),nls_charset_id('AL32UTF8')));


So I chenged to something like:

CREATE OR REPLACE DIRECTORY testowa AS 'c:\test';
/
grant read on directory testowa to public;
grant write on directory testowa to public;
/
insert into ps_sprawozdania(miesiac, umowa_rok, umowa_nr, nr_korekty, nazwa, data_potw, data_exp, status_potw)
 select
   extractvalue(column_value,'/NewDataSet/Cust/miesiac'),
   extractvalue(column_value,'/NewDataSet/Cust/umowa_rok'),
   extractvalue(column_value,'/NewDataSet/Cust/umowa_nr'),
   extractvalue(column_value,'/NewDataSet/Cust/nr_korekty'),
   extractvalue(column_value,'/NewDataSet/Cust/nazwa'),
   extractvalue(column_value,'/NewDataSet/Cust/data_potw'),
   extractvalue(column_value,'/NewDataSet/Cust/data_exp'),
   extractvalue(column_value,'/NewDataSet/Cust/status_potw')
from table(xmlsequence(xmltype(bfilename('testowa','ps_sprawozdania.xml'),nls_charset_id('AL32UTF8'))));


And now I'm getting error like:
22285. 00000 -  "non-existent directory or file for %s operation"
*Cause:    Attempted to access a directory that does not exist, or attempted
           to access a file in a directory that does not exist.
*Action:   Ensure that a system object corresponding to the specified
           directory exists in the database dictionary, or
           make sure the name is correct.


So it says that this file does not exist in this directory, while I am 100% it is exactly there.

Any new suggestions/ideas?
Re: XML trouble. [message #452968 is a reply to message #452867] Mon, 26 April 2010 11:19 Go to previous messageGo to next message
cookiemonster
Messages: 13967
Registered: September 2008
Location: Rainy Manchester
Senior Member
Is this directory on the same server as the DB?
Re: XML trouble. [message #452969 is a reply to message #452867] Mon, 26 April 2010 11:20 Go to previous messageGo to next message
Squall616
Messages: 18
Registered: April 2010
Location: Poland
Junior Member
Yes, I am working on same computer all the time, all the connections are localhost one.
Re: XML trouble. [message #452970 is a reply to message #452967] Mon, 26 April 2010 11:21 Go to previous messageGo to next message
BlackSwan
Messages: 26766
Registered: January 2009
Location: SoCal
Senior Member
>So it says that this file does not exist in this directory, while I am 100% it is exactly there.
>Any new suggestions/ideas?

sometimes Case MaTTers

Since Windoze defaults to UPPERCASE for file/directory names try 'DEMO2.XML' instead of 'demo2.xml'
Re: XML trouble. [message #452971 is a reply to message #452867] Mon, 26 April 2010 11:30 Go to previous messageGo to next message
Squall616
Messages: 18
Registered: April 2010
Location: Poland
Junior Member
Nope, I've tried bot all uppercase and lowercase.... not this :/
Re: XML trouble. [message #452972 is a reply to message #452971] Mon, 26 April 2010 11:34 Go to previous messageGo to next message
BlackSwan
Messages: 26766
Registered: January 2009
Location: SoCal
Senior Member
please post results from following sql

select DIRECTORY_PATH from dba_directories where DIRECTORY_NAME='XMLDIR';
Re: XML trouble. [message #452976 is a reply to message #452867] Mon, 26 April 2010 11:41 Go to previous messageGo to next message
Squall616
Messages: 18
Registered: April 2010
Location: Poland
Junior Member
DIRECTORY_PATH
-------------------------
C:\app\Squall\product\11.1.0\db_1\demo\schema\order_entry\
Re: XML trouble. [message #452978 is a reply to message #452976] Mon, 26 April 2010 11:44 Go to previous messageGo to next message
BlackSwan
Messages: 26766
Registered: January 2009
Location: SoCal
Senior Member
are all the folder name really in lower case at OS level

can oracle OS user really access files in
C:\app\Squall\product\11.1.0\db_1\demo\schema\order_entry\

[Updated on: Mon, 26 April 2010 11:44]

Report message to a moderator

Re: XML trouble. [message #452996 is a reply to message #452867] Mon, 26 April 2010 13:10 Go to previous messageGo to next message
Squall616
Messages: 18
Registered: April 2010
Location: Poland
Junior Member
Okay, so now I've copied the XML file to the directory
C:\app\Squall\product\11.1.0\db_1\demo\schema\order_entry\

Did also
grant all on directory XMLDIR to public;


And now I have another error - this time different -
ORA-31011: XML parsing failed

ORA-06512: at line 1
31011. 00000 -  "XML parsing failed"
*Cause:    XML parser returned an error while trying to parse the document.
*Action:   Check if the document to be parsed is valid.


So I think that the part nls_charset_id('AL32UTF8') is wrong, I've found it here: http://www.orafaq.com/node/508

Re: XML trouble. [message #452998 is a reply to message #452996] Mon, 26 April 2010 13:14 Go to previous messageGo to next message
BlackSwan
Messages: 26766
Registered: January 2009
Location: SoCal
Senior Member
most browsers (IE, Firefox, etc) can read/open XML files.

what happens if you try to do so on your file(s)?
Re: XML trouble. [message #453001 is a reply to message #452867] Mon, 26 April 2010 13:15 Go to previous messageGo to next message
Squall616
Messages: 18
Registered: April 2010
Location: Poland
Junior Member
<NewDataSet>
 <Cust>
  <miesiac>7</miesiac> 
  <umowa_rok>2008</umowa_rok> 
  <umowa_nr>051/210412/01/000/08</umowa_nr> 
  <nr_korekty>0</nr_korekty> 
  <nazwa>Sprawozdanie z realizacji umowy nr 051/210412/01/000/08 za miesiąc Lipiec</nazwa> 
  <data_potw>2008-07-29T00:00:00+02:00</data_potw> 
  <data_exp>2008-07-29T00:00:00+02:00</data_exp> 
  <status_potw>Z</status_potw> 
  </Cust>
 <Cust>
  <miesiac>2</miesiac> 
  <umowa_rok>2007</umowa_rok> 
  <umowa_nr>051/210412/10/000/07</umowa_nr> 
  <nr_korekty>0</nr_korekty> 
  <nazwa>Sprawozdanie z realizacji umowy nr 051/210412/10/000/07 za miesiąc Luty</nazwa> 
  <status_potw>N</status_potw> 
  </Cust>
</NewDataSet>


Opening it without any problems in both IE and Firefox.
The XML file is generated properly in the use of .NET visual studio dataset.writexml method.

--------------------Edit------------------------

Okay, so I've read the eror once again, and I;ve changed the nls_charset_id into ,nls_charset_id('UTF16'), Now it seems to accept the file, yet it throws me error like this:

Error report:
SQL Error: ORA-19025: EXTRACTVALUE returns value of only one node
19025. 00000 -  "EXTRACTVALUE returns value of only one node"
*Cause:    Given XPath points to more than one node.
*Action:   Rewrite the query so that exactly one node is returned.


And to remind - the query at the moment looks like:
insert into ps_sprawozdania(miesiac, umowa_rok, umowa_nr, nr_korekty, nazwa, data_potw, data_exp, status_potw)
 select
   extractvalue(column_value,'/NewDataSet/Cust/miesiac'),
   extractvalue(column_value,'/NewDataSet/Cust/umowa_rok'),
   extractvalue(column_value,'/NewDataSet/Cust/umowa_nr'),
   extractvalue(column_value,'/NewDataSet/Cust/nr_korekty'),
   extractvalue(column_value,'/NewDataSet/Cust/nazwa'),
   extractvalue(column_value,'/NewDataSet/Cust/data_potw'),
   extractvalue(column_value,'/NewDataSet/Cust/data_exp'),
   extractvalue(column_value,'/NewDataSet/Cust/status_potw')
from table(xmlsequence(xmltype(bfilename('XMLDIR','ps_sprawozdania.xml'),nls_charset_id('UTF16'))));


I guess that it is impossible to remove some of the "extractvalue" rows, since I need to insert all the records into table fields, and I dont want to use 1 XMLTYPE field, for better clarification - the DDL of this table looks like:

CREATE TABLE "PIOTREK"."PS_SPRAWOZDANIA" 
   (	"MIESIAC" NUMBER(5,0), 
	"UMOWA_ROK" NUMBER(5,0), 
	"UMOWA_NR" VARCHAR2(24 BYTE), 
	"NR_KOREKTY" NUMBER(10,0), 
	"NAZWA" VARCHAR2(250 BYTE), 
	"DATA_POTW" DATE, 
	"DATA_EXP" DATE, 
	"STATUS_POTW" CHAR(1 BYTE)
   ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "USERS" ;


Any more ideas people? Really need help.

[Updated on: Mon, 26 April 2010 13:54]

Report message to a moderator

Re: XML trouble. [message #453041 is a reply to message #453001] Mon, 26 April 2010 16:19 Go to previous messageGo to next message
JRowbottom
Messages: 5933
Registered: June 2006
Location: Sunny North Yorkshire, ho...
Senior Member
Your problem is this:

1) XMLSEQUENCE is used to make a queryable nested table out of a set of similarly structured XML fragments - you are passing in only one piece of XML

2) ExtractValue is used extract a single value - you're passing it a piece of XML with two or more nodes matching each value looked for.

The best solution would probably be to add an intermediate step in the load process, and break the xml down into records at that step.


What should work, and get you moving is this - replace the FROM clause in your query with this:
from table(xmlsequence(extract(xmltype(bfilename('XMLDIR','ps_sprawozdania.xml'),nls_charset_id('UTF16')),'/NewDataSet/Cust')))


What this unlovely piece of code does is to run EXTRACT(xml,'/NewDataSet/Cust') on the XML that you get back from the File.
This splits the xml down into a set of <Cust> nodes.
XMLSEQUENCE then turns these into a queriable table structure, and you get one row back per CUST node in the original file.
Re: XML trouble. [message #453044 is a reply to message #452867] Mon, 26 April 2010 16:39 Go to previous messageGo to next message
Squall616
Messages: 18
Registered: April 2010
Location: Poland
Junior Member
Okay, first of all, I cannot tell you, how grateful I am. Thanks a lot for all the supprt and help. It's really nice to see that there are so many helpful people here.

Secondly, I totaly understand the idea of splitting the "nodes" aka dataset -> data nodes, and You are right, it should work.

Now after changing into:

insert into ps_sprawozdania(miesiac, umowa_rok, umowa_nr, nr_korekty, nazwa, data_potw, data_exp, status_potw)
 select
   extractvalue(column_value,'/NewDataSet/Cust/miesiac'),
   extractvalue(column_value,'/NewDataSet/Cust/umowa_rok'),
   extractvalue(column_value,'/NewDataSet/Cust/umowa_nr'),
   extractvalue(column_value,'/NewDataSet/Cust/nr_korekty'),
   extractvalue(column_value,'/NewDataSet/Cust/nazwa'),
   extractvalue(column_value,'/NewDataSet/Cust/data_potw'),
   extractvalue(column_value,'/NewDataSet/Cust/data_exp'),
   extractvalue(column_value,'/NewDataSet/Cust/status_potw')
from table(xmlsequence(extract(xmltype(bfilename('XMLDIR','ps_sprawozdania.xml'),nls_charset_id('UTF16')),'/NewDataSet/Cust')))



I am getting error:
SQL Error: ORA-01400: Can't insert NULL value into ("PIOTREK"."PS_SPRAWOZDANIA"."MIESIAC")
01400. 00000 -  "cannot insert NULL into (%s)"
*Cause:    
*Action:



And I've checked 3 times, there is no NULL value in any of the fields in this XML file, niether in "MIESIAC" position, nor in any other ones. It does happen sometimes that some values are skipped in some fields, yet never this one "MIESIAC".


As far it goes for my testing table (I've made one fast with just 2 columns and 2 rows - it's working) So I guess I just need to work out how to handle NULL/skipped.
Re: XML trouble. [message #453047 is a reply to message #453044] Mon, 26 April 2010 18:35 Go to previous messageGo to next message
JRowbottom
Messages: 5933
Registered: June 2006
Location: Sunny North Yorkshire, ho...
Senior Member
It's your XPATHs that need work.

The Xpath '/NewDataSet/Cust/....' is the path to the values in the original data file.
We've already run an extract using the Xpath '/NewDataSet/Cust' to split the xml down into multiple fragments, so you need to replace the '/NewDataSet/Cust/...' with '/Cust/...'.

The old Xpaths are failing to find any values, and returning NULL, hence your error.
Re: XML trouble. [message #453070 is a reply to message #452867] Tue, 27 April 2010 01:20 Go to previous messageGo to next message
Squall616
Messages: 18
Registered: April 2010
Location: Poland
Junior Member
Sorry to bother again Sad I've always beeen a troubling person Smile

An You've said I've done something like:

insert into ps_sprawozdania(miesiac, umowa_rok, umowa_nr, nr_korekty, nazwa, data_potw, data_exp, status_potw)
 select
   extractvalue(column_value,'/Cust/miesiac'),
   extractvalue(column_value,'/Cust/umowa_rok'),
   extractvalue(column_value,'/Cust/umowa_nr'),
   extractvalue(column_value,'/Cust/nr_korekty'),
   extractvalue(column_value,'/Cust/nazwa'),
   extractvalue(column_value,'/Cust/data_potw'),
   extractvalue(column_value,'/Cust/data_exp'),
   extractvalue(column_value,'/Cust/status_potw')
from table(xmlsequence(extract(xmltype(bfilename('XMLDIR','ps_sprawozdania.xml'),nls_charset_id('UTF16')),'/NewDataSet/Cust')))


And now I'm getting error like:

01861. 00000 -  "literal does not match format string"
*Cause:    Literals in the input must be the same length as literals in
           the format string (with the exception of leading whitespace).  If the
           "FX" modifier has been toggled on, the literal must match exactly,
           with no extra whitespace.
*Action:   Correct the format string to match the literal.



And I;ve tried diffrent possibilities, by editing both the Xpath and "from" statement clauses :/ no luck yet :/
Re: XML trouble. [message #453079 is a reply to message #453070] Tue, 27 April 2010 02:09 Go to previous messageGo to next message
ayush_anand
Messages: 417
Registered: November 2008
Senior Member
 select
   extractvalue(column_value,'/Cust/miesiac'),
   extractvalue(column_value,'/Cust/umowa_rok'),
   extractvalue(column_value,'/Cust/umowa_nr'),
   extractvalue(column_value,'/Cust/nr_korekty'),
   extractvalue(column_value,'/Cust/nazwa'),
   extractvalue(column_value,'/Cust/data_potw'),
   extractvalue(column_value,'/Cust/data_exp'),
   extractvalue(column_value,'/Cust/status_potw')
from table(xmlsequence(extract(xmltype(bfilename('XMLDIR','A.XML'),nls_charset_id('UTF16')),'/NewDataSet/Cust')))


I tried this select and it works fine for me using the XML snippet you have earlier provided.
Re: XML trouble. [message #453092 is a reply to message #453070] Tue, 27 April 2010 02:42 Go to previous messageGo to next message
JRowbottom
Messages: 5933
Registered: June 2006
Location: Sunny North Yorkshire, ho...
Senior Member
It's the date columns - in your file, the dates are stored like this:
2008-07-29T00:00:00+02:00
This is a Timestamp with Timezone format, not a Date format.
Oracle will convert from Timestamps to Dates for you, (although in this case you're going to loose the Timezone info - you might want to check whether the table design is correct.

If you replace
extractvalue(column_value,'/Cust/data_potw'),
extractvalue(column_value,'/Cust/data_exp'),
with
to_timestamp_tz(extractvalue(column_value,'/Cust/data_potw'),'yyyy-mm-dd"T"hh24:mi:ss tzh:tzm'),
to_timestamp_tz(extractvalue(column_value,'/Cust/data_exp'),'yyyy-mm-dd"T"hh24:mi:ss tzh:tzm'),
then that should work - it works over here at least.
Re: XML trouble. [message #453102 is a reply to message #453092] Tue, 27 April 2010 03:03 Go to previous messageGo to next message
ayush_anand
Messages: 417
Registered: November 2008
Senior Member
SQL> insert into ps_sprawozdania(miesiac, umowa_rok, umowa_nr, nr_korekty, nazwa, data_potw, data_ex
p, status_potw) 
  2   select
  3     extractvalue(column_value,'/Cust/miesiac'),
  4     extractvalue(column_value,'/Cust/umowa_rok'),
  5     extractvalue(column_value,'/Cust/umowa_nr'),
  6     extractvalue(column_value,'/Cust/nr_korekty') ,
  7     extractvalue(column_value,'/Cust/nazwa'),
  8     to_timestamp_tz(extractvalue(column_value,'/Cust/data_potw'),'yyyy-mm-dd"T"hh24:mi:ss tzh:tz
m'),
  9     to_timestamp_tz(extractvalue(column_value,'/Cust/data_exp'),'yyyy-mm-dd"T"hh24:mi:ss tzh:tzm
'),
 10     extractvalue(column_value,'/Cust/status_potw')
 11  from table(xmlsequence(extract(xmltype(bfilename('XMLDIR','A.XML'),nls_charset_id('UTF16')),'/N
ewDataSet/Cust')))
 12  /

2 rows created.

works fine here as well
Re: XML trouble. [message #453262 is a reply to message #452867] Wed, 28 April 2010 02:03 Go to previous messageGo to next message
Squall616
Messages: 18
Registered: April 2010
Location: Poland
Junior Member
First of all, I would like to thank You all guys - BlackSwan, JRowbottom, Cookiemonster and ayush_anand. Thanks for all the support I have received from you, you can't imagine how grateful I am.

Secondly, I do confirm, that thanks to your last tweaks, JRowbottm, now everything works smoothly, all rows are being imported without any errors/warnings.

Yet lastly, i will be asking you for a bit more help, maybe just a suggestion about one thing. What should I do with much much larger tables/files? I mean ones where I have something like this:

CREATE TABLE "PIOTREK"."PS_ROZLICZENIA_LOG" 
   (	"LOG_DELETED" CHAR(1 BYTE) DEFAULT '0', 
	"LOG_DATE" TIMESTAMP (6), 
	"LOG_USER" NUMBER(10,0), 
	"ID_ROZLICZENIA" NUMBER(10,0), 
	"NR_WERSJI" NUMBER(10,0), 
	"FL_KOREKTA" CHAR(1 BYTE), 
	"ID_ROZL_KOR" NUMBER(10,0), 
	"ID_OPI" NUMBER(10,0), 
	"ID_POB" NUMBER(10,0), 
	"IDK_JOS" VARCHAR2(6 BYTE), 
	"ID_WYK_ELECZ" NUMBER(10,0), 
	"UMOWA_NR" VARCHAR2(24 BYTE), 
	"UMOWA_ROK" NUMBER(10,0), 
	"MIESIAC" NUMBER(10,0), 
	"KOD_POZYCJI" VARCHAR2(17 BYTE), 
	"KOD_PROD" VARCHAR2(16 BYTE), 
	"WYROZNIK" NUMBER(10,0), 
	"KROTNOSC" NUMBER(12,4), 
	"KOD_JEDN" VARCHAR2(16 BYTE), 
	"ID_TABELI_PROC" VARCHAR2(5 BYTE), 
	"KOD_PROC" VARCHAR2(9 BYTE), 
	"DATA_OD" DATE, 
	"DATA_DO" DATE, 
	"STATUS_POTW" CHAR(1 BYTE), 
	"UE_DOK_OSOBA_ST" CHAR(1 BYTE), 
	"UMIEJSC_USLUG" VARCHAR2(2 BYTE), 
	"DOK_UE_PODST_RE" NUMBER(10,0), 
	"STATUS_OSOB" CHAR(1 BYTE), 
	"KOD_PODSTAWY_REAL" VARCHAR2(2 BYTE), 
	"SYGN_PISMA_ZGODY" VARCHAR2(50 BYTE), 
	"CZY_EKSPORT" CHAR(1 BYTE), 
	"CZY_USUNIETE" CHAR(1 BYTE) DEFAULT '0', 
	"ID_SCHEMATU" NUMBER(10,0), 
	"DZIEN_PODANIA" NUMBER(10,0), 
	"TYP_PARAM" CHAR(1 BYTE), 
	"WARTOSC_PARAM" NUMBER(7,4), 
	"NR_KOREKTY" NUMBER(10,0), 
	"CZY_RAT_ZYCIE" CHAR(1 BYTE), 
	"NR_GENERACJI" NUMBER(10,0), 
	"STATUS_ROZL" VARCHAR2(2 BYTE), 
	"PODANE_DO_DOMU" CHAR(1 BYTE), 
	"KROTN_FAKT" NUMBER(12,4), 
	"KOSZT" NUMBER(12,2), 
	"KWALIF_UZY" CHAR(1 BYTE) DEFAULT '0', 
	"DAWKA" NUMBER(12,4), 
	"SPEC_ROZL" VARCHAR2(3 BYTE), 
	"WAGA_EFEKT" NUMBER(12,4), 
	"UMOWA_CENA" NUMBER(12,4), 
	"KROTNOSC_SCHEMAT" VARCHAR2(2 BYTE), 
	"MIESIAC_SCHEMAT" VARCHAR2(1 BYTE), 
	"ROK_ROZL" NUMBER(10,0), 
	"MIESIAC_ROZL" NUMBER(10,0), 
	"NR_INST_RUM" VARCHAR2(38 BYTE), 
	"PODST_UBEZP" VARCHAR2(3 BYTE), 
	"ID_DEC" NUMBER(10,0), 
	"ID_ROZLICZENIA_PS" NUMBER(10,0), 
	"UMIEJSC_POW" VARCHAR2(14 BYTE), 
	"ID_OPER_AKT_DOK" NUMBER(10,0), 
	"NFZ_OC_STATUS" CHAR(1 BYTE), 
	"NFZ_OC_NR_PISMA" VARCHAR2(20 BYTE), 
	"DIALIZ_PAC_TYP" VARCHAR2(1 BYTE), 
	"DIALIZ_WART_HEM" NUMBER(6,2), 
	"DIALIZ_ID_LEKU" VARCHAR2(1 BYTE), 
	"DIALIZ_JED_MIARY" VARCHAR2(1 BYTE), 
	"DIALIZ_ILOSC_LEKU" NUMBER(12,3), 
	"OPIEKA_SROD_BARTHEL" NUMBER(10,0), 
	"OPIEKA_SROD_ZAKW" VARCHAR2(1 BYTE), 
	"OPIEKA_SROD_OPIEKA_DO" DATE, 
	"CHEM_MASA" NUMBER(7,4), 
	"CHEM_POW" NUMBER(7,4), 
	"CHEM_LICZBA_DNI" NUMBER(3,0), 
	"DOPLATA_PAC" NUMBER(8,2), 
	"NR_WERSJI_GRUPERA" VARCHAR2(10 BYTE), 
	"TARYFA" NUMBER(12,4), 
	"TARYFA_DOD" NUMBER(12,4), 
	"KOD_KASA_CH" VARCHAR2(3 BYTE), 
	"ID_DOK" NUMBER(10,0), 
	"CZY_STARE" VARCHAR2(1 BYTE)
   ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "USERS" ;



To ease counting - 79 columns.

ALl in all - what I am about to do is just write same procedure like for that smaller table, yet it will be much more time consuming. If anyone has any better idea how to do it, just let me know please Smile otherwise - my fingers will be just a bit longer ;P

Have a nice day everyone Smile
Re: XML trouble. [message #453287 is a reply to message #453262] Wed, 28 April 2010 02:53 Go to previous messageGo to next message
ayush_anand
Messages: 417
Registered: November 2008
Senior Member
BlackSwan wrote on Sun, 25 April 2010 15:06
http://www.orafaq.com/forum/?SQ=48c76fd753afd050cc6bc1d90b6e8fc2&t=search&srch=xml&btn_submit=Search&field=all&fo rum_limiter=10&search_logic=AND&sort_order=DESC&author=

A possibility would be to access the PostgreSQL DB directly via a database link to avoid the complexity of XML altogether.

[Updated on: Wed, 28 April 2010 02:56]

Report message to a moderator

Re: XML trouble. [message #453580 is a reply to message #452867] Thu, 29 April 2010 13:55 Go to previous messageGo to next message
Squall616
Messages: 18
Registered: April 2010
Location: Poland
Junior Member
Hmmm would anyone be so kind and show at some example how to do it?
Re: XML trouble. [message #453581 is a reply to message #453580] Thu, 29 April 2010 13:59 Go to previous messageGo to next message
BlackSwan
Messages: 26766
Registered: January 2009
Location: SoCal
Senior Member
http://www.lmgtfy.com/?q=oracle+gateway+postgreSQL
Re: XML trouble. [message #453584 is a reply to message #452867] Thu, 29 April 2010 14:21 Go to previous messageGo to next message
Squall616
Messages: 18
Registered: April 2010
Location: Poland
Junior Member
Well, thanks, but the point of this project is to USE those damn XML files and to parse them somehow...

Now I'm thinking to write some kind of parser in PL/SQL and I am thinking of some ways to do it:

1) A parser that just recognizes the tags - it reads for example whole first record of XML file, inserts it into a table, and then I can look for all the tags by searching for <tag> and </tag>, then use those strings in-between < and > and use them for "insert" queries

2) Second view on it is to alter the XML file, virtually open it and change everything what is in between symbols < and > including those two into something like ";" or "(tab)" except the <cust> and </cust> marks which would be changed into something else. That way i would receive just a simple file that I can easily import to my database, granting that I know exactly what structure both the file and the table has

3) Third option is to use something like additional file, in which I would store data for table names and table columns -> using this I would know already the names of the columns in every file that is to be imported and somehow try to use it in loops for each XML file

4) Fourth option for this moment is to use built-in for example java XML parser, write procedures in java and implement them in oracle

5) Last option that I can think about is to use SQL loader, but I dont know if I can use it to insert XML file into normal tables or only those with XMLType columns.



Can anyone suggest me which way should I head now? Which of these options would be best, calculating both, efficency in working and time needed to complete it?
Re: XML trouble. [message #453587 is a reply to message #453584] Thu, 29 April 2010 14:29 Go to previous messageGo to next message
BlackSwan
Messages: 26766
Registered: January 2009
Location: SoCal
Senior Member
When your only tool is a hammer, all problems are viewed as nails.
While a hammer is a GREAT tool, it is suboptimal to divide 1 board into 2 pieces

http://www.oracle.com/technology/tech/xml/xmldb/index.html

http://database.asia/documentation/oracle/database/10.2/appdev.102/b14259/xdb03usg.htm
Re: XML trouble. [message #453605 is a reply to message #453584] Thu, 29 April 2010 23:32 Go to previous messageGo to next message
ayush_anand
Messages: 417
Registered: November 2008
Senior Member
Quote:
5) Last option that I can think about is to use SQL loader, but I dont know if I can use it to insert XML file into normal tables or only those with XMLType columns.



The Sql* loader is best in my opinion,but for this you have to get output from your source database in CSV(comma separated) or tab separated value rather than XML format.
Re: XML trouble. [message #459437 is a reply to message #453605] Sat, 05 June 2010 04:58 Go to previous messageGo to next message
Squall616
Messages: 18
Registered: April 2010
Location: Poland
Junior Member
Okay, sorry for long absence, I've been battling with this project for a bit long time now. I've used java and dom parser to get inside the XML file, then I've created preparedStatement insert into "table" values (?, ?, ?, ...) and then I've extracted those values from XML files, everything is working smoothly Smile If anyone would be intrested, I can post some source codes about those functions/classes I wrote in java if anyone needs something like this.

Now the only problem I have (yes, there always has to be a problem about me Wink I'm working on a way how to disable temporary all the constraints on all the tables in oracle database. Is there any easy way to do it? or I have to look up every constraint name and drop it? Yet I need to set them up again after the import is done.
Re: XML trouble. [message #459445 is a reply to message #459437] Sat, 05 June 2010 08:57 Go to previous messageGo to next message
BlackSwan
Messages: 26766
Registered: January 2009
Location: SoCal
Senior Member
> I have to look up every constraint name and drop it?
yes, disable each constraint one by one

In theory, there should be no need to disable any constraints.
Just always load parent table data before loading child data.

[Updated on: Sat, 05 June 2010 09:49]

Report message to a moderator

Re: XML trouble. [message #459582 is a reply to message #459437] Mon, 07 June 2010 05:05 Go to previous messageGo to next message
JRowbottom
Messages: 5933
Registered: June 2006
Location: Sunny North Yorkshire, ho...
Senior Member
You can do something like this (untested code):
BEGIN
  FOR rec IN (select *
              from user_constraints
              order by case when constraint_type = 'F' then 1
                            when constraint_type = 'C' then 2
                            when constraint_type in ('P','U') then 3
                            else 4 end) LOOP

    execute immediate 'ALTER TABLE '||rec.table_name||' disable constraint '||rec.constraint_name;

  END LOOP;
END;
/

This will disable all the FK constraints, then all the check constraints, and then all the Primary Key and Unique constraints.
Re: XML trouble. [message #459583 is a reply to message #459437] Mon, 07 June 2010 05:22 Go to previous messageGo to next message
ayush_anand
Messages: 417
Registered: November 2008
Senior Member
Squall616 wrote on Sat, 05 June 2010 04:58
If anyone would be intrested, I can post some source codes about those functions/classes I wrote in java if anyone needs something like this.


Please post the sample codes
And also why are you trying to reinvent the same "Wheel"

[Updated on: Mon, 07 June 2010 05:27]

Report message to a moderator

Re: XML trouble. [message #459585 is a reply to message #452867] Mon, 07 June 2010 05:43 Go to previous messageGo to next message
Squall616
Messages: 18
Registered: April 2010
Location: Poland
Junior Member
Hey again, I will post the sample codes now, all written in java.

Since there is about 500 lines of code, if you all don't mind i will post the functions I wrote and later on I will post internal code of them.

public static void clearTable(String adres);   -> function that is clearing the Oracle table, as argument it accepts the link to the XML file

public static java.sql.Date getSQLDate(String dateString);  -> function that converts the String - dateString into java.sql.Date - since you can't insert java.util.Date into Oracle table.

private static CLOB getCLOB(String data, Connection connection) throws SQLException;   -> function that creates a CLOB out of string, it uses 2 arguments - string that the clob will be created of and connection to database since if you want to create a clob, you need to use createTemporary.


public static String getOTable(String adres);   -> function that takes as argument the adress to file and extracts the oracle's table name. Since each oracle table has its own XML file.


public static ArrayList<String> getTableColumnType(String oTablica);    -> Function that returns an ArrayList containing all names of columns from exact table given as parameter.


public static ArrayList<String> getTableColumnName(String oTablica);   -> same as above, but returning the column types of the same table.

public static Document parseFile(String adres);   -> function that parses XML document so I dont do it by mistake other time and returns Document object representing this file.

public static String createInsert(ArrayList<String> lista, String oTable);    -> a function that creates a string which is later used to create a prepared statement. It creates something like: INSERT INTO(TABLE NAME)(Col1, col2, col3, ...., coln) VALUES (?, ?, ?, ?, ?, ..... ?); This is the form of string required to create a prepared statement. Number of columns is taken from oracle tables.

public static void funkcyja(Document doc, String adres);

This one is the main function, it uses all above functions, gets into the XML file, gets the nodes names and all the rest Wink

I won't be a jerk, here you go all, yet I won't paste all of it ;P I can do it after I graduate ;P

public static void funkcyja(Document doc, String adres){
		int licznik = 0;
		int recordCount = 0;
		String oTable = getOTable(adres);
		ArrayList<String> tableColumns = getTableColumnName(oTable);
		ArrayList<String> tableColumnTypes = getTableColumnType(oTable);		  
		String zapytanieInsert = createInsert(tableColumns, oTable);
		try{
			Class.forName("oracle.jdbc.driver.OracleDriver");                 
		    String url = "jdbc:oracle:thin:@localhost:1521:orcl";		    
		    Connection conn =  DriverManager.getConnection(url,"user","password");
		    conn.setAutoCommit(true);
			
		    Statement stmt = conn.createStatement();
		    OraclePreparedStatement insertInto = (OraclePreparedStatement) conn.prepareStatement(zapytanieInsert);
		    	    
		    if(doc.getFirstChild().hasChildNodes()){
			    String FirstChildNode= doc.getDocumentElement().getFirstChild().getNodeName(); 
				//System.out.println(FirstChildNode);											
				NodeList listOfRecords = doc.getElementsByTagName(FirstChildNode);
				int totalRecords = listOfRecords.getLength(); 									
				System.out.println("Liczba rekordów do wstawienia : " + totalRecords); 		
				PreparedStatement psmnt = conn.prepareStatement(zapytanieInsert);				
				for (int i=0; i< totalRecords; i++){											
					NodeList listOfColumns = listOfRecords.item(i).getChildNodes();				
					int totalColumns = listOfColumns.getLength();								
								
					int columnCount = tableColumns.size();										
					int[] occ = new int[columnCount];		
					for(int s = 0; s<columnCount; s++){															
						String temp = tableColumns.get(s);										//pobranie nazwy kolumny z tabeli oraclowej
						for (int k = 0; k<totalColumns; k++ ){									
							String test1 = listOfColumns.item(k).getNodeName().toUpperCase();	
							//Node nod = listOfColumns.item(k).getFirstChild();
							if(temp.equals(test1)){												//jezeli znajdziemy pasujacego
								
								occ[s]=1;														
							}						
						}					
					}																			
					licznik = 0;
					for(int k=0; k<columnCount; k++){
						if(occ[k]==1){															
							String pom = listOfColumns.item(licznik).getTextContent().toString().toLowerCase();//pobranie wartosci z pliku XML
							String zmienna = tableColumnTypes.get(k);
							if(zmienna == "NUMBER"){											
								int kk = 0;
								int u = 0;
								double ss = 0;
								if (pom.contains(".") || pom.contains(",")){
									u=1;
									
									ss = Double.parseDouble(pom);
									psmnt.setDouble(k+1, ss);
								}
								if (pom.contains("true")){										
									u=1;
									System.out.println("true");
									pom = "1";
									kk = Integer.parseInt(pom);
									psmnt.setInt(k+1, kk);
								}
								if (pom.contains("false")){										
									u=1;
									System.out.println("false");
									pom = "0";
									kk = Integer.parseInt(pom);
									psmnt.setInt(k+1, kk);
								}
								else{
									if(u==0){
										
										kk = Integer.parseInt(pom);									
										psmnt.setInt(k+1, kk);
									}								
								}																						
							}
							if(zmienna == "VARCHAR2"){							
								psmnt.setString(k+1, pom);
							}
							if(zmienna == "DATE"){														
									psmnt.setDate(k+1, getSQLDate(pom));							
							}
							if(zmienna == "TIMESTAMP"){
								psmnt.setDate(k+1, getSQLDate(pom));
							}
							if(zmienna == "CLOB"){
								oracle.sql.CLOB obiekt = getCLOB(pom, conn);
								psmnt.setClob(k+1, obiekt);
							}
							if(zmienna == "CHAR"){
								psmnt.setString(k+1, pom);							
							}
							licznik = licznik +1;
						}
						if(occ[k]==0){
							//System.out.print(tableColumns.get(k));
							//System.out.println(" brak " + k);
							String zmienna = tableColumnTypes.get(k);
							if(zmienna == "NUMBER"){
								psmnt.setNull(k+1, java.sql.Types.INTEGER);
							}
							if(zmienna == "VARCHAR2"){
								psmnt.setNull(k+1,java.sql.Types.VARCHAR);
							}
							if(zmienna == "TIMESTAMP"){
								psmnt.setNull(k+1,java.sql.Types.TIMESTAMP);
							}
							if(zmienna == "DATE"){
								psmnt.setNull(k+1,java.sql.Types.DATE);
							}
							if(zmienna == "CLOB"){
								psmnt.setNull(k+1,java.sql.Types.CLOB);
							}
							if(zmienna == "CHAR"){
								psmnt.setNull(k+1, java.sql.Types.CHAR);
							}
						}
					}
					psmnt.execute();
					recordCount = recordCount +1;
				}																				 (row pliku xml)
			    insertInto.close();
			    stmt.close();
			    conn.close();
			    System.out.println("Wstawiono "+ recordCount + "/"+totalRecords +" rekordów do tabeli "+ oTable+".");		    			    	
		    	//System.out.println(doc.getFirstChild().getNodeName()+ " ma!");
		    }
		    else{
		    	System.out.println("Empty file.");
		    } 

		}		
		catch (Exception e){
			e.printStackTrace();            
		}
		
	}

Re: XML trouble. [message #459617 is a reply to message #459582] Mon, 07 June 2010 08:13 Go to previous messageGo to next message
Squall616
Messages: 18
Registered: April 2010
Location: Poland
Junior Member
JRowbottom wrote on Mon, 07 June 2010 12:05
You can do something like this (untested code):
BEGIN
  FOR rec IN (select *
              from user_constraints
              order by case when constraint_type = 'F' then 1
                            when constraint_type = 'C' then 2
                            when constraint_type in ('P','U') then 3
                            else 4 end) LOOP

    execute immediate 'ALTER TABLE '||rec.table_name||' disable constraint '||rec.constraint_name;

  END LOOP;
END;
/

This will disable all the FK constraints, then all the check constraints, and then all the Primary Key and Unique constraints.


About this, I'm getting error like:
Error report:
ORA-02297: cannot diable constraint (PIOTREK.ACTIVE_SUB_PKEY) - dependencies exist
ORA-06512: at line 9
02297. 00000 - "cannot disable constraint (%s.%s) - dependencies exist"
*Cause:    an alter table disable constraint failed becuase the table has
           foriegn keys that are dpendent on this constraint.
*Action:   Either disable the foreign key constraints or use disable cascade




:/ and FK are ordered to go first as I've noticed so there shouldn't be problem :/
Re: XML trouble. [message #459618 is a reply to message #459617] Mon, 07 June 2010 08:21 Go to previous messageGo to next message
cookiemonster
Messages: 13967
Registered: September 2008
Location: Rainy Manchester
Senior Member
This:
when constraint_type = 'F' then 1
Should be:
when constraint_type = 'R' then 1

Re: XML trouble. [message #459622 is a reply to message #459618] Mon, 07 June 2010 08:34 Go to previous messageGo to next message
JRowbottom
Messages: 5933
Registered: June 2006
Location: Sunny North Yorkshire, ho...
Senior Member
Meh - I said it was untested.

I keep getting that wrong.
Re: XML trouble. [message #459623 is a reply to message #459618] Mon, 07 June 2010 08:35 Go to previous messageGo to previous message
Squall616
Messages: 18
Registered: April 2010
Location: Poland
Junior Member
Well damn its working Wink yet now I've disabled all of them which is positive, I've testesd and imported the largest file (about 10k records in table) and worked flawless, yet I can't enable back the constraint again ;P
I've tried changing

execute immediate 'ALTER TABLE '||rec.table_name||' disable constraint '||rec.constraint_name;


into

execute immediate 'ALTER TABLE '||rec.table_name||' enable constraint '||rec.constraint_name;


Yet I'm getting
02270. 00000 -  "no matching unique or primary key for this column-list"
*Cause:    A REFERENCES clause in a CREATE/ALTER TABLE statement
           gives a column-list for which there is no matching unique or primary
           key constraint in the referenced table.
*Action:   Find the correct column names using the ALL_CONS_COLUMNS
           catalog view


And I'm 100% sure the data is exactly the same I've deleted from table since I took it out of the same table :/

The point is that I don't have to turn the constraints on so immediately, yet I would like to have a way to do it somehow.
Previous Topic: v$latchholder
Next Topic: Oracle DateTime
Goto Forum:
  


Current Time: Wed Jul 30 07:13:58 CDT 2025