SPOOL

复制代码
-----How to Pass UNIX Variable to SPOOL Command (Doc ID 1029440.6)
setenv只有csh才有不行啊

PROBLEM DESCRIPTION:
====================

You would like to put a file name in Unix and have SQL*Plus read that file name, 
instead of hardcoding it, because it will change.

You want to pass a Unix variable on the command line like:

   SQL*Plus -s <user>/<password>@test.sql $SPOOL

and have the $SPOOL value be passed into existing SQL.



SOLUTION DESCRIPTION:
=====================

This syntax will not work because everything after the word 'SQL*Plus' is taken 
as arguments passed in to SQL*Plus, and SQL*Plus does not expand 
(or even recognize) the shell variable.  

One way around this is to set the SPOOL variable just prior to running the 
script.  For example:

set the SPOOL variable with this line:

   setenv SPOOL /u02/usrname/spoolfile.


Then you create a file called testfile.sql that contained the lines:

   spool $SPOOL;
   select user from dual;
   select count(*) from dba_tables;


And you then type 'SQL*Plus -s <user>/<password> @testfile.sql'.
The $SPOOL variable will be expanded inside the file to generate the file 
/u02/usrname/spoolfile.lst for the session.  Once exported, shell variables can 
be referenced one level down from their defining shell.

-------generate a grant script:

spool generate_sql.sql

set long 9999999
set header off

SQL> select 'GRANT READ, SELECT on ' || owner || '.' || table_name || ' to <user_name>;' from dba_tables; -- Replace <user_name> with the user you want to give permissions to.

spool off

---------------set 这些如果直接执行不行------------

SQL> set NEWPAGE 0

SQL> set SPACE 0

SQL> set LINESIZE 80

SQL> set PAGESIZE 0

SQL> set ECHO OFF

SQL> set FEEDBACK OFF

SQL> set HEADING OFF

SQL> spool report.txt

SQL> select sysdate from dual;

10-JUN-24

SQL> spool off

SQL> exit

Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production

Version 19.20.0.0.0

[oracle@rac1 ~]$ cat report.txt
SQL> select sysdate from dual;
10-JUN-24
SQL> spool off

goal: How To Create a flat file Without Showing Statement Or ''Spool Off''

fact: SQL*Plus

fix:

Create a script, e.g. report.sql, with the following contents:

set NEWPAGE 0

set SPACE 0

set LINESIZE 80

set PAGESIZE 0

set ECHO OFF

set FEEDBACK OFF

set HEADING OFF

spool report.txt

select sysdate from dual; <--- your SQL statement here

spool off

Run the script from SQL*Plus:

SQL> @report.sql

-----spool 两个..

复制代码
Case 1
------
In SQL*Plus, how do you spool data to a file with a
.TXT file extension?

When you issue the following line of code:

     SPOOL myfile

this automatically spools data to MYFILE.LST.
How do you spool to MYFILE.TXT?


Case 2
------
You are spooling to a filename that the user passes in as
a substitution variable.  How do you append a .TXT file
extension, as opposed to the default .LST, to the 
filename?

Sample script:

     SPOOL &&filename
     SELECT * FROM dept
     /
     SPOOL OFF

If you enter MYFILE for filename, MYFILE.LST is the default
spooled filename.  How do you spool to MYFILE.TXT?


Solution Description:
=====================

Case 1
------
Specify the .TXT extension after the filename:

     SPOOL myfile.txt


Case 2
------
If you are spooling to a substitution variable,
specify "..txt" after the substitution variable.

     SPOOL &&filename..txt
     SELECT * FROM dept
     /
     SPOOL OFF

If you enter MYFILE for filename, this stores data into the
MYFILE.TXT file.

Make sure to append 2 periods ("..") to the substitution variable.
If you only include 1 period and enter MYFILE for filename,
this stores data into the MYFILETXT.LST file.


 

-----------------------加上Oracle SID

