Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как узнать тип данных переменной внутри блока PL/SQL? / 16 сообщений из 16, страница 1 из 1
30.06.2017, 02:11
    #39480064
--Eugene--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать тип данных переменной внутри блока PL/SQL?
Вот с помощью DUMP() можно получить код типа данных значения:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
with x as (
select 'nvarchar2' name, dump(cast('a' as nvarchar2(1))) dmp from dual union all
select 'number', dump(1) from dual union all
select 'date', dump(sysdate) from dual union all
select 'raw', dump(low_value) from user_tab_cols where low_value is not null and rownum = 1 union all
select 'xmltype', dump(xmltype('<x/>')) from dual union all
select 'rowid', dump(rowid) from dual union all
select 'varchar2', dump('a') from dual union all
select 'timestamp', dump(systimestamp) from dual union all
select 'iytm', dump(interval '1' year) from dual union all
select 'idts', dump(interval '1' day) from dual
)
select name, regexp_substr(dmp, 'Typ=(\d+)', 1, 1, '', 1) typecode from x

NAMETYPECODEnvarchar21number2date13raw23xmltype58rowid69varchar296timestamp188iytm189idts190
А можно ли подобным образом понять какой тип у значения в PL/SQL блоке?
...
Рейтинг: 0 / 0
30.06.2017, 02:22
    #39480066
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать тип данных переменной внутри блока PL/SQL?
any% в помощь.
В смысле - кастуешь в ANY, затем разбираешь что получил.
Ну или просто DBMS_SQL - там можно describe
...
Рейтинг: 0 / 0
30.06.2017, 02:36
    #39480069
--Eugene--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать тип данных переменной внутри блока PL/SQL?
andrey_anonymousany% в помощь.
В смысле - кастуешь в ANY, затем разбираешь что получил.
Ну или просто DBMS_SQL - там можно describeПолагаю, DBMS_SQL не подойдет, поскольку с его помощью можно только сделать DESCRIBE_ COLUMNS , в то время как мне нужно узнать тип значения в контексте PL/SQL .
А что касается ANY% - можно примерчик, пожалуйста?
...
Рейтинг: 0 / 0
30.06.2017, 02:47
    #39480071
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать тип данных переменной внутри блока PL/SQL?
--Eugene--значения в контексте PL/SQL
А можно вот с этого места поподробнее?
Откуда в контексте pl/sql значение неизвестного типа?
...
Рейтинг: 0 / 0
30.06.2017, 03:39
    #39480077
--Eugene--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать тип данных переменной внутри блока PL/SQL?
andrey_anonymousОткуда в контексте pl/sql значение неизвестного типа?Например вот отсюда:
Код: plsql
1.
2.
3.
begin
	dbms_output.put_line(:x);
end;

Какой тип у переменной :x?
Вообще говоря, не суть важно откуда. Так или иначе он есть.
...
Рейтинг: 0 / 0
30.06.2017, 05:14
    #39480081
Be or not to be...
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать тип данных переменной внутри блока PL/SQL?
--Eugene--,

Разве переменная не была объявлена ранее с явно указанным типом данных? Или вы хотите в варчар положить дату, а потом понять, что это именно дата, а не строка?
...
Рейтинг: 0 / 0
30.06.2017, 10:30
    #39480199
типа бинд
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать тип данных переменной внутри блока PL/SQL?
--Eugene--andrey_anonymousОткуда в контексте pl/sql значение неизвестного типа?Например вот отсюда:
Код: plsql
1.
2.
3.
begin
	dbms_output.put_line(:x);
end;

Какой тип у переменной :x?
Вообще говоря, не суть важно откуда. Так или иначе он есть.
select regexp_substr(dump(:x), 'Typ=(\d+)', 1, 1, '', 1) typecode from dual
...
Рейтинг: 0 / 0
30.06.2017, 13:40
    #39480364
--Eugene--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать тип данных переменной внутри блока PL/SQL?
Be or not to be...Разве переменная не была объявлена ранее с явно указанным типом данных?Где вы видите явное объявление переменной в анонимном блоке
Код: plsql
1.
begin dbms_output.put_line(:x); end;

?

типа биндselect regexp_substr(dump(:x), 'Typ=(\d+)', 1, 1, '', 1) typecode from dual
Не вполне понятен Ваш сарказм
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
SQL> var x varchar2(10);
SQL> exec :x := 'qwe';

PL/SQL procedure successfully completed.

SQL> select regexp_substr(dump(:x), 'Typ=(\d+)', 1, 1, '', 1) typecode from dual;
TYPECODE
--------
1

SQL> var x number;
SQL> exec :x := 123;

PL/SQL procedure successfully completed.

SQL> select regexp_substr(dump(:x), 'Typ=(\d+)', 1, 1, '', 1) typecode from dual;
TYPECODE
--------
2
...
Рейтинг: 0 / 0
30.06.2017, 13:47
    #39480370
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать тип данных переменной внутри блока PL/SQL?
--Eugene--Не вполне понятен Ваш сарказм
И где тут сарказм? Коллега предложил Вам вариант, который я сам имел ввиду, когда говорил про dbms_sql.
...
Рейтинг: 0 / 0
30.06.2017, 13:49
    #39480372
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать тип данных переменной внутри блока PL/SQL?
andrey_anonymous--Eugene--Не вполне понятен Ваш сарказм
И где тут сарказм? Коллега предложил Вам вариант, который я сам имел ввиду, когда говорил про dbms_sql.
Расписывать не стал, поскольку в голове бродит другая мысль - не возиться с typecodes, которые, вообще говоря, являются свойством реализации и теоретически могут смениться без предупреждения, а (именно для PL/SQL) попробовать перегрузку функции.
...
Рейтинг: 0 / 0
30.06.2017, 13:58
    #39480385
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать тип данных переменной внутри блока PL/SQL?
andrey_anonymous,

