|
Как понимать текст SYS.STANDARD?
|
|||
---|---|---|---|
#18+
А что неожиданного? Что в f содержится Inf [inity] ? Или то, что не было ошибки? Ну так работает функция TO_BINARY_FLOAT которая неявно вызывается в данном случае Об этом можно прочитать в документации, если хотеть разобраться, конечно ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2020, 03:42 |
|
Как понимать текст SYS.STANDARD?
|
|||
---|---|---|---|
#18+
Вячеслав Любомудров А что неожиданного? Что в f содержится Inf [inity] ? Или то, что не было ошибки? Ну так работает функция TO_BINARY_FLOAT которая неявно вызывается в данном случае Об этом можно прочитать в документации, если хотеть разобраться, конечно Неожиданно, если полагаться на STANDARD пакет, героя этой темы. Если читать stdspec.sql, с которым вы хорошо знакомы, то там недалеко от начала файла можно заметить: Код: plsql 1. 2. 3. 4.
Синтакс совершенно однозначный. оба - подтипы NULL. Попробуем сделать точно так же: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
и... тишина. Это означает что хотя в файле stdspec.sql присутствуют определения типов, Оракл забивает на некоторые из них, и пользуется встроенными. Это BINARY_INTEGER, PLS_INTEGER, BINARY_FLOAT и BINARY_DOUBLE. То же самое касается нескольких функций. Я пока наугад пальцем потыкал, нашел пару. Любопытно, конечно, почему эти бесполезные и неверные определения типов там присутствуют. Также интересно, какие еще существуют подвохи. Ведь иногда приходится заглянуть в STANDARD, чтобы посмотреть, к примеру, все варианты полиморфной функции. А так не знаешь даже правда там, или нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2020, 04:11 |
|
Как понимать текст SYS.STANDARD?
|
|||
---|---|---|---|
#18+
То, что STANDARD пакет особенный никто и не спорил и в нем допускаются инструкции, запрещенные в других пакетах Я ругался про неправильный синтаксис и невозможность компиляции. Просто мне самому приходилось его править и перекомпилять (был такой workaround) Ну а то что для неспецифицированного типа подставляется SQL-тип, это еще нормально. Хуже что он использует SQL-тип для явно указанного sys.standard.binary_float Ну так работает компилятор, с этим надо научиться жить ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2020, 06:10 |
|
Как понимать текст SYS.STANDARD?
|
|||
---|---|---|---|
#18+
env Вячеслав Любомудров, А до наката standard анонимные блоки с базовыми типами работать будут? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2020, 06:34 |
|
Как понимать текст SYS.STANDARD?
|
|||
---|---|---|---|
#18+
Подытожу по поводу 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2020, 03:59 |
|
Как понимать текст SYS.STANDARD?
|
|||
---|---|---|---|
#18+
Подытожу для адекватных пользователей, без лживых и полулживых домыслов, во избежание дезинформации: Изучать надо официальную документацию и работать согласно документации. Сам код 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 функций. Есть одно отличие ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2020, 14:21 |
|
|
start [/forum/topic.php?fid=52&gotonew=1&tid=1880841]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
41ms |
get topic data: |
11ms |
get first new msg: |
8ms |
get forum data: |
3ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
others: | 11ms |
total: | 156ms |
0 / 0 |