复制代码
How is "@" interpretted when used in spooled file name?
========================================================
When you spool output to file with "@" included in the file name, the "@" is 
replaced with ORACLE_SID value.  

-rw-r--r--. 1 oracle oinstall 500 Jun 10 13:30 TESTcdb1..txt

[oracle@rac1 ~]$ cat testfile1.sql

spool &&filename@..txt ---------------这里不能两个.

select user from dual;

select count(*) from dba_tables;

[oracle@rac1 ~]$ cat TESTcdb1..txt

USER


SYS

COUNT(*)


2202

SQL> exit

-rw-r--r--. 1 oracle oinstall 88 Jun 10 13:31 testfile1.sql

-rw-r--r--. 1 oracle oinstall 496 Jun 10 13:31 T11cdb1.txt

[oracle@rac1 ~]$ cat T11cdb1.txt

USER


SYS

COUNT(*)


2202

SQL> -----这里为什么没有exit 因为我用ctrl D退出的

[oracle@rac1 ~]$ cat testfile1.sql

spool &&filename@.txt

select user from dual;

select count(*) from dba_tables;

----How can you generate a spool file format c:\temp\Overnight_13FEB06.log?

SOLUTION

Sample script:

COLUMN SPOOL_DATE NEW_VALUE FILE_DATE

COLUMN SPOOL_PREFIX NEW_VALUE FILE_PREFIX

COLUMN SPOOL_SUFFIX NEW_VALUE FILE_SUFFIX

SELECT

TO_CHAR(SYSDATE,'YYYYMMDD') SPOOL_DATE,

'c:\temp\Overnight_' SPOOL_PREFIX,

'.log' SPOOL_SUFFIX

FROM

DUAL

/

SPOOL &FILE_PREFIX.&FILE_DATE.&FILE_SUFFIX

/

report

/

SPOOL OFF

[oracle@rac1 ~]$ cat spooldate.sql

COLUMN SPOOL_DATE NEW_VALUE FILE_DATE

COLUMN SPOOL_PREFIX NEW_VALUE FILE_PREFIX

COLUMN SPOOL_SUFFIX NEW_VALUE FILE_SUFFIX

SELECT

TO_CHAR(SYSDATE,'YYYYMMDD') SPOOL_DATE,

'/tmp/Overnight_' SPOOL_PREFIX,

'.log' SPOOL_SUFFIX

FROM

DUAL

/

SPOOL &FILE_PREFIX.&FILE_DATE.&FILE_SUFFIX

/

report

/

SPOOL OFF

[oracle@rac1 ~]$

------How to change spool file name dynamically ?

复制代码
Each time query executes, the same file should not be overwritten.
It would be helpful in situations where an output of a table is 
monitored at periodic intervals to find the difference.


Solution Description
--------------------
COLUMN command with NEW_VALUE can be used to accomplish this.
Have the following three lines before the query -

column col1 new_value filename; 
select to_char(sysdate,'DDMONYYHH24MI') col1 from dual; 
spool &&filename..txt 

select .... ; -- original query 
spool off; 


Spool file name will contain the date and time so that they are not
overwritten.



(NOTE: In the example above, user details / company name / address / email / telephone number represent a fictitious sample (based upon made up data used in the Oracle Demos).  Any similarity to actual persons, living or dead, is purely coincidental and not intended in any manner.)

------------------ script to automatically label each spool filename with a timestamp of the date and time of the script execution.

Background

If you must execute a single SQL*Plus script several times (for example because you run a report every week or when running a script in batch mode regularly), and the scriptspools the output to a file, you may want to give a unique name to the spool file for each execution.

Script

The following SQL*Plus script illustrates the timestamp method:

column timecol new_value timestamp
select to_char(sysdate,'.MMDDYY_HHMISS') timecol
from sys.dual
/
spool output_&&timestamp
select sysdate from sys.dual
/
spool off

