select initcap(replace(lower('SOME_COLUMN_NAME'),'_',' ')) from dual;
Showing posts with label Oracle. Show all posts
Showing posts with label Oracle. Show all posts
Friday, May 8, 2020
Oracle: Capitalizing and removing underscores from a column name
Oracle table names are all caps with underscores. So if you're consuming them from something like all_tab_columns, this quick little function makes them a little prettier.
Monday, August 5, 2019
Oracle: Obtaining a date for a given business day in a month.
Oracle SQL to get the date for a given business day in a passed in month, sysdate used for example.
With a as( SELECT trunc(sysdate,'MM')- 1 + level AS day ,to_number(to_char(trunc(sysdate,'MM')- 1 + level,'D')) as weekday ,rownum as business_day FROM dual where to_char(trunc(sysdate,'MM')- 1 + level,'D') not in (1,7) -- add in a check for a holday calendar here CONNECT BY LEVEL between 1 and EXTRACT(day from last_day(sysdate)) ) select a.day from a where business_day = 5
Monday, April 22, 2019
Oracle: Looking at the cursor metadata
Based on information provided at https://boobalganesan.blogspot.com/2017/08/dbmssqldescribecolumns-tips.html here are a few steps for dumping out cursor meta data returned from a stored proc.
first, create a global temp table
then run this block
first, create a global temp table
CREATE GLOBAL TEMPORARY TABLE desc_col_test ( col_id NUMBER(10), col_desc VARCHAR2(255) );
then run this block
declare O_RES SYS_REFCURSOR; v_cursor_number number; v_columns number; v_desc_tab dbms_sql.desc_tab; begin delete from desc_col_test; --Adust to your variables accordingly YOUR_SCHEMA.YOUR_PKG_YOUR_PROD(p_dt => TO_DATE ('31-12-2018 00:00:00', 'DD-MM-YYYY HH24:MI:SS'), o_res => O_RES); v_cursor_number := dbms_sql.to_cursor_number(rc => O_RES); --Get information on the columns dbms_sql.describe_columns(v_cursor_number, v_columns, v_desc_tab); --Loop through all the columns, find COLUMN1 position and type for i in 1 .. v_desc_tab.count loop INSERT INTO desc_col_test (col_id, col_desc) VALUES (i, 'col_name:'||decode(v_desc_tab(i).col_name, Null, 'Null', v_desc_tab(i).col_name)); INSERT INTO desc_col_test (col_id, col_desc) VALUES (i, 'col_type: ' || case when v_desc_tab(i).col_type = 1 then 'VARCHAR2' when v_desc_tab(i).col_type = 2 then 'NUMBER' when v_desc_tab(i).col_type = 8 then 'LONG' when v_desc_tab(i).col_type = 9 then 'VARCHAR' when v_desc_tab(i).col_type = 12 then 'DATE' when v_desc_tab(i).col_type = 23 then 'RAW' when v_desc_tab(i).col_type = 69 then 'ROWID' when v_desc_tab(i).col_type = 96 then 'CHAR' when v_desc_tab(i).col_type = 100 then 'BINARY_FLOAT' when v_desc_tab(i).col_type = 101 then 'BINARY_DOUBLE' when v_desc_tab(i).col_type = 105 then 'MLSLABEL' when v_desc_tab(i).col_type = 106 then 'MLSLABEL' when v_desc_tab(i).col_type = 112 then 'CLOB' when v_desc_tab(i).col_type = 113 then 'BLOB' when v_desc_tab(i).col_type = 114 then 'BFILE' when v_desc_tab(i).col_type = 115 then 'CFILE' when v_desc_tab(i).col_type = 178 then 'TIME' when v_desc_tab(i).col_type = 179 then 'TIME WITH TIME ZONE' when v_desc_tab(i).col_type = 180 then 'TIMESTAMP' when v_desc_tab(i).col_type = 181 then 'TIMESTAMP WITH TIME ZONE' when v_desc_tab(i).col_type = 231 then 'TIMESTAMP WITH LOCAL TIME ZONE' when v_desc_tab(i).col_type = 182 then 'INTERVAL YEAR TO MONTH' when v_desc_tab(i).col_type = 183 then 'INTERVAL DAY TO SECOND' else 'OTHER' end); INSERT INTO desc_col_test (col_id, col_desc) VALUES (i, 'col_precision:'||decode(v_desc_tab(i).col_precision, Null, 'Null', v_desc_tab(i).col_precision)); INSERT INTO desc_col_test (col_id, col_desc) VALUES (i, 'col_max_len:'||decode(v_desc_tab(i).col_max_len, Null, 'Null', v_desc_tab(i).col_max_len)); INSERT INTO desc_col_test (col_id, col_desc) VALUES (i, 'col_name_len:'||decode(v_desc_tab(i).col_name_len, Null, 'Null', v_desc_tab(i).col_name_len)); INSERT INTO desc_col_test (col_id, col_desc) VALUES (i, 'col_schema_name:'||decode(v_desc_tab(i).col_schema_name, Null, 'Null', v_desc_tab(i).col_schema_name)); INSERT INTO desc_col_test (col_id, col_desc) VALUES (i, 'col_schema_name_len:'||decode(v_desc_tab(i).col_schema_name_len, Null, 'Null', v_desc_tab(i).col_schema_name_len)); INSERT INTO desc_col_test (col_id, col_desc) VALUES (i, 'col_scale:'||decode(v_desc_tab(i).col_scale, Null, 'Null', v_desc_tab(i).col_scale)); INSERT INTO desc_col_test (col_id, col_desc) VALUES (i, 'col_charsetid:'||decode(v_desc_tab(i).col_charsetid, Null, 'Null', v_desc_tab(i).col_charsetid)); INSERT INTO desc_col_test (col_id, col_desc) VALUES (i, 'col_charsetform:'||decode(v_desc_tab(i).col_charsetform, Null, 'Null', v_desc_tab(i).col_charsetform)); end loop; end; / SELECT * FROM (SELECT col_id, regexp_substr(col_desc,'[^:]+',1,1) col_desc_name, regexp_substr(col_desc,'[^:]+',1,2) col_desc_value FROM desc_col_test ) pivot (MAX(col_desc_value) FOR col_desc_name IN ('col_name' AS COL_NAME, 'col_type' AS COL_TYPE, 'col_precision' AS COL_PRECISION, 'col_max_len' AS COL_MAX_LEN, 'col_name_len' AS COL_NAME_LEN, 'col_schema_name' AS COL_SCHEMA_NAME, 'col_schema_name_len' AS COL_SCHEMA_NAME_LEN, 'col_scale' AS COL_SCALE, 'col_charsetid' AS COL_CHARSETID, 'col_charsetform' AS COL_CHARSETFORM, 'Nullable' AS NULLABLE)) ORDER BY col_id;
Friday, March 22, 2019
Oracle Tricks: Getting a range of numbers
Another method for getting a range of dates from Oracle PL/SQL
select last_day(to_date(to_char(months.month) || '/1/' || to_char(years.year), 'mm/dd/yyyy')) as range_EOM from (select rownum year from dual connect by level <= 2019) years, (select rownum month from dual connect by level <= 12) months where years.year >= 2000 and months.month >= 1
Friday, March 1, 2019
Grabbing UTC Hour from Oracle
A simple sql script for obtaining gmt hour from Oracle
select sys_extract_utc(systimestamp) as UTC, extract(hour from sys_extract_utc(systimestamp) ) as UTC_HOUR, extract(hour from cast(to_char(sysdate, 'DD-MON-YYYY HH24:MI:SS') as timestamp) ) as local_hour from dual
Monday, November 19, 2018
Generating a series of Previous Month End Dates for a given number of years in Oracle
A very short oracle query for generating a range of previous month end dates for a number of years
with years as
(select extract(year from sysdate) - (level - 1) as year
from dual
connect by level <=
(select extract(year from sysdate) -
extract(year from date '2000-12-01') --range of years sysdate to 2001
from dual)
order by year desc),
months as
(
select rownum as month_num,to_char(date '2000-12-01' + numtoyminterval(level,'month'),'MONTH') as month
from dual
connect by level <= 12
)
select last_day(to_date(to_char(years.year) || '-' ||
to_char(months.month_num) || '-1',
'yyyy-mm-dd')) as as_of_date
from years, months
where last_day(to_date(years.year || '-' || months.month, 'yyyy-mm')) < sysdate
Thursday, August 30, 2018
Full Year Pivot Using Oracle
A quick example of a full year pivot using Oracle
select
*
FROM
(
select
account_no,
to_char(
trunc(some_date_column, 'MONTH'),
'MON YYYY'
) as transaction_month
from
some_table
where
trunc(some_date_column, 'YEAR') = '01-jan-2018'
) PIVOT (
count(transaction_month) for transaction_month in (
'JAN 2018', 'FEB 2018', 'MAR 2018',
'APR 2018', 'MAY 2018', 'JUN 2018',
'JUL 2018', 'AUG 2018', 'SEP 2018',
'OCT 2018', 'NOV 2018', 'DEC 2018'
)
)
*
FROM
(
select
account_no,
to_char(
trunc(some_date_column, 'MONTH'),
'MON YYYY'
) as transaction_month
from
some_table
where
trunc(some_date_column, 'YEAR') = '01-jan-2018'
) PIVOT (
count(transaction_month) for transaction_month in (
'JAN 2018', 'FEB 2018', 'MAR 2018',
'APR 2018', 'MAY 2018', 'JUN 2018',
'JUL 2018', 'AUG 2018', 'SEP 2018',
'OCT 2018', 'NOV 2018', 'DEC 2018'
)
)
Thursday, January 11, 2018
Oracle Case statements when testing for NULL
Just a little tidbit when working with ORACLE and case statements.
The first method, where the given column name is passed to successive WHEN statements, WHEN must have a value to work with, so you have to convert the null value into something and test for it.
Method 1: Covert the incoming value first
Method 2: do the condition checks in the WHEN
The first method, where the given column name is passed to successive WHEN statements, WHEN must have a value to work with, so you have to convert the null value into something and test for it.
Method 1: Covert the incoming value first
CASE nvl(some_column,'NULL') WHEN 'NULL' THEN some_other_column WHEN 'ABC' THEN another_column ELSE some_column END some_column
Method 2: do the condition checks in the WHEN
CASE WHEN nval(some_column,'NULL') = 'NULL' THEN some_other_column WHEN some_column = 'ABC' THEN another_column ELSE some_column END some_column
Subscribe to:
Posts (Atom)