powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как узнать тип данных переменной внутри блока PL/SQL?
16 сообщений из 16, страница 1 из 1
Как узнать тип данных переменной внутри блока PL/SQL?
    #39480064
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот с помощью 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
Как узнать тип данных переменной внутри блока PL/SQL?
    #39480066
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
any% в помощь.
В смысле - кастуешь в ANY, затем разбираешь что получил.
Ну или просто DBMS_SQL - там можно describe
...
Рейтинг: 0 / 0
Как узнать тип данных переменной внутри блока PL/SQL?
    #39480069
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousany% в помощь.
В смысле - кастуешь в ANY, затем разбираешь что получил.
Ну или просто DBMS_SQL - там можно describeПолагаю, DBMS_SQL не подойдет, поскольку с его помощью можно только сделать DESCRIBE_ COLUMNS , в то время как мне нужно узнать тип значения в контексте PL/SQL .
А что касается ANY% - можно примерчик, пожалуйста?
...
Рейтинг: 0 / 0
Как узнать тип данных переменной внутри блока PL/SQL?
    #39480071
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene--значения в контексте PL/SQL
А можно вот с этого места поподробнее?
Откуда в контексте pl/sql значение неизвестного типа?
...
Рейтинг: 0 / 0
Как узнать тип данных переменной внутри блока PL/SQL?
    #39480077
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousОткуда в контексте pl/sql значение неизвестного типа?Например вот отсюда:
Код: plsql
1.
2.
3.
begin
	dbms_output.put_line(:x);
end;

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

Разве переменная не была объявлена ранее с явно указанным типом данных? Или вы хотите в варчар положить дату, а потом понять, что это именно дата, а не строка?
...
Рейтинг: 0 / 0
Как узнать тип данных переменной внутри блока PL/SQL?
    #39480199
типа бинд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
--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
Как узнать тип данных переменной внутри блока PL/SQL?
    #39480364
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как узнать тип данных переменной внутри блока PL/SQL?
    #39480370
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene--Не вполне понятен Ваш сарказм
И где тут сарказм? Коллега предложил Вам вариант, который я сам имел ввиду, когда говорил про dbms_sql.
...
Рейтинг: 0 / 0
Как узнать тип данных переменной внутри блока PL/SQL?
    #39480372
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous--Eugene--Не вполне понятен Ваш сарказм
И где тут сарказм? Коллега предложил Вам вариант, который я сам имел ввиду, когда говорил про dbms_sql.
Расписывать не стал, поскольку в голове бродит другая мысль - не возиться с typecodes, которые, вообще говоря, являются свойством реализации и теоретически могут смениться без предупреждения, а (именно для PL/SQL) попробовать перегрузку функции.
...
Рейтинг: 0 / 0
Как узнать тип данных переменной внутри блока PL/SQL?
    #39480385
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous,

В свое время уже повозились.
запросом получить по коду sql типа его ~название
...
Рейтинг: 0 / 0
Как узнать тип данных переменной внутри блока PL/SQL?
    #39480445
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как узнать тип данных переменной внутри блока PL/SQL?
    #39480646
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
Как узнать тип данных переменной внутри блока PL/SQL?
    #39480731
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous,
ха, перегруженная функция - об этом я как-то не подумал :)
только вот придется нафигачить функций под каждый тип.
наивно полагал, что индусы уже это сделали за меня))
...
Рейтинг: 0 / 0
Как узнать тип данных переменной внутри блока PL/SQL?
    #39482320
EDUARD_2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene--,

чего ты хочешь добиться то?
...
Рейтинг: 0 / 0
Как узнать тип данных переменной внутри блока PL/SQL?
    #39482325
EDUARD_2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--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
16 сообщений из 16, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как узнать тип данных переменной внутри блока PL/SQL?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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