powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как понимать текст SYS.STANDARD?
6 сообщений из 56, страница 3 из 3
Как понимать текст SYS.STANDARD?
    #40004405
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что неожиданного? Что в f содержится Inf [inity] ?
Или то, что не было ошибки? Ну так работает функция TO_BINARY_FLOAT которая неявно вызывается в данном случае
Об этом можно прочитать в документации, если хотеть разобраться, конечно
...
Рейтинг: 0 / 0
Как понимать текст SYS.STANDARD?
    #40004408
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вячеслав Любомудров
А что неожиданного? Что в f содержится Inf [inity] ?
Или то, что не было ошибки? Ну так работает функция TO_BINARY_FLOAT которая неявно вызывается в данном случае
Об этом можно прочитать в документации, если хотеть разобраться, конечно


Неожиданно, если полагаться на STANDARD пакет, героя этой темы.
Если читать stdspec.sql, с которым вы хорошо знакомы, то там недалеко от начала файла можно заметить:

Код: plsql
1.
2.
3.
4.
...
  subtype BINARY_FLOAT is NUMBER;
  subtype BINARY_DOUBLE is NUMBER;
...



Синтакс совершенно однозначный. оба - подтипы NULL.
Попробуем сделать точно так же:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
declare 
  subtype MYBINARY_FLOAT is NUMBER; -- в точности как у оракла
  subtype MYBINARY_DOUBLE is NUMBER;

  f mybinary_float;
  d mybinary_double;
begin
  d := 4e84; -- оценка числа фотонов во Вселенной
  f := d;

  if f != d then dbms_output.put_line( 'f != d' ); end if;
end;  



и... тишина.

Это означает что хотя в файле stdspec.sql присутствуют определения типов, Оракл забивает на некоторые из них, и пользуется встроенными. Это BINARY_INTEGER, PLS_INTEGER, BINARY_FLOAT и BINARY_DOUBLE.

То же самое касается нескольких функций. Я пока наугад пальцем потыкал, нашел пару.

Любопытно, конечно, почему эти бесполезные и неверные определения типов там присутствуют.
Также интересно, какие еще существуют подвохи. Ведь иногда приходится заглянуть в STANDARD, чтобы посмотреть, к примеру, все варианты полиморфной функции. А так не знаешь даже правда там, или нет.
...
Рейтинг: 0 / 0
Как понимать текст SYS.STANDARD?
    #40004413
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То, что STANDARD пакет особенный никто и не спорил и в нем допускаются инструкции, запрещенные в других пакетах
Я ругался про неправильный синтаксис и невозможность компиляции. Просто мне самому приходилось его править и перекомпилять (был такой workaround)

Ну а то что для неспецифицированного типа подставляется SQL-тип, это еще нормально. Хуже что он использует SQL-тип для явно указанного sys.standard.binary_float
Ну так работает компилятор, с этим надо научиться жить
...
Рейтинг: 0 / 0
Как понимать текст SYS.STANDARD?
    #40004416
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
env
Вячеслав Любомудров,

А до наката standard анонимные блоки с базовыми типами работать будут?
До наката standard и dbms_standard никакой PL/SQL в принципе не работает
...
Рейтинг: 0 / 0
Как понимать текст SYS.STANDARD?
    #40004720
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подытожу по поводу STANDARD пакета, какие части нужно читать с недоверием.

1) Типы BINARY_INTEGER и PLS_INTEGER объявлены подтипами десятичного NUMBER, но являются двоичными 32-битными.
2) Типы BINARY_FLOAT и BINARY_DOUBLE также объявлены подтипами NUMBER, но являются 32- и 64-битными IEEE числами.
3) Тип RAW объявлен как эквивалент VARCHAR2, но таковым не является. RAW совпадает с SQL RAW, как в таблицах
В этих трех случаях декларации типов в STANDARD игнорируются, и используются типы SQL (табличные).

4) Устаревшие типы и функции присутствуют в пакете STANRDARD, но запрещены где-то в другом месте, поэтому недоступны.
Среди них: TIME, to_time(), current_time, localtime
Также: dump(), vsize() - эти остались только в SQL

Пакет STANDARD определяет много PL/SQL функций (в том числе полиморфных) имена которых совпадают с встроенными функциями SQL. В большинстве случаев, поведение PL/SQL функций совпадает с поведением встроенных SQL функций.

Есть одно отличие: функция SQL/rawtohex() работает как dump(): она способна распечатать байты объекта почти любого типа,
a функция PL/rawtohex() определена только для типа RAW, ей невозможно узнать формат данных DATE, к примеру.

Учитывая, что использование dump() и vsize() в PL/SQL запрещено,
мне неизвестно как из PL/SQL можно узнать размер или внутреннее представление переменной.

Если кто-то это научился делать средствами языка, отзовитесь.
Код: plsql
1.
2.
3.
b boolean := true;

dbms_output.put_line( dump(b) );  -- вот это в PL/SQL не получается сделать не выходя в C++
...
Рейтинг: 0 / 0
Как понимать текст SYS.STANDARD?
    #40004892
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Подытожу для адекватных пользователей, без лживых и полулживых домыслов, во избежание дезинформации:
Изучать надо официальную документацию и работать согласно документации.
Сам код SYS.STANDARD официальной документацией не является. Отсылки к используемому в нем синтаксису и типам будут игнорироваться тех.поддержкой (may not be used outside of package STANDARD). Возможности и синтаксис, используемый в нем не для пользователей.
Документированные пакеты нужно смотреть здесь .

tldr;
Изучение sys.standard без должного знания документации и понимания, как работает PL/SQL engine, бессмысленно и ни к чему хорошему не приведет. Декларация встроенных нативных типов и операторов в нем существует для синтаксического и семантического анализа с учетом обратной совместимости (типа binary_integer -> pls_integer). В его текущей реализации принципиально еще нет возможности для указания ни внутреннего формата хранения, ни битности. Естественно, при компиляции используются встроенные форматы. И никто не гарантирует какие реально будут использованы типы при нативной компиляции или не будет ли выкинут бесполезный код при оптимизации.

НеофитSQL
Ведь иногда приходится заглянуть в STANDARD, чтобы посмотреть, к примеру, все варианты полиморфной функции.
не надо. Надо смотреть описание функции в документации.
НеофитSQL
В большинстве случаев, поведение PL/SQL функций совпадает с поведением встроенных SQL функций.

Есть одно отличие
надо читать документацию, а не нести отсебятину: 2.7.8 SQL Functions in PL/SQL Expressions
...
Рейтинг: 0 / 0
6 сообщений из 56, страница 3 из 3
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как понимать текст SYS.STANDARD?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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