1+ create or replace package body ut_refcursor_descriptor is
2+ /*
3+ utPLSQL - Version 3
4+ Copyright 2016 - 2017 utPLSQL Project
5+
6+ Licensed under the Apache License, Version 2.0 (the "License"):
7+ you may not use this file except in compliance with the License.
8+ You may obtain a copy of the License at
9+
10+ http://www.apache.org/licenses/LICENSE-2.0
11+
12+ Unless required by applicable law or agreed to in writing, software
13+ distributed under the License is distributed on an "AS IS" BASIS,
14+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+ See the License for the specific language governing permissions and
16+ limitations under the License.
17+ */
18+
19+ type t_type_name_map is table of varchar2(100) index by binary_integer;
20+ g_type_name_map t_type_name_map;
21+
22+ function get_column_type(a_desc_rec dbms_sql.desc_rec3) return varchar2 is
23+ l_result varchar2(500) := 'unknown datatype';
24+ begin
25+ if g_type_name_map.exists(a_desc_rec.col_type) then
26+ l_result := g_type_name_map(a_desc_rec.col_type);
27+ elsif a_desc_rec.col_schema_name is not null and a_desc_rec.col_type_name is not null then
28+ l_result := a_desc_rec.col_schema_name||'.'||a_desc_rec.col_type_name;
29+ end if;
30+ return l_result;
31+ end;
32+
33+ function get_columns_info(l_columns_tab dbms_sql.desc_tab3, l_columns_count integer) return ut_key_value_pairs is
34+ l_result ut_key_value_pairs := ut_key_value_pairs();
35+ begin
36+ for i in 1 .. l_columns_count loop
37+ l_result.extend;
38+ l_result(l_result.last) := ut_key_value_pair(l_columns_tab(i).col_name, get_column_type(l_columns_tab(i)));
39+ end loop;
40+ return l_result;
41+ end;
42+
43+ function get_columns_info(a_cursor in out nocopy sys_refcursor) return ut_key_value_pairs is
44+ l_cursor_number integer;
45+ l_columns_count pls_integer;
46+ l_columns_desc dbms_sql.desc_tab3;
47+ begin
48+ if a_cursor is null or not a_cursor%isopen then
49+ return ut_key_value_pairs();
50+ end if;
51+ l_cursor_number := dbms_sql.to_cursor_number( a_cursor );
52+ dbms_sql.describe_columns3( l_cursor_number, l_columns_count, l_columns_desc );
53+ a_cursor := dbms_sql.to_refcursor( l_cursor_number );
54+ return get_columns_info( l_columns_desc, l_columns_count);
55+ end;
56+
57+ begin
58+ g_type_name_map( dbms_sql.binary_bouble_type ) := 'BINARY_DOUBLE';
59+ g_type_name_map( dbms_sql.bfile_type ) := 'BFILE';
60+ g_type_name_map( dbms_sql.binary_float_type ) := 'BINARY_FLOAT';
61+ g_type_name_map( dbms_sql.blob_type ) := 'BLOB';
62+ g_type_name_map( dbms_sql.long_raw_type ) := 'LONG RAW';
63+ g_type_name_map( dbms_sql.char_type ) := 'CHAR';
64+ g_type_name_map( dbms_sql.clob_type ) := 'CLOB';
65+ g_type_name_map( dbms_sql.long_type ) := 'LONG';
66+ g_type_name_map( dbms_sql.date_type ) := 'DATE';
67+ g_type_name_map( dbms_sql.interval_day_to_second_type ) := 'INTERVAL DAY TO SECOND';
68+ g_type_name_map( dbms_sql.interval_year_to_month_type ) := 'INTERVAL YEAR TO MONTH';
69+ g_type_name_map( dbms_sql.raw_type ) := 'RAW';
70+ g_type_name_map( dbms_sql.timestamp_type ) := 'TIMESTAMP';
71+ g_type_name_map( dbms_sql.timestamp_with_tz_type ) := 'TIMESTAMP WITH TIME ZONE';
72+ g_type_name_map( dbms_sql.timestamp_with_local_tz_type ) := 'TIMESTAMP WITH LOCAL TIME ZONE';
73+ g_type_name_map( dbms_sql.varchar2_type ) := 'VARCHAR2';
74+ g_type_name_map( dbms_sql.number_type ) := 'NUMBER';
75+ g_type_name_map( dbms_sql.rowid_type ) := 'ROWID';
76+ g_type_name_map( dbms_sql.urowid_type ) := 'UROWID';
77+ end;
78+ /
0 commit comments