This is the second part of my blog about Shell scripting with focus on Oracle database.
Here is an example of how you can use shell variables in sqlplus to create dynamic sql.
Shell to SQLPLUS
Here I am using shell variable to determine my where clause. In some cases you may not know whether user is going to pass in exact table name or just part of it. I am using a variable called WHERE_C (for where clause).
[oracle@localhost ~]$ WHERE_C="like 'EMP%'"
[oracle@localhost ~]$ sqlplus sys/oracle@orcl as sysdba << EOF
select table_name from dba_tables
where table_name ${WHERE_C};
EOF
SQL*Plus: Release 12.1.0.2.0 Production on Sat Mar 12 16:14:18 2016
Copyright (c) 1982, 2014, Oracle. All rights reserved.
Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
SQL>
TABLE_NAME
--------------------------------------------------------------------------------
EMP
EMP
EMP
EMP
EMPLOYEES
SQL> Disconnected from Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
Now if I determine in my shell script that user has input exact tablename then all I have to do is update the WHERE_C variable and run the same sql to get the result.
[oracle@localhost ~]$ WHERE_C="= 'EMPLOYEES'"
[oracle@localhost ~]$ sqlplus sys/oracle@orcl as sysdba << EOF
select table_name from dba_tables
where table_name ${WHERE_C};
EOF
SQL*Plus: Release 12.1.0.2.0 Production on Sat Mar 12 16:14:52 2016
Copyright (c) 1982, 2014, Oracle. All rights reserved.
Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
SQL>
TABLE_NAME
--------------------------------------------------------------------------------
EMPLOYEES
SQL> Disconnected from Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
Here is an example of how you can run a single sql on multiple databases. Assuming you have all your database connections in tnsnames.ora and you a have user with same password in all of the database, you can run following example. Database names are in db_list.lis file in the current directory with one database name per line. In my test environment I only have one database, so I’ll use that three times.
[oracle@localhost ~]$ cat db_list.lis
orcl
orcl
orcl
[oracle@localhost ~]$ cat run_multiple_db.ksh
#!/bin/ksh
CONNECT_STRG="hr/oracle"
DB_LIST=./db_list.lis
cat ${DB_LIST} | while read LINE
do
print "Working on ${LINE} database"
sqlplus -s ${CONNECT_STRG}@${LINE} << EOF
select instance_name from v\$instance;
EOF
done
[oracle@localhost ~]$ ./run_multiple_db.ksh
Working on orcl database
INSTANCE_NAME
----------------
cdb1
Working on orcl database
INSTANCE_NAME
----------------
cdb1
Working on orcl database
INSTANCE_NAME
----------------
cdb1
I have written many shell scripting to automate many tasks and to make my life easier. I’ll share more tips on shell scripting as I think of it.
That is all for now. Thanks for reading
.