not able to suppress sqlplus output on terminal - oracle

I am using following script to delimited file using spool in the unix server. I ssh into it using putty and execute the shell script.
Here is shell script:
/oracle/app/oracle/product/19.0.0/dbhome_1/bin/sqlplus -s /nolog<<-EOF
conn user/pass
SET PAGESIZE 0
SET LINESIZE 32000
SET NUMWIDTH 127
SET FEEDBACK OFF
set echo off
set heading off
set headsep off
SET MARKUP CSV ON DELIMITER | quote off
set termout off
spool mc_format.dat
select * from mytable;
spool off
EOF
but I am not able to suppress the rows printing out on the terminal, and eventually on log when I run using cron.
Is there any setting I am missing out?

Right from the documentation
SET TERMOUT OFF
Controls the display of output generated by commands in a script that is executed with #, ## or START. OFF suppresses the display so that you can spool output to a file without displaying the output on screen. ON displays the output on screen. TERMOUT OFF does not affect output from commands you enter interactively or redirect to SQL*Plus from the operating system.
So instead of the here document, call the script using one of the start methods mentioned.

Related

Oracle SQL Script - Why spool creates file twice

I run the following SQL-script using Oracle SQL Developer. I don't know why it creates two spool file and it also displays the entire operations in the Oracle SQL Developer console which it should not. Maybe it is due to the SET FEEDBACK ON and SET FEEDBACK OFF for each delete statement.
It creates two files and displays everything in script-output only when there are some records for deletion.
The script's call
#"C:\RM.sql"
The script
SET PAGES 0
SET LINESIZE 10000
SET TRIMS ON
SET ECHO OFF
SET HEADING ON
SET VERIFY OFF
SET FEEDBACK OFF
SET TERMOUT OFF
SET SERVEROUTPUT on size 1000000
SET TIMING OFF
SET COLSEP '|'
alter session set NLS_DATE_FORMAT = 'dd.mm.yyyy hh24:mi:ss';
whenever oserror exit -1
whenever sqlerror exit -2
-- The current timestamps into 'times' variable
column times new_value times noprint
select to_char(sysdate, 'YYYYMMDD_HH24MISS') times from DUAL;
-- variables definition
define output_file="C:\temp\filename_&times..log"
-- echo some text to the standard output
SET TERMOUT ON
PROMPT
PROMPT "The script counts and reports the records to be deleted..."
PROMPT
SET TERMOUT OFF
-- write the results to the 'output_file' file
spool &output_file
PROMPT
PROMPT "BEGIN------------------------------"
PROMPT "delete from the_table1"
select 'Total records BEFORE delete: ' || count (*) as count_records from the_table1;
SET FEEDBACK ON
PROMPT "Actual deletion of records..."
delete from the_table1;
commit;
SET FEEDBACK OFF
PROMPT "END------------------------------"
PROMPT
PROMPT "BEGIN------------------------------"
PROMPT "delete from the_table2"
select 'Total records BEFORE delete: ' || count (*) as count_records from the_table2;
SET FEEDBACK ON
PROMPT "Actual deletion of records..."
delete from the_table2;
commit;
SET FEEDBACK OFF
PROMPT "END------------------------------"
PROMPT
PROMPT "The script completed..."
SPOOL OFF
SET TERMOUT ON
PROMPT
PROMPT "&output_file has been successfully ended."
PROMPT
PROMPT
EXIT
;
I seem to recall TERMOUT and ECHO options depend on how sqlplus is being run and can give different results, similar to what you are seeing.
I'm using sqlplus as a example of how interactions with the run environment can affect output. This isn't really an answer, and I cannot reproduce the scenarios I used to see often, but I hope the following perhaps will offer some pointers as to what might be encountered.
Start with a simple test script test_off.sql:
set echo off
set termout off
prompt text1
spool f1.txt
prompt text2
spool off
prompt text 3
quit
Now let's run it a number of different ways:
1 Non-interactively Parameterised
$ sqlplus -S un/pw#idb #test_off.sql
$ cat f1.txt
text2
No output to screen, spool file created, with only the spooled contents.
2. Interactively
$ sqlplus -S un/pw/#db
#test_off.sql
$ cat f1.txt
text2
No output to screen, spool file created, with only the spooled contents.
3. Run as piped feed
$ cat test_off.sql | sqlplus -S un/pw#db
text1
text2
text 3
Here we see all the PROMPT command results on screen.
Similar effects may be seen if run within a HEREDOC block.
I've definitely seen (in older versions) some strange inconsistencies and perhaps your SQL Developer is similarly afflicted.

