|
Как понимать текст SYS.STANDARD?
|
|||
---|---|---|---|
#18+
tldr: этот пакет SYS.STANDARD - он "живой" или "справочный"? Мое исследование говорит, что справочный и написан в псевдокоде. В нем есть ошибки и неверные посылы, поэтому в отличие от настоящих исходников он не может считаться истиной в последней инстанции. Все же, есть польза от его прочтения. Я почитал SYS.STANDARD на досуге, там есть немало любопытных приемчиков и комментариев. Заметил некоторые нестыковки, как с документацией так и с функционалом по факту, поэтому возник вопрос в [subj]. Нестыковка с документацией: В пакете STANDARD написано следующее: Код: plsql 1. 2. 3. 4. 5. 6. 7.
у меня в версии 11.2 PL/SQL тип PLS_/BINARY_INTEGER определен как ограниченный подтип NUMBER, что есть десятичное число переменной длины. Документация обещает что тип BINARY_INTEGER (также PLS_INTEGER) это 32-битные переменные, которые хранятся в естественном для компьютера двоичном формате и быстрее работают с арифметикой. Поскольку dump() в PL/SQL не доступен, я не смог проверить напрямик как BINARY_INTEGER хранится в памяти. Однако по косвенным признакам (скорость исполнения бит операций над PLS_INTEGER в разы быстрее), документация права. Нестыковка с фактом: В пакете определены две полиморфные функции, с разными типами параметров. Код: plsql 1. 2.
Из практики я знаю, что попытка вызова полиморфных функций с null параметром даст ошибку компиляции PLS-00307. Однако, я могу вызывать bitand(null,null) без ошибок, т.е. эта функция определена не так, как записано в пакете STANDARD. Вот еще более очевидный пример несоответствия факту: Код: plsql 1.
- синтаксическая ошибка, одинарные кавычки. - запрещенная операция, для подтипов NUMBER запрещен диапазон (PLS-00572: improper constraint form used) - n binary_integer := -2147483648 ; -- присваивание вне диапазона значений работает, ошибки нет. Моя догадка, что этот пакет компилируется совсем другим компилятором, который понимает определение операторов, прагму 'interface' и кавычки в запрещенных определениях подтипов. Судя по присутствию восклицаний и имен разработчиков в комментариях, этот файл не сильно чистили для публики. Просто его нельзя воспринимать как PL/SQL код и делать выводы как если бы он был таковым. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2020, 18:08 |
|
Как понимать текст SYS.STANDARD?
|
|||
---|---|---|---|
#18+
НеофитSQL Из практики я знаю , что попытка вызова полиморфных функций с null параметром даст ошибку компиляции PLS-00307. у Вас мало практики дает ошибку когда не может определить тип, пробуйте напр cast(null as number) ps SYS.STANDARD не изучал ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2020, 08:47 |
|
Как понимать текст SYS.STANDARD?
|
|||
---|---|---|---|
#18+
Все там нормально И обрабатывается это обычным путем -- этот пакет загружается и компилируется через обычный sqlplus при установке/апгрейде словаря БД Но чувак пытается переложить свой (не знаю, насколько большой) опыт работы с другими языками на [PL/]SQL ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2020, 09:02 |
|
Как понимать текст SYS.STANDARD?
|
|||
---|---|---|---|
#18+
В этом деле главное не начать вносить "улучшения". Типа увеличить диапазон значений BINARY_INTEGER в определениях SYS.STANDARD, т.к. "моему приложению этого мало". ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2020, 09:44 |
|
Как понимать текст SYS.STANDARD?
|
|||
---|---|---|---|
#18+
Stax НеофитSQL Из практики я знаю , что попытка вызова полиморфных функций с null параметром даст ошибку компиляции PLS-00307. у Вас мало практики дает ошибку когда не может определить тип, пробуйте напр cast(null as number) Не думал что кого-то заденет слово "практика". Я имел в виду из прикладного эксперимента, а не из теоретических рассуждений основанных на богатом жизненном опыте SQL. Ибо с позиции SQL-стажа я рассуждать пока не могу, а вот эксперимент - легко. В этом конкретном примере, я заметил что декларации одной из функций в STANDARD не объясняют поведение моей системы. Код: plsql 1. 2. 3. 4. 5.
Из практики (о ней чуть ниже) я знаю, что в этом случае вызов bitand(null,null) должен быть пойман на стадии компиляции, однако это не происходит. Код: plsql 1. 2. 3. 4. 5. 6.
Эксперимент: я создал пакет "nonstd" с двумя функциями с аналогичными сигнатурами. Имя поменял на MySum. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Выводы в начале темы. Если кто-то хочет проверить на своей платформе, код ниже. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2020, 16:14 |
|
Как понимать текст SYS.STANDARD?
|
|||
---|---|---|---|
#18+
НеофитSQL Если кто-то хочет проверить Что проверять? Что SQL-функция bitand это не синоним для sys.standard.bitand? Код: plsql 1. 2. 3.
упд. Вот уж точно, многия знания - многия печали. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2020, 16:18 |
|
Как понимать текст SYS.STANDARD?
|
|||
---|---|---|---|
#18+
Вячеслав Любомудров Все там нормально И обрабатывается это обычным путем -- этот пакет загружается и компилируется через обычный sqlplus при установке/апгрейде словаря БД Но чувак пытается переложить свой (не знаю, насколько большой) опыт работы с другими языками на [PL/]SQL Это утверждение не сочетается с наличием синтаксических ошибок в SYS.STANDARD. К примеру, Код: plsql 1.
не компилируется по двум причинам, указанным в первом сообщении. Если бы компилировалось, то присваивание Код: plsql 1.
выдавало бы ошибку. Каждый может посмотреть в свой SYS.STANDARD и убедиться что это так, по крайней мере для 11.2. Вы можете привести какое-либо проверяемое обоснование вашего утверждения? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2020, 16:26 |
|
Как понимать текст SYS.STANDARD?
|
|||
---|---|---|---|
#18+
env НеофитSQL Если кто-то хочет проверить Что проверять? Что SQL-функция bitand это не синоним для sys.standard.bitand? Код: plsql 1. 2. 3.
упд. Вот уж точно, многия знания - многия печали. Признаю ошибку. Мой эксперимент был проведен неверно, т.к. я не знал о разнице между SQL bitand() и PL/SQL bitand(). Теперь знаю. Этот конкретный довод считать недействительным. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2020, 16:31 |
|
Как понимать текст SYS.STANDARD?
|
|||
---|---|---|---|
#18+
НеофитSQL, Подход "я нашёл в каком-то модуле описание каких-то типов и функций и экстраполирую это знание на дефолтное пространство имён" неверен в принципе, независимо от того pl/sql это или c. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2020, 16:49 |
|
Как понимать текст SYS.STANDARD?
|
|||
---|---|---|---|
#18+
НеофитSQL Вы можете привести какое-либо проверяемое обоснование вашего утверждения? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2020, 16:54 |
|
Как понимать текст SYS.STANDARD?
|
|||
---|---|---|---|
#18+
НеофитSQL К примеру, Код: plsql 1.
И вырывать из контекста - тоже не очень хорошая идея. Для начала - а что здесь такое INTEGER? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2020, 16:59 |
|
Как понимать текст SYS.STANDARD?
|
|||
---|---|---|---|
#18+
STANDARD особый пакет и в нем делается то что "положено Юпитеру". Недаром: Код: 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.
А простым смертным Constrained Subtypes . SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2020, 17:07 |
|
Как понимать текст SYS.STANDARD?
|
|||
---|---|---|---|
#18+
env НеофитSQL К примеру, Код: plsql 1.
И вырывать из контекста - тоже не очень хорошая идея. Для начала - а что здесь такое INTEGER? В данном конкретном случае, по сути - обманка, противоречащая, если не формальному описанию того, что такое subtype (которое вполне себе мутн о , за сознательно выброшенными соглашениями языка-родителя), то, по крайней мере, "естественному" чтению. "Естественно" было бы ожидать, что subtype не может порождать собственного независимого семейства подтипов. Здесь, оказывается, может. И это невозможно прочитать глазами. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2020, 17:28 |
|
Как понимать текст SYS.STANDARD?
|
|||
---|---|---|---|
#18+
env НеофитSQL К примеру, Код: plsql 1.
И вырывать из контекста - тоже не очень хорошая идея. Для начала - а что здесь такое INTEGER? Когда читаешь дискуссию с середины, она кажется вырванной из контекста. Посмотрите в первом сообщении темы, там в первой дюжине строк все указано, в том числе subtype INTEGER is NUMBER(38,0); ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2020, 17:42 |
|
Как понимать текст SYS.STANDARD?
|
|||
---|---|---|---|
#18+
SY, почему б ораклю не сделать subtype BINARY_INTEGER is INTEGER range '-214748364 8 '..2147483647; ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2020, 17:47 |
|
Как понимать текст SYS.STANDARD?
|
|||
---|---|---|---|
#18+
НеофитSQL subtype INTEGER is NUMBER(38,0); Отлично! А что такое NUMBER? упд. Это я к тому, чтобы вы сами прочитали своё первое сообщение в этой теме и осознали, что типы и подтипы, определённые в пространстве имён пакета sys.standard не обязаны совпадать с типами дефолтного пространства имён. Как только осознаете, что опять старательно сравниваете зелёное с круглым по степени мохнатости - пишите. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2020, 18:08 |
|
Как понимать текст SYS.STANDARD?
|
|||
---|---|---|---|
#18+
booby ... "Естественно" было бы ожидать, что subtype не может порождать собственного независимого семейства подтипов. ... Здесь подразумевалось - независимого в смысле PLS-00307 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2020, 18:09 |
|
Как понимать текст SYS.STANDARD?
|
|||
---|---|---|---|
#18+
Stax SY, почему б ораклю не сделать subtype BINARY_INTEGER is INTEGER range '-214748364 8 '..2147483647; ..... stax -214748364 8 это -0. Про +0 и -0 слышал? SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2020, 18:25 |
|
Как понимать текст SYS.STANDARD?
|
|||
---|---|---|---|
#18+
SY, у меня руки чесались так написать, но я по ним нашлёпал... Судя по всему, когда-то так и было. Сейчас это уже не так. Вероятно, по крайней мере, с 10-ки, может с 9-ки - не проверишь уже. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2020, 18:28 |
|
Как понимать текст SYS.STANDARD?
|
|||
---|---|---|---|
#18+
но в каком-нибудь древнем клиентском софте на это можно и нарваться... ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2020, 18:34 |
|
Как понимать текст SYS.STANDARD?
|
|||
---|---|---|---|
#18+
SY STANDARD особый пакет и в нем делается то что "положено Юпитеру". SY. Это также и мое заключение. Например, тип NUMBER_BASE или декларация операторов - попытки их использовать в своем модуле дают сообщение что это только для "STANDARD" и ни для кого другого. Тут вряд ли есть два мнения - сам Оракл в ошибке говорит об особом статусе пакета STANDARD, упоминая его по имени: PLS-00504: type NUMBER_BASE may not be used outside of package STANDARD Далее, исходя из конфликта между текстом SYS.STANDARD (где, к примеру, PLS_INTEGER показан как субтип NUMBER) и реальностью (где PLS_INTEGER использует двоичный формат), и некоторых других наблюдений, я думаю что STANDARD может быть полезен для обучения - как создатели делают некоторые вещи, но на него нельзя полагаться как на истину в последней инстанции, как это бывает с open source, или например API header files. Другими словами - поскольку STANDARD/spec содержит некоторые лживые декларации, он не являются определяющим для поведения компилятора, и я подозреваю что компилятор моего сервера не смотрит туда вообще, а руководствуется встроенными правилами. Насчет тела SYS.STANDARD/body я пока не уверен. Похоже, что оно тоже нерабочее, в отличие от других wrapped системных пакетов, и было включено только для образования. Там тоже есть что почитать. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2020, 18:37 |
|
Как понимать текст SYS.STANDARD?
|
|||
---|---|---|---|
#18+
НеофитSQL, скажи спасибо, что тебе не сильно врут. В "других языках" ни строчке официального библиотечного кода верить нельзя даже приблизительно. Они там просто ничему не соответствуют. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2020, 18:40 |
|
Как понимать текст SYS.STANDARD?
|
|||
---|---|---|---|
#18+
SY Про +0 и -0 слышал? Никогда не слышал про +-0 применительно к дополнительной кодировке. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2020, 18:42 |
|
Как понимать текст SYS.STANDARD?
|
|||
---|---|---|---|
#18+
andrey_anonymous SY Про +0 и -0 слышал? Никогда не слышал про +-0 применительно к дополнительной кодировке. binary_integer не всегда был машинным .... Библиотечная реализация могда иметь свой взгляд, надо формсы хотя бы 6-е поднимать, чтобы диапазон значений проверить. Хотя в 6-х оно уже может быть и ест 80000000 правильно. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2020, 18:46 |
|
Как понимать текст SYS.STANDARD?
|
|||
---|---|---|---|
#18+
SY Stax SY, почему б ораклю не сделать subtype BINARY_INTEGER is INTEGER range '-214748364 8 '..2147483647; ..... stax -214748364 8 это -0. Про +0 и -0 слышал? SY. Я до недавнего времени слышал, но не встречался, т.к. с плавающей точкой не работал. Поскольку (согласно Ораклу и вопреки тексту STANDARD/spec) BINARY_INTEGER это двоичная 32-битная переменная, отрицательный ноль там быть не должен. Проверим, ибо эксперимент важнее рассуждений: Код: plsql 1. 2. 3. 4. 5. 6.
Печатает -1073741824 Вывод - как все другие 32-битные двоичные числа со знаком, BINARY_INTEGER использует интервал (-2147483648,2147483647). Декларация в STANDARD была сделана симметричной или для красоты, или в попытке предотвратить exception при смене знака. Но это не сработало: Код: plsql 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2020, 18:49 |
|
|
start [/forum/topic.php?fid=52&startmsg=40003599&tid=1880841]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
32ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
74ms |
get tp. blocked users: |
2ms |
others: | 292ms |
total: | 442ms |
0 / 0 |