(SQLPlus) SPOOL
(SQLPlus) SPOOL
HI,
can anyone help me on this? i want to create a csv file that will have a certain filename coming from a variable from a query. the ff codes does not work :( any help pls! THANKS in advance
BROKEN
select customer_name into v_name from demo_customers where cust_id = 1;
SPOOL ..\data\order_&v_name&.csv
SELECT
order_id || ',' ||
order_total || ',' ||
order_datetime
FROM
demo_orders
WHERE
customer_id =1;
SPOOL OFF;
exit;
------------------------------------------------------------------------------------------------------------------
to a bind variable yes, in plsql. To a "define" variable no.
SQL> var n number
SQL> set autopri on
SQL> exec select 1+1 into :n from dual;
PL/SQL procedure successfully completed.
N
2
Similar Messages
-
Sqlplus – spool data to a flat file
Hi,
Does any oracle expert here know why the sqlplus command could not spool all the data into a flat file at one time.
I have tried below command. It seems like every time I will get different file size :(
a) sqlplus -s $dbUser/$dbPass@$dbName <<EOF|gzip -c > ${TEMP_FILE_PATH}/${extract_file_prefix}.dat.Z
b) sqlplus -s $dbUser/$dbPass@$dbName <<EOF>> spool.log
set feedback off
set trims on
set trim on
set feedback off
set linesize 4000
set pagesize 0
whenever sqlerror exit 173;
spool ${extract_file_prefix}.datFor me, this is working. What exactly are you getting and what exactly are you expecting?
(t352104@svlipari[GEN]:/lem) $ cat test.ksh
#!/bin/ksh
TEMP_FILE_PATH=`pwd`
extract_file_prefix=emp
dbUser=t352104
dbPass=t352104
dbName=gen_dev
dataFile=${TEMP_FILE_PATH}/${extract_file_prefix}.dat
sqlplus -s $dbUser/$dbPass@$dbName <<EOF > $dataFile
set trims on
set trim on
set tab off
set linesize 7000
SET HEAD off AUTOTRACE OFF FEEDBACK off VERIFY off ECHO off SERVEROUTPUT off term off;
whenever sqlerror exit 173;
SELECT *
FROM emp ;
exit
EOF
(t352104@svlipari[GEN]:/lem) $ ./test.ksh
(t352104@svlipari[GEN]:/lem) $ echo $?
0
(t352104@svlipari[GEN]:/lem) $ cat emp.dat
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 09-DEC-82 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 12-JAN-83 1100 20
7900 JAMES CLERK 7698 03-DEC-81 950 30
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10
(t352104@svlipari[GEN]:/lem) $ -
SQLPLUS spool to create .dat files - problems
I am using spool from sqlplus to generate
.dat files for sqlldr. The problem is with
numeric fields. I have SET numwidth, numformat to no avail. The fields defined with specific numeric size number(n) always get spooled with a longer column size.
Also, the COLSEP character does not appear
after all columns. Any ideas out there ?
(I realize export/import is an easier solution )Try using TO_CHAR, LPAD, SUBSTR and other character functions to achieve the same. Also, if you have not SET HEAD OFF, then do that, or use alias for the formatted columns in case you need headings.
-
Sqlplus Spool without extension
Hello
the answer is in the title
I want to konw if it's possible to Spool a filename without extension in sqlplus commandline
Spool Toto
Select ...
Spool Off
is it possible to have a result file name toto and not toto.lst??
Thankthe answer is in the titleFine then ;-)
I do not have a solution to your problem. You can create toto.txt or any other extension
spool .toto
prompt what a nice file
spool off -
SQLPlus: Spool is wrapping lines at 80 chars when linesize = 1000
I have following code and the result wrap off at 80 . Please suggest ways to avoid it. Thanks
set define on
set echo off
set pages 10000
set heading off
set lines 1000
set long 10000
set heading on
set feedback off
set heading off
set verify off
set trimspool on
set linesize 1000
set wrap off
spool c:\spooltext5.xml;
SELECT NYTD_XML_DATA FROM NYTD_DATA_TEMP;
spool off
exit;Used Column formating and solved the issue
column NYTD_XML_DATA new_value NYTD_XML_DATA format a1000;
spool c:\spooltext5.xml;
SELECT NYTD_XML_DATA FROM NYTD_DATA_TEMP;
spool off
Thanks -
Sqlplus SPOOL broken. Urgent help.
I have never seen this before.
I am running a spool of a small query. It returns 7 rows and they are displayed. I go to look at the .lst file and the first row is gone from the spooled .lst file. I have tried this multiple times, and the results vary- sometimes it removes the first row and sometimes it removes the first column of data form the first row.
??????????????? Any idea where to start looking for trouble other than the alert.log?> Urgent help.
My usual soapbox response (again).
Please do not call your problem urgent. Why?
Because you are saying that your problem is more important and more deserving attention than other people who post problems here. That is just a rude and arrogant thing to do. Your problem is by no means more important than any other person's problem in this forum - as you are in no position to compare and judge that.
You are also demanding a quick response from those here that assist people like you. You have no right to demand anything as paid professionals are giving you their free time in assisting you. How can you claim that they must be "quick-quick" in spending their free time, without any payment, to assist you?
So, practice some netiquette and remember that this is a PUBLIC forum and "staffed" by volunteers. -
How to spool DBMS_OUTPUT.PUT_LINE from SqlPlus?
Hi,
i have a stored procedure test:
procedure test is
begin
dbms_output.put_line('Test');
dbms_output.put_line('Test2');
dbms_output.put_line('Test3');
dbms_output.put_line('Test4');
dbms_output.put_line('Test5');
end;
I start the stored procedure out of sqlplus:
spool C:\Temp\test.spl;
exec test;
commit;
spool off;
exit;
My problem is no Test or Test2 appeared in the spool file.
What should i do?
thanks a lotcreate or replace procedure hmm as
begin
dbms_output.put_line('Test1');
dbms_output.put_line('Test2');
dbms_output.put_line('Test3');
dbms_output.put_line('Test4');
dbms_output.put_line('Test5');
end;
spool C:\Temp\test.spl;
exec hmm;
spool off;File content is:
Test1
Test2
Test3
Test4
Test5
PL/SQL procedure successfully completed. -
How to spool out put of multiple scripts and get a single spool file output
Hi,
I have one master script that calls three other scripts. The three scripts each produce their own spool files. But I would like to have the master script also produce one single output (in addition to the three indiviual output I mean). How to do that? Can you please help.
Following are the scripts:
--m.sql (master script)
spool c:\m.log
@1.sql
@2.sql
@3.sql
spool off
--1.sql
spool c:\1.log
insert into test values(1);
commit;
spool off
--2.sql
spool c:\2.log
insert into test values(2);
commit;
spool off
spool c:\3.log
insert into test values(3);
commit;
spool off
--table used
SQL> desc test
Name Null? Type
A NUMBERWhen I run the above script m.sql it does produce the other 3 log files (1.log,2.log etc) but m.log (which is master log file which should have output of each of the three calling script) is empty file with 0 byte!
Thanks
Edited by: orausern on May 1, 2011 3:17 AMI have one master script that calls three other scripts. The three scripts each produce their own spool files. But I would like to have the master script also produce one single output (in addition to the three indiviual output I mean). How to do that? Can you please help. Not sure if that's possible directly with sqlplus spool option
When you spool to a different file in a single session, sqlplus stops writing to earlier spool file and redirects the output to the file specified in last spool command.
at the end of the script, however, below may help
host type c:\1.log >> c:\m.log
host type c:\2.log >> c:\m.log
host type c:\3.log >> c:\m.log -
How to remove trailing spaces in SQL PLUS spool
Hi,
I've requirement to pull data from tables and I'm using sqlplus spool to automate data fetch from various tables:
I'm using the following script for the same :
set echo off
set feedback off
set pagesize 0
set linesize 2000
set heading on
set trimspool on
Spool table1.TXT;
prompt col1|col2|col3|col4|col5
select
LTRIM(RTRIM(col1))||'|'||
LTRIM(RTRIM(col2)) ||'|'||
LTRIM(RTRIM(col3)) ||'|'||
LTRIM(RTRIM(col4)) ||'|'||
LTRIM(RTRIM(col5)) ||'|'||
from TABLE1 ;
spool off
After using trimspool on option also I'm having trailing spaces issue how to fix it?
Thanks,
Mahender.
Edited by: user518071 on Oct 11, 2010 1:05 PMHi,
do you need LTRIM/RTRIM? This is namely your problem. By using a function around your column Oracle reserves the maximum lenght for the column. So what do you get without those functions? Furthermore you are concatenating all the columns. This is also a function. For getting '|' in between columns you can also set a seperator by using
set colsep '|'Herald ten Dam
http://htendam.wordpress.com -
how do I pull a sequence number from the database and use it in a sqlplus spool filename...
this is running as: sqlplus user/pass@sid@c:\file.sql
example of the file:
BEGIN
declare
V_E_NUMBER varchar2(7);
begin
SeLECT 'E'||lpad(RWP.E_NUMBER_seq.NEXTVAL,6,'0') INTO V_E_NUMBER FROM DUAL ;
end;
end;
SeLECT 'E'||lpad(RWP.E_NUMBER_seq.CURRVAL,6,'0') INTO V_E_NUMBER FROM DUAL ;
set echo off
SET HEADING OFF
SET LINESIZE 430
set verify off
SET PAGESIZE 0
SET TRIMSPOOL ON
SET timing OFF
SET termout ON
SET feedback OFF
spool d:\securedASP\CORE.BU34500.AR.'||:V_E_NUMBER||'.RECEIVD
select * from table;
spool offHi,
Use a substitution variable for that:
COLUMN v_e_number NEW_VALUE v_e
SELECT 'E' || lpad ( RWP.E_NUMBER_seq.NEXTVAL
, 6
, '0'
) AS V_E_NUMBER
FROM DUAL;
SPOOL d:\securedASP\CORE.BU34500.AR.&v_e..RECEIVD Note that this does not use PL/SQL at all.
The variable can be used without quoting or concatenation.
That may lead to situations where it's ambiguous regarding what is part of the variable name (the variable is named v_e in this example), and what is literal text that happens to come right after it. To resolve such questions, use a period to mark the end of the variable name.
In your case, you want a literal period right after the variable name, so use two: the first one marks the end of the name, and the second one is taken literally.
Look up the SQL*Plus commands
COLUMN,
SET CONCAT, and
SET DEFINE
for details. -
Method to dump flat files (spool is slow)
Hey all,
I have been using spool with a bunch of set commands and it works great, but performance is a bit slow. Especially for our partitioned tables. (4.2 Mill records) Is there a better way to dump flat files?
I want to use sqlldr to import (faster than IMP) but no good if creating the flat files is 10X slower than EXP utility.
Any ideas?
Thanks,
Chris GIf you have a multi CPU machine kick of many sqlplus spool jobs. (select from all of your partitions at the same time)
You are doing a full table scan so you can have a large value for db_file_multiblock_read_count.
if you want to put the spool files back together use cat on a unix machine other wise just use sqlldr on all of the files.
Andrew -
To run sqlplus script using forms6i
hi forum members!
SQLPLUS>connect username/password;
SQLPLUS> spool d:\mydata.dat;
SQLPLUS> select * from table1;
SQLPLUS> spool off;
when i check the d:\ , i found the mydata.dat file. which is the required result for me.
now how can i get the required result using forms6i.
all suggestions will be appreciated.
regards.
mustafa ghulam
pakistan.hi baig.
my form ver: Forms [32 Bit] Version 6.0.8.8.0 (Production)
i have tried a lot of options. most of them are comment now.
i am also pasting my bat file for you.
in form: when-button-pressed
DECLARE
tmp_job varchar2(2000);
BEGIN
tmp_job := 'd:\my_data.bat';
--HOST( 'cmd /c' || tmp_msg, no_screen);
--HOST( 'D:\oracle\product\10.2.0\db_1\BIN\sqlplus.exe' || tmp_job, no_screen);
--HOST( 'D:\oracle\product\10.2.0\db_1\BIN\sqlplus.exe' || tmp_job);
--HOST('CMD /C <file_full_path>', NO_SCREEN);
--HOST('CMD /d:\my_data.bat', NO_SCREEN);
HOST(tmp_job);
END;
my_data.bat
HOST( 'D:\oracle\product\10.2.0\db_1\BIN\sqlplus.exe';
connect username/password;
spool d:\mydata.dat;
set linesize 10000;
select * from vehicles;
spool off;
mustafa ghulam (teefu)
Edited by: user_teefu on Feb 5, 2010 2:34 PM -
2GB OR NOT 2GB - FILE LIMITS IN ORACLE
제품 : ORACLE SERVER
작성날짜 : 2002-04-11
2GB OR NOT 2GB - FILE LIMITS IN ORACLE
======================================
Introduction
~~~~~~~~~~~~
This article describes "2Gb" issues. It gives information on why 2Gb
is a magical number and outlines the issues you need to know about if
you are considering using Oracle with files larger than 2Gb in size.
It also
looks at some other file related limits and issues.
The article has a Unix bias as this is where most of the 2Gb issues
arise but there is information relevant to other (non-unix)
platforms.
Articles giving port specific limits are listed in the last section.
Topics covered include:
Why is 2Gb a Special Number ?
Why use 2Gb+ Datafiles ?
Export and 2Gb
SQL*Loader and 2Gb
Oracle and other 2Gb issues
Port Specific Information on "Large Files"
Why is 2Gb a Special Number ?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Many CPU's and system call interfaces (API's) in use today use a word
size of 32 bits. This word size imposes limits on many operations.
In many cases the standard API's for file operations use a 32-bit signed
word to represent both file size and current position within a file (byte
displacement). A 'signed' 32bit word uses the top most bit as a sign
indicator leaving only 31 bits to represent the actual value (positive or
negative). In hexadecimal the largest positive number that can be
represented in in 31 bits is 0x7FFFFFFF , which is +2147483647 decimal.
This is ONE less than 2Gb.
Files of 2Gb or more are generally known as 'large files'. As one might
expect problems can start to surface once you try to use the number
2147483648 or higher in a 32bit environment. To overcome this problem
recent versions of operating systems have defined new system calls which
typically use 64-bit addressing for file sizes and offsets. Recent Oracle
releases make use of these new interfaces but there are a number of issues
one should be aware of before deciding to use 'large files'.
What does this mean when using Oracle ?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The 32bit issue affects Oracle in a number of ways. In order to use large
files you need to have:
1. An operating system that supports 2Gb+ files or raw devices
2. An operating system which has an API to support I/O on 2Gb+ files
3. A version of Oracle which uses this API
Today most platforms support large files and have 64bit APIs for such
files.
Releases of Oracle from 7.3 onwards usually make use of these 64bit APIs
but the situation is very dependent on platform, operating system version
and the Oracle version. In some cases 'large file' support is present by
default, while in other cases a special patch may be required.
At the time of writing there are some tools within Oracle which have not
been updated to use the new API's, most notably tools like EXPORT and
SQL*LOADER, but again the exact situation is platform and version specific.
Why use 2Gb+ Datafiles ?
~~~~~~~~~~~~~~~~~~~~~~~~
In this section we will try to summarise the advantages and disadvantages
of using "large" files / devices for Oracle datafiles:
Advantages of files larger than 2Gb:
On most platforms Oracle7 supports up to 1022 datafiles.
With files < 2Gb this limits the database size to less than 2044Gb.
This is not an issue with Oracle8 which supports many more files.
In reality the maximum database size would be less than 2044Gb due
to maintaining separate data in separate tablespaces. Some of these
may be much less than 2Gb in size.
Less files to manage for smaller databases.
Less file handle resources required
Disadvantages of files larger than 2Gb:
The unit of recovery is larger. A 2Gb file may take between 15 minutes
and 1 hour to backup / restore depending on the backup media and
disk speeds. An 8Gb file may take 4 times as long.
Parallelism of backup / recovery operations may be impacted.
There may be platform specific limitations - Eg: Asynchronous IO
operations may be serialised above the 2Gb mark.
As handling of files above 2Gb may need patches, special configuration
etc.. there is an increased risk involved as opposed to smaller files.
Eg: On certain AIX releases Asynchronous IO serialises above 2Gb.
Important points if using files >= 2Gb
Check with the OS Vendor to determine if large files are supported
and how to configure for them.
Check with the OS Vendor what the maximum file size actually is.
Check with Oracle support if any patches or limitations apply
on your platform , OS version and Oracle version.
Remember to check again if you are considering upgrading either
Oracle or the OS in case any patches are required in the release
you are moving to.
Make sure any operating system limits are set correctly to allow
access to large files for all users.
Make sure any backup scripts can also cope with large files.
Note that there is still a limit to the maximum file size you
can use for datafiles above 2Gb in size. The exact limit depends
on the DB_BLOCK_SIZE of the database and the platform. On most
platforms (Unix, NT, VMS) the limit on file size is around
4194302*DB_BLOCK_SIZE.
Important notes generally
Be careful when allowing files to automatically resize. It is
sensible to always limit the MAXSIZE for AUTOEXTEND files to less
than 2Gb if not using 'large files', and to a sensible limit
otherwise. Note that due to <Bug:568232> it is possible to specify
an value of MAXSIZE larger than Oracle can cope with which may
result in internal errors after the resize occurs. (Errors
typically include ORA-600 [3292])
On many platforms Oracle datafiles have an additional header
block at the start of the file so creating a file of 2Gb actually
requires slightly more than 2Gb of disk space. On Unix platforms
the additional header for datafiles is usually DB_BLOCK_SIZE bytes
but may be larger when creating datafiles on raw devices.
2Gb related Oracle Errors:
These are a few of the errors which may occur when a 2Gb limit
is present. They are not in any particular order.
ORA-01119 Error in creating datafile xxxx
ORA-27044 unable to write header block of file
SVR4 Error: 22: Invalid argument
ORA-19502 write error on file 'filename', blockno x (blocksize=nn)
ORA-27070 skgfdisp: async read/write failed
ORA-02237 invalid file size
KCF:write/open error dba=xxxxxx block=xxxx online=xxxx file=xxxxxxxx
file limit exceed.
Unix error 27, EFBIG
Export and 2Gb
~~~~~~~~~~~~~~
2Gb Export File Size
~~~~~~~~~~~~~~~~~~~~
At the time of writing most versions of export use the default file
open API when creating an export file. This means that on many platforms
it is impossible to export a file of 2Gb or larger to a file system file.
There are several options available to overcome 2Gb file limits with
export such as:
- It is generally possible to write an export > 2Gb to a raw device.
Obviously the raw device has to be large enough to fit the entire
export into it.
- By exporting to a named pipe (on Unix) one can compress, zip or
split up the output.
See: "Quick Reference to Exporting >2Gb on Unix" <Note:30528.1>
- One can export to tape (on most platforms)
See "Exporting to tape on Unix systems" <Note:30428.1>
(This article also describes in detail how to export to
a unix pipe, remote shell etc..)
Other 2Gb Export Issues
~~~~~~~~~~~~~~~~~~~~~~~
Oracle has a maximum extent size of 2Gb. Unfortunately there is a problem
with EXPORT on many releases of Oracle such that if you export a large table
and specify COMPRESS=Y then it is possible for the NEXT storage clause
of the statement in the EXPORT file to contain a size above 2Gb. This
will cause import to fail even if IGNORE=Y is specified at import time.
This issue is reported in <Bug:708790> and is alerted in <Note:62436.1>
An export will typically report errors like this when it hits a 2Gb
limit:
. . exporting table BIGEXPORT
EXP-00015: error on row 10660 of table BIGEXPORT,
column MYCOL, datatype 96
EXP-00002: error in writing to export file
EXP-00002: error in writing to export file
EXP-00000: Export terminated unsuccessfully
There is a secondary issue reported in <Bug:185855> which indicates that
a full database export generates a CREATE TABLESPACE command with the
file size specified in BYTES. If the filesize is above 2Gb this may
cause an ORA-2237 error when attempting to create the file on IMPORT.
This issue can be worked around be creating the tablespace prior to
importing by specifying the file size in 'M' instead of in bytes.
<Bug:490837> indicates a similar problem.
Export to Tape
~~~~~~~~~~~~~~
The VOLSIZE parameter for export is limited to values less that 4Gb.
On some platforms may be only 2Gb.
This is corrected in Oracle 8i. <Bug:490190> describes this problem.
SQL*Loader and 2Gb
~~~~~~~~~~~~~~~~~~
Typically SQL*Loader will error when it attempts to open an input
file larger than 2Gb with an error of the form:
SQL*Loader-500: Unable to open file (bigfile.dat)
SVR4 Error: 79: Value too large for defined data type
The examples in <Note:30528.1> can be modified to for use with SQL*Loader
for large input data files.
Oracle 8.0.6 provides large file support for discard and log files in
SQL*Loader but the maximum input data file size still varies between
platforms. See <Bug:948460> for details of the input file limit.
<Bug:749600> covers the maximum discard file size.
Oracle and other 2Gb issues
~~~~~~~~~~~~~~~~~~~~~~~~~~~
This sections lists miscellaneous 2Gb issues:
- From Oracle 8.0.5 onwards 64bit releases are available on most platforms.
An extract from the 8.0.5 README file introduces these - see <Note:62252.1>
- DBV (the database verification file program) may not be able to scan
datafiles larger than 2Gb reporting "DBV-100".
This is reported in <Bug:710888>
- "DATAFILE ... SIZE xxxxxx" clauses of SQL commands in Oracle must be
specified in 'M' or 'K' to create files larger than 2Gb otherwise the
error "ORA-02237: invalid file size" is reported. This is documented
in <Bug:185855>.
- Tablespace quotas cannot exceed 2Gb on releases before Oracle 7.3.4.
Eg: ALTER USER <username> QUOTA 2500M ON <tablespacename>
reports
ORA-2187: invalid quota specification.
This is documented in <Bug:425831>.
The workaround is to grant users UNLIMITED TABLESPACE privilege if they
need a quota above 2Gb.
- Tools which spool output may error if the spool file reaches 2Gb in size.
Eg: sqlplus spool output.
- Certain 'core' functions in Oracle tools do not support large files -
See <Bug:749600> which is fixed in Oracle 8.0.6 and 8.1.6.
Note that this fix is NOT in Oracle 8.1.5 nor in any patch set.
Even with this fix there may still be large file restrictions as not
all code uses these 'core' functions.
Note though that <Bug:749600> covers CORE functions - some areas of code
may still have problems.
Eg: CORE is not used for SQL*Loader input file I/O
- The UTL_FILE package uses the 'core' functions mentioned above and so is
limited by 2Gb restrictions Oracle releases which do not contain this fix.
<Package:UTL_FILE> is a PL/SQL package which allows file IO from within
PL/SQL.
Port Specific Information on "Large Files"
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Below are references to information on large file support for specific
platforms. Although every effort is made to keep the information in
these articles up-to-date it is still advisable to carefully test any
operation which reads or writes from / to large files:
Platform See
~~~~~~~~ ~~~
AIX (RS6000 / SP) <Note:60888.1>
HP <Note:62407.1>
Digital Unix <Note:62426.1>
Sequent PTX <Note:62415.1>
Sun Solaris <Note:62409.1>
Windows NT Maximum 4Gb files on FAT
Theoretical 16Tb on NTFS
** See <Note:67421.1> before using large files
on NT with Oracle8
*2 There is a problem with DBVERIFY on 8.1.6
See <Bug:1372172>I'm not aware of a packaged PL/SQL solution for this in Oracle 8.1.7.3 - however it is very easy to create such a program...
Step 1
Write a simple Java program like the one listed:
import java.io.File;
public class fileCheckUtl {
public static int fileExists(String FileName) {
File x = new File(FileName);
if (x.exists())
return 1;
else return 0;
public static void main (String args[]) {
fileCheckUtl f = new fileCheckUtl();
int i;
i = f.fileExists(args[0]);
System.out.println(i);
Step 2 Load this into the Oracle data using LoadJava
loadjava -verbose -resolve -user user/pw@db fileCheckUtl.java
The output should be something like this:
creating : source fileCheckUtl
loading : source fileCheckUtl
creating : fileCheckUtl
resolving: source fileCheckUtl
Step 3 - Create a PL/SQL wrapper for the Java Class:
CREATE OR REPLACE FUNCTION FILE_CHECK_UTL (file_name IN VARCHAR2) RETURN NUMBER AS
LANGUAGE JAVA
NAME 'fileCheckUtl.fileExists(java.lang.String) return int';
Step 4 Test it:
SQL> select file_check_utl('f:\myjava\fileCheckUtl.java') from dual
2 /
FILE_CHECK_UTL('F:\MYJAVA\FILECHECKUTL.JAVA')
1 -
Hi,
I have been looking for a way to export huge datasets to CSV format for import with MySql.
As sqlplus SPOOL turned out to be slow and difficult to use, I ended up coding my own importer using the OCCI library.
I successfully compiled my code under Red Hat Enterprise Linux 6, 64 bit, and Oracle Instant Client 12.1. But as it only uses C++ STL and OCCI, it should as well build under other environments (e.g. Windows).
Here's the code:
* ociexport.cpp - High performance ORACLE to CSV export (using OCCI and STL)
* This program takes the ORACLE connection information from the following
* environment variables:
* ORACLE_USER, ORACLE_PASS, ORACLE_CONN
* Fields are exported in a CSV with delimiter ';'. Semicola within the fields
* are escaped with '\;'. Newlines and tabs in the fields are replaced by blanks.
* Empty fields and NULL values are exported as '\N' for easy MySQL import.
* CLOBS are exported as well. BLOBS and BFILES are not supported atm.
* Don't forget to set the LD_LIBRARY_PATH to your Oracle Client libs when
* building and running this program.
* @param $1 Select-Statement
* @param $2 Output file (optional - if empty, output goes to stdout)
* @author Bert Klauninger
* @version 0.1.0
* @changelog
* 2013-12-13 - Created
* 2013-12-16 - Added CLOB streaming support
#include <cstdlib>
#include <cstring>
#include <fstream>
#include <iostream>
#include <string>
#include <vector>
#include "occi.h"
using namespace oracle::occi;
using namespace std;
#define BUFFER_SIZE 1024 // Maximal characters of a LOB to be exported
* Escape all occurrences of ';' and convert newlines and tabs to blanks
string csv_escape(string src) {
string result;
const int imax = src.length();
for (int i = 0; i < imax; ++i) {
switch (src[i]) {
case '\n':
case '\r':
case '\t':
result += ' ';
break;
case ';':
result += '\\';
result += ';';
break;
default:
result += src[i];
return result;
* Execute a query and write CSV to the given file.
* NB: Empty fields are exported as NULL values!
void select_into(Connection *con, string sql, string file) {
if (! con) {
return;
bool fo = ! file.empty();
ofstream o;
if (fo) o.open(file.c_str(), ofstream::out);
Statement *s = con->createStatement(sql);
ResultSet *r = s->executeQuery();
vector<MetaData> m = r->getColumnListMetaData();
const int cols = m.size();
if (fo) cout << "Result has " << cols << " cols" << endl;
int cnt = 0;
while (r->next()) {
string line;
++cnt;
/* Stupid ORACLE starts numbering at 1, not 0 */
for (int i = 1; i <= cols; ++i) {
string col;
/* ...but: Metadata vector starts at 0 */
int t = m[i - 1].getInt(MetaData::ATTR_DATA_TYPE);
if (t == OCCI_SQLT_CLOB) {
/* Get the CLOB object via stream */
Clob clob = r->getClob(i);
if (! clob.isNull()) {
clob.open(OCCI_LOB_READONLY);
int len = clob.length();
Stream *instream = clob.getStream();
char *buffer = new char[BUFFER_SIZE];
memset(buffer, 0, BUFFER_SIZE);
int r = 0;
do {
r = instream->readBuffer(buffer, len);
for (int i = 0; i < r; ++i) {
col += (char) buffer[i];
} while (r != -1);
delete[] buffer;
clob.closeStream(instream);
clob.close();
} else if (! r->isNull(i)) {
/* Try to get field value as string */
col = r->getString(i);
if (col.empty()) {
line += "\\N";
} else {
line += csv_escape(col);
if (i < cols) {
line += ';';
if (fo) {
o << line << endl;
} else {
cout << line << endl;
s->closeResultSet(r);
con->terminateStatement(s);
if (fo) cout << cnt << " rows exported" << endl;
/*** MAIN ***/
int main (int argc, char* argv[]) {
if (! (argc == 2 || argc == 3)) {
cerr << "Usage: " << argv[0] << " sql-statement [output-file.csv]" << endl << endl;
cerr << "Output file uses column separator ';'. Semicola are escaped using '\\;'." << endl;
cerr << "NULL values and empty fields are exported as '\\N'." << endl;
cerr << "If no output file is specified, quieted output is sent to stdout." << endl;
cerr << "Login credentials can be set via the following environment variabes:" << endl;
cerr << "ORACLE_USER, ORACLE_PASS, ORACLE_CONN" << endl << endl;
return 1;
const string user = getenv("ORACLE_USER");
const string pass = getenv("ORACLE_PASS");
const string osid = getenv("ORACLE_CONN");
const string sql = argv[1];
const string outfile = (argc == 3) ? argv[2] : "";
bool fo = ! outfile.empty();
Environment* env = Environment::createEnvironment(Environment::DEFAULT);
int ret = 0;
try {
if (fo) cout << "Connecting as " << user << "@" << osid << endl;
Connection* const con = env->createConnection(user, pass, osid);
if (fo) {
cout << "Executing query " << sql << endl;
cout << "Writing results to " << outfile << endl;
select_into(con, sql, outfile);
if (fo) cout << "Closing connection" << endl;
env->terminateConnection(con);
} catch (SQLException ea) {
cerr << "Error: " << ea.what();
ret = 1;
Environment::terminateEnvironment(env);
return ret;
My Makefile:
ociexport: ociexport.cpp
LD_LIBRARY_PATH=/usr/lib/oracle/12.1/client64/lib \
gcc -Wall -g -I /usr/include/oracle/12.1/client64 \
-L /usr/lib/oracle/12.1/client64/lib \
-o bin/ociexport ociexport.cpp \
-lclntsh -lnnz12 -locci
Program call:
$ export LD_LIBRARY_PATH=/usr/lib/oracle/12.1/client64/lib
$ export ORACLE_USER=your_user
$ export ORACLE_PASS=your_pass
$ export ORACLE_CONN=your_connection_string
$ ./ociexport "SELECT * FROM applications" > export.csv
Best regards
BertHi
Give a look to the following book. You'll find the answer for some questions...
http://www.theserverside.com/books/masteringEJB/index.jsp
Chris -
Call a Vbscript from a stored procedure
Hi,
I wonder is it possible to call a Vbscript from a stored procedure, any good reference for this.
thanksWell here is quick and dirty example I just created.
Step 1. Create a test_batch.bat file that creates a folder "c:\test_dir" and copy "c:emp.lst" into it.
C:\oracle102\examples\test_batch.bat
md c:\test_dir
copy c:\emp.lst c:\test_dir
Step2. From SQLPLUS, spool scott.emp into c:\emp.lst and call the batch from the dbms_scheduler that kicks off right away,
set echo off
set feedback off
spool c:\emp.lst;
select * from scott.emp;
spool off;
begin
dbms_scheduler.create_job(job_name => 'run_batch',
job_type => 'EXECUTABLE',
job_action => 'C:\oracle102\examples\test_batch.bat',
start_date => sysdate,
enabled => true,
comments => 'Run VB Script');
end;
Check if the directory is created and if the file is copied over. Task is to kick off the executable and test is the VBscript within the batch. Challenge is how long the script runs before the next statement in the PL/SQL runs. May be you have to introduce sleep in between.
Note: You must have at least "CREATE JOB" privilege.
Happy coding!
Prakash
Message was edited by:
Prakash Rai
Maybe you are looking for
-
How do I delete an event in ical that i've accepted an invitation to.
how can I delete an event in the calender app that I've accepted an invitation to.
-
Calling a WCF service from pl sql using a scheduler.
Hi I am completely new to everything pl sql related. Right now, I need to call a WCF service method that returns a dataset. Then i need to take that dataset and insert the data into a table in the database. I want to do this by having a scheduler be
-
MODIFY DB TABLE IS WRKING IN 4.7 BUT NOT IN ECC6
Hi all, My belowe code is working in 4.7 BUT nOT IN ecc6. I am modifying the MARA-BISMT value as Blank. Pls suggest. REPORT zmara_update. TABLES:mara. DATA: gt_mara TYPE STANDARD TABLE OF mara, gw_mara TYPE mara. SELECT-OPTIONS:so_matnr F
-
E6-00, Screen blacks out as soon as a call is rece...
I'm posting this on behalf of a friend who has asked me to take a look at their E6-00 which has a problem that when a call is received the screen blacks out instantly and therefore she can't see the caller display. I've read elsewhere that it is an i
-
I now have a Mac and have since gotten rid of my Laptop. I was loading my Macromedia MX 2004 Suite on the Mac when it says "I have too many uses for the serial number." I have since found that I needed to transfer the old license to the new PC, but