В свое время уже повозились.
запросом получить по коду sql типа его ~название
...
Рейтинг: 0 / 0
30.06.2017, 14:42
    #39480445
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать тип данных переменной внутри блока PL/SQL?
dbms_photoshopВ свое время уже повозились.

Баян, но меня всегда забавлял дамп даты:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
create table ane_testd(d ) as select trunc(sysdate) from dual;

select substr(dump(d,16),1,33) persistent, substr(dump(trunc(d),16),1,33) transient from ane_testd;

drop table ane_testd purge;

-------------

table ANE_TESTD created.

PERSISTENT                        TRANSIENT                       
--------------------------------- ---------------------------------
Typ=12 Len=7: 78,75,6,1e,1,1,1    Typ=13 Len=8: e1,7,6,1e,0,0,0,0   

table ANE_TESTD dropped.
...
Рейтинг: 0 / 0
30.06.2017, 19:33
    #39480646
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать тип данных переменной внутри блока PL/SQL?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
var x number;
var d binary_double;
var v varchar2;
var rc refcursor;

begin
 open :rc for 'select TSTTYP.DTCTTYP(:x),TSTTYP.DTCTTYP(:y),TSTTYP.DTCTTYP(:v) from dual'
 using :x, :d, :v
 ;
end;
/

anonymous block completed
number
double
varchar2


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
CREATE OR REPLACE 
PACKAGE TSTTYP AS 
  function dtcttyp(x number) return number;
  function dtcttyp(x binary_double) return binary_double;
  function dtcttyp(x date) return date;
  function dtcttyp(x timestamp) return timestamp;
  function dtcttyp(x varchar2) return varchar2;
  function dtcttyp(x clob) return clob;
END TSTTYP;
/

CREATE OR REPLACE PACKAGE body TSTTYP AS 
  function dtcttyp(x number) return number is
  begin
    dbms_output.put_line('number');
    return x;
  end;

  function dtcttyp(x binary_double) return binary_double is
  begin
    dbms_output.put_line('double');
    return x;
  end;

  function dtcttyp(x date) return date is
  begin
    dbms_output.put_line('date');
    return x;
  end;

  function dtcttyp(x timestamp) return timestamp is
  begin
    dbms_output.put_line('timestamp');
    return x;
  end;
  
  function dtcttyp(x varchar2) return varchar2 is
  begin
    dbms_output.put_line('varchar2');
    return x;
  end;
  
  function dtcttyp(x clob) return clob is
  begin
    dbms_output.put_line('clob');
    return x;
  end;
END TSTTYP;
/

...
Рейтинг: 0 / 0
30.06.2017, 22:09
    #39480731
--Eugene--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать тип данных переменной внутри блока PL/SQL?
andrey_anonymous,
ха, перегруженная функция - об этом я как-то не подумал :)
только вот придется нафигачить функций под каждый тип.
наивно полагал, что индусы уже это сделали за меня))
...
Рейтинг: 0 / 0
04.07.2017, 12:19
    #39482320
EDUARD_2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать тип данных переменной внутри блока PL/SQL?
--Eugene--,

чего ты хочешь добиться то?
...
Рейтинг: 0 / 0
04.07.2017, 12:22
    #39482325
EDUARD_2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать тип данных переменной внутри блока PL/SQL?
--Eugene--только вот придется нафигачить функций под каждый тип.

можно создать Тип как контейнер данных.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
create or replace type TItem force under th$__sys$baseType
(
  -- Created : 03.12.2014 17:05:38
  -- Purpose : Контейнер данных

  fStringValue nclob,
  fObjectValue th$object,
  fListValue tarray,
  fAnyDataValue anydata,
  fType varchar2(16),
  fIsNull char,
  
  constructor function TItem return self as result,
  constructor function TItem(V titem) return self as result,
  constructor function TItem(V nvarchar2) return self as result,
  constructor function TItem(V nclob) return self as result,
  constructor function TItem(V th$object) return self as result,
  constructor function TItem(V tarray) return self as result,
  constructor function TItem(V boolean) return self as result,
  constructor function TItem(V anydata) return self as result,

  final member function getItemType return string,
  final member function isStringItem return boolean,
  final member function isLargeStringItem return boolean,
  final member function isObjectItem return boolean,
  final member function isListItem return boolean,
  final member function isAnyDataItem return boolean,
  final member function isBooleanItem return boolean,
  final member function isNull return boolean,

  member function getStringItem return nvarchar2,
  member function getLargeStringItem return nclob,
  member function getObjectItem return th$object,
  member function getListItem return tarray,
  member function getAnyDataItem return anydata,
  member function getBooleanItem return boolean,
  
  -- toString
  member function toString return nvarchar2,
  -- to xml
  member function serialize return xmltype,
  -- from xml
  static function unserialize(xml xmltype) return titem
) not final

...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как узнать тип данных переменной внутри блока PL/SQL? / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]