How to use sqlplus and sqlldr in a script file?

I am using sqlplus to get data from a remote database table and then using sqlldr to insert that data into some other table. I have written a shell script to do this. The sqlplus option is working but the sqlldr command is not working, although I have been able to insert using it from command prompt but it seems not be working in file.
Here's my script.
#!/bin/bash
#script to get 5 minutes of data from FCT table and insert into LOCAL table
sqlplus -s user/passs#FCT_DB <<EOF
SET TERMOUT OFF
SET LINESIZE 300
SET HEAD OFF
SPOOL export.csv
SELECT X FROM Y
SPOOL OFF
EXIT
EOF
! SQLLDR usr/pass#LOCAL_DB CONTROL=loader.ctl ERRORS=5000
The export.csv is created correctly. loader.ctl is also correct.
Also, whenever the script runs it shows data fetched on shell. I have searched that SET TERMOUT OFF helps not to display it, but it also doesn't seem to work.

Run a program within a batch file

I need to make a batch file which will execute a series of commands within a program. I need it to connect to an oracle database and then initiate a pull.
Here is by current file:
sqlplus [username]/[pass]#[host]:[port]/[service]
set feedback off
set term off
set linesize 32000
set pagesize 0
set trimspool on
set underline off
set heading on
set newpage none
spool C:\1.csv CREATE
[Query Goes here]
I run the script, but it doesn't execute anything except the first line. It connects okay, but waits for me to quit sqlplus to execute the rest of the script. Is there a way to fix this? If possible I would like to avoid using multiple files.
If anyone comes across this question looking for a *nix based solution, it'd be something like this:
sqlplus -s <username>/password <<EOF
set feedback off
set term off
set linesize 32000
set pagesize 0
set trimspool on
set underline off
set heading on
set newpage none
spool C:\1.csv CREATE
EOF
The subsequent commands are sent to SQLPLUS until it encounters EOF, then SQLPLUS will close.
But I'm not sure how to do the equivalent on Windows.

importing data into CSV from a remote oracle server, I need to use a spool like command in Windows

I need to write a similar script in windows in a bat/cmd file. This script gets my data in csv on linux. I was wondering if there is any equivalent in windows box.
FILE="test.csv"
sqlplus username/passwd#database <<EOF
SET PAGESIZE 50000
SET COLSEP ","
SET LINESIZE 200
SET FEEDBACK OFF
SPOOL $FILE
SELECT * FROM test_table ;
SPOOL OFF
EXIT
EOF
Just use the redirection operator!
FILE="test.csv"
sqlplus username/passwd#database <<EOF >> %FILE%
SET PAGESIZE 50000
SET COLSEP ","
SET LINESIZE 200
SET FEEDBACK OFF
SELECT * FROM test_table ;
EXIT
EOF
You can use same commands in windows also, only thing you need is Oracle Client installed on the windows client machine, if it is a server then its ok. Create a .bat file and copy following script into it. Run the file from command prompt or double click, and csv file is created if database connection is successful and the table exits.
#echo off
sqlplus username/passwd#database
SET PAGESIZE 50000
SET COLSEP ","
SET LINESIZE 200
SET FEEDBACK OFF
SET TRIMSPOOL OFF
SPOOL test.csv
SELECT * FROM test_table ;
SPOOL OFF
EXIT

Oracle SqlPlus - saving output in a file but don't show on screen

Using SqlPlus for Oracle, how do I save the output of a query in a file but not show it on the terminal/prompt.
Right from the SQL*Plus manual
http://download.oracle.com/docs/cd/B19306_01/server.102/b14357/ch8.htm#sthref1597
SET TERMOUT
SET TERMOUT OFF suppresses the display so that you can spool output from a script without
seeing it on the screen.
If both spooling to file and writing to terminal are not required, use SET TERMOUT OFF in >SQL scripts to disable terminal output.
SET TERMOUT is not supported in iSQL*Plus
Try this:
SET TERMOUT OFF;
spool M:\Documents\test;
select * from employees;
/
spool off;
Try This:
sqlplus -s ${ORA_CONN_STR} <<EOF >/dev/null
set termout off doesn't work from the command line, so create a file e.g. termout_off.sql containing the line:
set termout off
and call this from the SQL prompt:
SQL> #termout_off

Resources