2026-03-12 20:23:15
This commit is contained in:
141
csierra/cs_internal/cs_pr_internal.sql
Normal file
141
csierra/cs_internal/cs_pr_internal.sql
Normal file
@@ -0,0 +1,141 @@
|
||||
----------------------------------------------------------------------------------------
|
||||
--
|
||||
-- File name: cs_pr_internal.sql
|
||||
--
|
||||
-- Purpose: Print Table (vertical display of result columns for last query)
|
||||
--
|
||||
-- Author: Carlos Sierra
|
||||
--
|
||||
-- Version: 2021/05/16
|
||||
--
|
||||
-- Usage: Execute connected to PDB or CDB.
|
||||
--
|
||||
-- Parameter options:
|
||||
--
|
||||
-- 1. directory_path/script_name.sql (with one query)
|
||||
--
|
||||
-- 2. one query
|
||||
--
|
||||
-- 3. null (assumes then last sql executed)
|
||||
--
|
||||
-- Examples: 1. SQL> @cs_pr_internal.sql "/tmp/carlos.sql"
|
||||
--
|
||||
-- 2. SQL> @cs_pr_internal.sql "SELECT * FROM v$database;"
|
||||
--
|
||||
-- 3. SQL> @cs_pr_internal.sql ""
|
||||
--
|
||||
-- Notes: When passing a query which contains single quotes then double them
|
||||
-- e.g. SQL> @cs_pr_internal.sql "SELECT sid||'',''||serial# AS sid_serial FROM v$session"
|
||||
--
|
||||
-- Modified version of Tanel Poder pr.sql script, which is a mofified version
|
||||
-- of Tom Kyte printtbl code.
|
||||
--
|
||||
---------------------------------------------------------------------------------------
|
||||
--
|
||||
-- https://github.com/tanelpoder/tpt-oracle/blob/master/pr.sql
|
||||
-- Notes: This script is based on Tom Kyte's original printtbl code ( http://asktom.oracle.com )
|
||||
-- For coding simplicity (read: lazyness) I'm using custom quotation marks ( q'\ ) so
|
||||
-- this script works only from Oracle 10gR2 onwards
|
||||
-- prompt Pivoting output using Tom Kyte's printtab....
|
||||
--
|
||||
SET TERM OFF;
|
||||
-- added my_sid to avoid collisons accross concurrent executions of this script
|
||||
COL my_sid NEW_V my_sid NOPRI;
|
||||
SELECT SYS_CONTEXT('USERENV', 'SID') AS my_sid FROM DUAL
|
||||
/
|
||||
SPO &&cs_file_name..txt APP;
|
||||
SPO OFF;
|
||||
SAVE "/tmp/sql_pr_tmpfile_&&my_sid..sql" REPLACE;
|
||||
STORE SET "/tmp/set_pr_tmpfile_&&my_sid..sql" REPLACE;
|
||||
SET TERM ON HEA OFF TAB OFF FEED OFF ECHO OFF VER OFF TRIMS ON SERVEROUT ON SIZE UNL TRIM ON LIN 4050;
|
||||
--
|
||||
--PRO
|
||||
--PRO 1. Enter [directory_path/script_name.sql|"query"|null]:
|
||||
DEF cs_parameter = '&1.';
|
||||
UNDEF 1;
|
||||
SET TERM OFF;
|
||||
--
|
||||
COL cs_option NEW_V cs_option NOPRI;
|
||||
COL cs_parameter NEW_V cs_parameter NOPRI;
|
||||
SELECT CASE
|
||||
WHEN LOWER(SUBSTR(TRIM(q'[&&cs_parameter.]'), -4, 4)) = '.sql' THEN '1'
|
||||
WHEN TRIM(q'[&&cs_parameter.]') IS NULL THEN '3'
|
||||
ELSE '2'
|
||||
END AS cs_option,
|
||||
CASE
|
||||
WHEN LOWER(SUBSTR(TRIM(q'[&&cs_parameter.]'), -4, 4)) = '.sql' THEN TRIM(q'[&&cs_parameter.]')
|
||||
WHEN TRIM(q'[&&cs_parameter.]') IS NULL THEN '/tmp/sql_pr_tmpfile_&&my_sid..sql'
|
||||
ELSE TRIM(';' FROM TRIM('"' FROM TRIM(q'[&&cs_parameter.]')))
|
||||
END AS cs_parameter
|
||||
FROM DUAL
|
||||
/
|
||||
--
|
||||
SPOOL "/tmp/sql2_pr_tmpfile_&&my_sid..sql";
|
||||
PRO &&cs_parameter.
|
||||
SPOOL OFF;
|
||||
--
|
||||
COL script_name NEW_V script_name NOPRI;
|
||||
SELECT CASE '&&cs_option.'
|
||||
WHEN '1' THEN q'[&&cs_parameter.]'
|
||||
WHEN '2' THEN '/tmp/sql2_pr_tmpfile_&&my_sid..sql'
|
||||
WHEN '3' THEN '/tmp/sql_pr_tmpfile_&&my_sid..sql'
|
||||
END AS script_name
|
||||
FROM DUAL
|
||||
/
|
||||
--
|
||||
GET "&&script_name." NOLIST;
|
||||
SAVE "/tmp/sql_pr_tmpfile_&&my_sid..sql" REPLACE;
|
||||
--
|
||||
0 c clob := q'\
|
||||
0 declare
|
||||
--
|
||||
666666 \';;
|
||||
666666 l_theCursor integer default dbms_sql.open_cursor;;
|
||||
666666 l_columnValue varchar2(4000);;
|
||||
666666 l_status integer;;
|
||||
666666 l_descTbl dbms_sql.desc_tab;;
|
||||
666666 l_colCnt number;;
|
||||
666666 l_amount number;;
|
||||
666666 begin
|
||||
666666 IF DBMS_LOB.instr(c, ';') = 0 THEN
|
||||
666666 l_amount := DBMS_LOB.getlength(c);;
|
||||
666666 ELSE
|
||||
666666 l_amount := DBMS_LOB.instr(c, ';') - 1;;
|
||||
666666 END IF;;
|
||||
666666 c := DBMS_LOB.substr(c, l_amount);;
|
||||
666666 dbms_sql.parse( l_theCursor, c, dbms_sql.native );;
|
||||
666666 dbms_sql.describe_columns( l_theCursor, l_colCnt, l_descTbl );;
|
||||
666666 for i in 1 .. l_colCnt loop
|
||||
666666 if l_descTbl(i).col_type not in (112, 113) then -- excludes blob and clob (see https://docs.oracle.com/cd/E11882_01/server.112/e41085/sqlqr06002.htm#SQLQR959)
|
||||
666666 dbms_sql.define_column( l_theCursor, i,
|
||||
666666 l_columnValue, 4000 );;
|
||||
666666 end if;;
|
||||
666666 end loop;;
|
||||
666666 l_status := dbms_sql.execute(l_theCursor);;
|
||||
666666 while ( dbms_sql.fetch_rows(l_theCursor) > 0 ) loop
|
||||
666666 dbms_output.put_line( '+--------------------------------+' );;
|
||||
666666 for i in 1 .. l_colCnt loop
|
||||
666666 if l_descTbl(i).col_type not in (112, 113) then -- excludes blob and clob (see https://docs.oracle.com/cd/E11882_01/server.112/e41085/sqlqr06002.htm#SQLQR959)
|
||||
666666 dbms_sql.column_value( l_theCursor, i,
|
||||
666666 l_columnValue );;
|
||||
666666 dbms_output.put_line
|
||||
666666 ( '|'||lpad( lower(l_descTbl(i).col_name),
|
||||
666666 31 ) || ' : ' || l_columnValue );;
|
||||
666666 end if;;
|
||||
666666 end loop;;
|
||||
666666 end loop;;
|
||||
666666 dbms_output.put_line( '+--------------------------------+' );;
|
||||
666666 exception
|
||||
666666 when others then
|
||||
666666 dbms_output.put_line(dbms_utility.format_error_backtrace);;
|
||||
666666 raise;;
|
||||
666666 end;;
|
||||
SET TERM ON;
|
||||
SPO &&cs_file_name..txt APP;
|
||||
/
|
||||
--
|
||||
@"/tmp/set_pr_tmpfile_&&my_sid..sql";
|
||||
GET "&&script_name." NOLIST;
|
||||
HOST rm "/tmp/set_pr_tmpfile_&&my_sid..sql" "/tmp/sql_pr_tmpfile_&&my_sid..sql" "/tmp/sql2_pr_tmpfile_&&my_sid..sql";
|
||||
SET TERM ON;
|
||||
--
|
||||
Reference in New Issue
Block a user