If this script is executed at 12:34:12 AM on October 17, 1999, the output would be spooled to an output file with the name 'output.101799_123412'. You can modify the date format mask ('.MMDDYY_HHMISS') and/or the constant filename portion ('output_') of the example to create different spool filename formats.

Depending on the operating system the spool file will have the suffix .LIS or .LST appended to it's name by default. To replace the default ending with your own, for example '.txt', change the script like suggested below.

column timecol new_value timestamp
column spool_extension new_value suffix
select to_char(sysdate,'_MMDDYY_HHMISS') timecol,
'.txt' spool_extension
from sys.dual
/
spool output_&&timestamp&&suffix
select sysdate from sys.dual
/
spool off

You can take this even a step further and give the user of your script control over the file extension of the spool file. For example on UNIX make files can process files of a designated extension. On Microsoft Windows on the other hand most file extensions are associated with certain defined actions when you for example 'Open' or 'Edit' a file.

Replace the literal '.txt' with a variable to let the user of your script decide on an file extension that is useful for them.

select to_char(sysdate,'_MMDDYY_HHMISS') timecol,
'.'||&file_ending spool_extension

Please note, this last option is not useful for batch files.


复制代码
How to generate sql/select statement from a select statement?


Solution Description
--------------------
This sample will show how to generate a select statement from
a select statement. For example, how to dynamically create a
sql script which contains a set of select statements based on 
column values from the EMP table. Specifically, how to create
a set of select statements based on each deptno value in EMP 
and job='CLERK'?

How to create this script?
==========================
[Sample script based on demo table EMP]

1. The following is an example of how you can dynamically create select
   statements based on column values in table. For example, how to generate
   select statements based on each deptno value and job='CLERK' in EMP table.   

Use the following code to create a SQL script (This includes comments 
for better documentation):

*****************************************

-- Given demo table EMP.
-- The following select statement will generate a sql file with
   select statements based on each department number (deptno) and
   job = 'CLERK'

set heading off
set feedback off
set echo off
spool temp.sql

select distinct 'select empno, ename, job from emp where deptno='||
deptno
||' and job = '||''''||
JOB
||''''||';' query_statement
from emp
where job = 'CLERK'
/
spool off

*****************************************

Result
------
Executing the above script will generate temp.sql file.

The temp.sql file contains: 
select empno, ename, job from emp where deptno=10 and job = 'CLERK';
select empno, ename, job from emp where deptno=20 and job = 'CLERK';
select empno, ename, job from emp where deptno=30 and job = 'CLERK';


You can now execute temp.sql to run the dynamically generated select statements.
相关推荐
一行玩python10 小时前
sqlite3,一个轻量级的 C++ 数据库库!
开发语言·数据库·c++·oracle·sqlite
潇潇和多客开源13 小时前
数据库的数据被清除了,该如何恢复?
数据库·oracle
胖头鱼的鱼缸(尹海文)13 小时前
数据库管理-第274期 Oracle Enterprise Manager 24ai新特性一览(20241223)
数据库·oracle
百度智能云技术站1 天前
广告投放系统成本降低 70%+,基于 Redis 容量型数据库 PegaDB 的方案设计和业务实践
数据库·redis·oracle
梦想平凡1 天前
PHP 微信棋牌开发全解析:高级教程
android·数据库·oracle
夏木~1 天前
Oracle 中什么情况下 可以使用 EXISTS 替代 IN 提高查询效率
数据库·oracle
吴冰_hogan1 天前
MySQL InnoDB 存储引擎 Redo Log(重做日志)详解
数据库·oracle
CodeCraft Studio1 天前
【实用技能】如何在 SQL Server 中处理 Null 或空值?
数据库·oracle·sqlserver
武汉联从信息1 天前
浅谈ORACLE中间件SOA BPM,IDM,OID,UCM,WebcenterPortal服务器如何做迁移切换
oracle