Top 5 Recent Articles
ARTICLES CATEGORIES
- Algorithms (22)
- All (399)
- Biography (1)
- Blog (44)
- Business Requirements (1)
- Commentary (1)
- Conversion (2)
- Customers (2)
- Data Models (1)
- Education (2)
- GeoRaptor (13)
- GPS (1)
- Image Processing (2)
- Import Export (8)
- Licensing (2)
- LiDAR (1)
- Linear Referencing (4)
- Manifold GIS (3)
- Mapping (1)
- MySQL Spatial (7)
- Networking and Routing (including Optimization) (5)
- Open Source (18)
- Oracle Spatial and Locator (194)
- Partitioning (1)
- PostGIS (36)
- Projections (1)
- Published Articles (1)
- qGIS (1)
- Recommendations (1)
- Services (1)
- Software Change Log (1)
- Source Code (37)
- Space Curves (9)
- Spatial Database Functions (109)
- Spatial DB comparison (1)
- Spatial XML Processing (11)
- SQL Server Spatial (92)
- Standards (3)
- Stored Procedure (17)
- Tessellation or Gridding (10)
- Tools (2)
- Topological Relationships (1)
- Training (2)
- Triangulation (2)
Writing xSV (eg csv) files from within the Oracle database using Java and PL/SQL
My EXPORTER package + Java code has a function called WriteDelimitedTextfile that can be used to export any SQL SELECT statement to disk using Oracle database’s DBMS_JOB or DBMS_SCHEDULER.
Yes, you can export to disk via pure PL/SQL but I have added this function to my EXPORTER to create an integrated solution for exports that include SDO_GEOMETRY objects.
You will note that when exporting a SQL SELECT statement with an SDO_GEOMETRY object that you can specify the export text format for all the SDO_GEOMETRY objects in the result set. This format can be Well Known Text (WKT) or Geography Markup Language (GML) version 2 (version 3 can only be made available for Oracle databases supporting JVM 1.5 or above).
Here is an example of an export.
BEGIN codesys.exporter.WriteDelimitedTextfile( p_sql => 'SELECT ID,SPECIES,STATION_NUMBER,LENGTH,WEIGHT,SEX,MATURITY,WATER_CHECK,SYSDATE as export_date,GEOM FROM GUTDATA', p_outputDirectory => 'C:\temp\', p_fileName => 'gutdata.csv', p_FieldSeparator => ',', p_TextDelimiter => '"', p_DateFormat => 'yyyy/MM/dd hh:mm:ss a', p_geomFormat => EXPORTER.c_WKT_FORMAT, p_precision => 3 ); End; /
With the export file looking like….
ID,SPECIES,STATION_NUMBER,LENGTH,WEIGHT,SEX,MATURITY,WATER_CHECK,EXPORT_DATE,GEOM
204,2,6,218,121.1,“F”,“M”,“O”,“2011/10/12 06:01:33 PM”,“POINT (133.5381 -5.9327)”
205,2,2,383,199.5,“M”,“M”,“O”,“2011/10/12 06:01:33 PM”,“POINT (155.0342 -39.1499)”
206,7,21,338,116.2,“M”,“M”,“O”,“2011/10/12 06:01:33 PM”,“POINT (107.1845 -30.9735)”
207,2,28,379,258.5,“M”,“M”,“O”,“2011/10/12 06:01:33 PM”,“POINT (107.0394 -14.7986)”
208,1,11,452,276.5,“F”,“I”,“O”,“2011/10/12 06:01:33 PM”,“POINT (153.999 -45.8678)”
210,6,38,300,138.4,“F”,“M”,“O”,“2011/10/12 06:01:33 PM”,“POINT (158.1937 -42.6954)”
212,8,59,252,243.6,“M”,“I”,“O”,“2011/10/12 06:01:33 PM”,“POINT (142.0212 -5.7516)”
…..
Here is another example:
CREATE TABLE source_data ( x, y, z , CONSTRAINT source_data_pk PRIMARY KEY (x,y,z) ) ORGANIZATION INDEX AS SELECT ROWNUM AS x , RPAD('x',50,'x') AS y , RPAD('y',50,'y') AS z FROM dual CONNECT BY ROWNUM <= 100000; -- Results TABLE SOURCE_DATA created. -- Display structure DESCRIBE source_data -- Results Name NULL TYPE ---- -------- ------------ X NOT NULL NUMBER Y NOT NULL VARCHAR2(50) Z NOT NULL VARCHAR2(50) -- Show some data SELECT x,y,z FROM codesys.source_data; -- Results... X Y Z - -------------------------------------------------- -------------------------------------------------- 1 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy 2 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy 3 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy 4 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy -- Now do export SET timing ON autotrace ON -- Results Autotrace Enabled Shows the execution plan AS well AS statistics OF the statement. -- Run Export BEGIN codesys.exporter.WriteDelimitedTextfile( p_sql => 'select x,y,z from codesys.source_data', p_outputDirectory => 'c:\temp', p_fileName => 'source_data.csv', p_FieldSeparator => ',', p_TextDelimiter => '"', p_DateFormat => codesys.EXPORTER.c_DATEFORMAT, p_geomFormat => codesys.EXPORTER.c_WKT_Format, p_precision => 3); END; / -- Results anonymous block completed Elapsed: 00:00:03.813 Statistics ----------------------------------------------------------- 3 USER calls 9019392 physical READ total bytes 0 physical WRITE total bytes 0 spare statistic 3 0 commit cleanout failures: cannot pin 0 TBS Extension: bytes extended 0 total NUMBER OF times SMON posted 0 SMON posted FOR undo segment recovery 0 SMON posted FOR dropping temp segment 0 segment prealloc tasks -- Clean up SET timing off autotrace off -- Results Autotrace Disabled -- And .... DROP TABLE source_data purge; TABLE SOURCE_DATA dropped.
The first four rows in c:\temp\source_data.csv:
X,Y,Z
1.0,“xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx”,“yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy”
2.0,“xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx”,“yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy”
3.0,“xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx”,“yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy”
4.0,“xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx”,“yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy”
I hope this helps someone.
Documentation
- MySQL Spatial General Functions
- Oracle LRS Objects
- Oracle Spatial Exporter (Java + pl/SQL)
- Oracle Spatial Object Functions
- Oracle Spatial Object Functions (Multi Page)
- PostGIS pl/pgSQL Functions
- SC4O Oracle Java Topology Suite (Java + pl/SQL)
- SQL Server Spatial General TSQL Functions
- SQL Server Spatial LRS TSQL Functions