|
Как понимать текст 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 |
|
Как понимать текст SYS.STANDARD?
|
|||
---|---|---|---|
#18+
booby НеофитSQL, скажи спасибо, что тебе не сильно врут. В "других языках" ни строчке официального библиотечного кода верить нельзя даже приблизительно. Они там просто ничему не соответствуют. Я не пытаюсь обидеть твоего любимого ребенка, поэтому "а у вас негров линчуют" тут не очень подходит. Когда я выпускал header files для MSDN, мы туда только правду размещали. Т.е. за Windows SDK/DDK я ручаюсь, по крайней мере до семерки. С чем запускался мейк для сборки Винды - то и шло всем программистам, без правок. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2020, 18:55 |
|
Как понимать текст SYS.STANDARD?
|
|||
---|---|---|---|
#18+
booby binary_integer не всегда был машинным .... Библиотечная реализация могда иметь свой взгляд, надо формсы хотя бы 6-е поднимать, чтобы диапазон значений проверить. Хотя в 6-х оно уже может быть и ест 80000000 правильно. Люблю этот форум, узнаю много нового. Booby, вы уверены что "binary_integer не всегда был машинным", или просто так сказали? Например, в версии 7.х, он уже был машинным. Источник: документация версии 7.3 https://docs.oracle.com/pdf/A32536_1.pdf?xd_co_f=30bdac43-db00-4c73-b23f-ab7dceabc8ab ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2020, 19:02 |
|
Как понимать текст SYS.STANDARD?
|
|||
---|---|---|---|
#18+
env .. типы и подтипы, определённые в пространстве имён пакета sys.standard не обязаны совпадать с типами дефолтного пространства имён. Я не сразу смог прочитать предложение выше, поэтому отвечаю с задержкой. Вы не правы. В случае пакета SYS.STANDARD, о котором идет речь, типы и подтипы пакета обязаны совпадать с типами дефолтного пространства, т.е. не являются локальными для пакета и не требуют указания sys.standard. перед ними. Это особенность этого пакета. Источник: документация Оракл. https://docs.oracle.com/cd/A57673_01/DOC/server/doc/PLS23/ch8.htm ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2020, 19:09 |
|
Как понимать текст SYS.STANDARD?
|
|||
---|---|---|---|
#18+
НеофитSQL Другими словами - поскольку STANDARD/spec содержит некоторые лживые декларации Мастер и МаргаритаЕго послали, чтобы над верою надругался и подвел народ под римские мечи! ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2020, 23:43 |
|
Как понимать текст SYS.STANDARD?
|
|||
---|---|---|---|
#18+
НеофитSQL Вячеслав Любомудров Все там нормально И обрабатывается это обычным путем -- этот пакет загружается и компилируется через обычный sqlplus при установке/апгрейде словаря БД Но чувак пытается переложить свой (не знаю, насколько большой) опыт работы с другими языками на [PL/]SQL Это утверждение не сочетается с наличием синтаксических ошибок в SYS.STANDARD. К примеру, Код: plsql 1.
не компилируется по двум причинам, указанным в первом сообщении. Если бы компилировалось, то присваивание Код: plsql 1.
выдавало бы ошибку. Каждый может посмотреть в свой SYS.STANDARD и убедиться что это так, по крайней мере для 11.2. Вы можете привести какое-либо проверяемое обоснование вашего утверждения? А ты уже достал своей пургой, несущейся с умным видом Код: 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. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2020, 04:27 |
|
Как понимать текст SYS.STANDARD?
|
|||
---|---|---|---|
#18+
Вячеслав Любомудров, Я не все смог понять в вашем примере, но вижу что вы пользуетесь версией 18 чтобы опровергнуть мои выводы о 11.2. Когда у меня будет доступ к 18/19, я сделаю сравнительный анализ. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2020, 04:42 |
|
Как понимать текст SYS.STANDARD?
|
|||
---|---|---|---|
#18+
НеофитSQL Я не все смог понять в вашем примере, но вижу что вы пользуетесь версией 18 чтобы опровергнуть мои выводы о 11.2. Неофит, чтобы Ваше умное лицо выглядело реально умно - следует все-таки разобраться в вопросе. Вячеслав создал новую, абсолютно пустую БД. Показал, что в ней нет объекта с именем STANDARD. И накатил пакет штатным скриптом. Так, как это делается всегда при ручном создании БД от самых первых версий, в которых появился pl/sql. Чем убедительно показал несостоятельность Ваших измышлизмов относительно сути пакета и невозможности его наката на БД из sql*plus. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2020, 10:41 |
|
Как понимать текст SYS.STANDARD?
|
|||
---|---|---|---|
#18+
Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
НеофитSQL, НеофитSQL подтипы пакета обязаны совпадать Но есть нюансы.. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2020, 11:12 |
|
Как понимать текст SYS.STANDARD?
|
|||
---|---|---|---|
#18+
SY Stax SY, почему б ораклю не сделать subtype BINARY_INTEGER is INTEGER range '-214748364 8 '..2147483647; ..... stax -214748364 8 это -0. Про +0 и -0 слышал? SY. Про +0 и -0 слышал, но никогдо не использовал еще слышал о +~ / -~ даже как-то нарвался но в 11-версии -2147483648 вполне себе число как и напр -2147483640 для меня ето совсем не важно, но имхо более чесно было б прописать subtype BINARY_INTEGER is INTEGER range '-214748364 8 '..2147483647; ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2020, 13:30 |
|
Как понимать текст SYS.STANDARD?
|
|||
---|---|---|---|
#18+
andrey_anonymous НеофитSQL Я не все смог понять в вашем примере, но вижу что вы пользуетесь версией 18 чтобы опровергнуть мои выводы о 11.2. Неофит, чтобы Ваше умное лицо выглядело реально умно - следует все-таки разобраться в вопросе. Вячеслав создал новую, абсолютно пустую БД. Показал, что в ней нет объекта с именем STANDARD. И накатил пакет штатным скриптом. Так, как это делается всегда при ручном создании БД от самых первых версий, в которых появился pl/sql. Чем убедительно показал несостоятельность Ваших измышлизмов относительно сути пакета и невозможности его наката на БД из sql*plus. Я вижу, произошла подмена понятий (соломенный аргумент). Но сначала отступление о другом - о ставшей редкой в русскоязычной среде возможности обсуждать разногласия сохраняя деловой тон и уважение к собеседнику. Про мои цели на этом форуме я писал раньше, они достигаются и я узнаю много нового, для меня неочевидного. В свою очередь, у меня иногда получается принести зерно истины, про которое еще вчера были не в курсе некоторые из самых опытных участников форума. Не знаю, известно ли в РФ золотое правило , штука хорошая. Вернусь в тему. Соломенный аргумент - это подмена тезиса разговора другим, очевидно неверным, и затем опровержение этого нового тезиса. Этот прием считается нечистоплотным когда применен намеренно в деловой ситуации, или симптомом недостаточного понимания как вести дискуссию. Мой тезис в самом начале этого сообщения: текст пакета SYS.STANDARD (1)справочный, и (2)написан в псевдокоде. Мне это интересно как разработчику использующему PL/SQL как один из многих языков для выполнения моих задач. Тема недостаточно широко раскрытая в интернете, но интересная мне, поэтому я захотел в нее углубиться. Я использовал несколько доводов, один из которых оказался ошибочным и был опровергнут (довод с полиморфным bitand). То, что этот текст написан на языке отличающемся от стандартного PL/SQL нет сомнений, вторую половину тезиса можно закрыть. Теперь, несколько дней спустя и прочитав примеры от местных старейшин (включая сообщение 2012 года от Вячеслава ибн Владивосток) а также несколько профильных блогов, вижу что текст этого пакета, который содержится в stdspec.sql/stdbody.sql (в ранних версиях Оракла в catalog.sql/catproc.sql) не только присутствует, но и активно используется для начального формирования среды PL/SQL. Кроме того, и это здесь важно - в stdspec.sql можно поменять значение константы, "накатить" его заново, и эта константа изменится в среде PL/SQL. Это говорит о том, что stdspec.sql - не просто свадебный генерал, а как минимум установочный скрипт с синтаксом напоминающим PL/SQL. Как максимум - полноценный PL/SQL с особыми расширениями зарезервированными для STANDARD. Mы обычно понимаем разницу между компилятором и скриптом инсталляции. Если я запустил .msi или .deb или .sh файл на своем компьютере, это еще не значит что "я скомпилировал пакет" - только что я его установил. Даже если я поменял в установочном скрипте константу или две. Чтобы определиться, является ли синтакс stdspec.sql расширением языка PL/SQL или установочным скриптом с похожим синтаксом но с ограниченными возможностями, нужно сначала определиться с критериями оценки, а потом эти критерии испытать. Научный метод, и все такое. Возможные критерии: - кто компилирует stdspec.sql (если штатный компилятор, голос в пользу расширения языка) - языковые возможности доступные в stdspec.sql (если там скудное подмножество PL/SQL, голос в пользу инсталлятора) - количество семантических конфликтов, когда одинаковый код имеет разное значение в stdspec/body, и других местах. и т.д. Также я хочу поблагодарить Вячеслава, который не ограничился "да все там компилится", а написал подробную иллюстрацию процесса специально для "neofit" :) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2020, 16:03 |
|
Как понимать текст SYS.STANDARD?
|
|||
---|---|---|---|
#18+
Stax но имхо более чесно было б прописать subtype BINARY_INTEGER is INTEGER range '-214748364 8 '..2147483647; Было бы еще более честно написать что это кардинально другой тип, как это делается с другими типами, ведь INTEGER это NUMBER, и для подтипов INTEGER/NUMBER нельзя использовать RANGE (ошибка PLS-00572) Например: type BINARY_INTEGER is BINARY32_BASE; но почему-то в версии 11.2 Оракл так не сделал. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2020, 16:18 |
|
Как понимать текст SYS.STANDARD?
|
|||
---|---|---|---|
#18+
НеофитSQL ведь INTEGER это NUMBER Если смотреть по sys.standard, то это NUMBER_BASE(38,0). Но воспользоваться типом NUMBER_BASE нигде кроме как в sys.standard нельзя. НеофитSQL и (2)написан в псевдокоде НеофитSQL написан на языке отличающемся от стандартного PL/SQL нет сомнений Соломенный аргумент для подтверждения тезиса. Если "отличается от стандартного PL/SQL", то конечно это псевдокод, да, логично. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2020, 16:31 |
|
Как понимать текст SYS.STANDARD?
|
|||
---|---|---|---|
#18+
Вячеслав Любомудров, А до наката standard анонимные блоки с базовыми типами работать будут? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2020, 16:34 |
|
Как понимать текст SYS.STANDARD?
|
|||
---|---|---|---|
#18+
env НеофитSQL ведь INTEGER это NUMBER Если смотреть по sys.standard, то это NUMBER_BASE(38,0). Но воспользоваться типом NUMBER_BASE нигде кроме как в sys.standard нельзя. Не совсем так. В 11.2 определение выглядит так: subtype BINARY_INTEGER is INTEGER range '-2147483647'..2147483647; В свою очередь INTEGER - подтип NUMBER, и т.д. Примешивать тип NUMBER_BASE к этой конкретной дискуссии нет необходимости. Иначе любое обсуждение типов можно привести к "а там в самом начале _BASE", что ничего не дает. env НеофитSQL и (2)написан в псевдокоде НеофитSQL написан на языке отличающемся от стандартного PL/SQL нет сомнений Соломенный аргумент для подтверждения тезиса. Если "отличается от стандартного PL/SQL", то конечно это псевдокод, да, логично. Не совсем так. Я сказал что он написан в псевдокоде по конкретным причинам, которые были указаны ранее. Во-первых, синтакс отличается в местах, где нет такой необходимости. Это намек на отдельный независимый парсер (а не просто расширения к языку). Во-вторых, одинаковые выражения означают разные вещи в PL/SQL и в языке модуля STANDARD. Есть другие, менее понятные для меня расхождения, но пока эти два. Если вы человек сведущий в этой теме и со сформировавшимся мнением, я предлагаю вам выдвинуть собственный тезис и критерий его правильности. Вам это позволит поучаствовать в дискуссии на равных, а не довольствоваться только поиском ошибок в доводах других (что тоже важная часть научного подхода поиска истины). Посмотрите критерии "компилятор или инсталлятор" пару сообщений назад, там есть возможность дополнить и расширить. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2020, 16:57 |
|
Как понимать текст SYS.STANDARD?
|
|||
---|---|---|---|
#18+
НеофитSQL В свою очередь INTEGER - подтип NUMBER НеофитSQL Примешивать тип NUMBER_BASE к этой конкретной дискуссии нет необходимости. Прочтите своё же первое сообщение в теме. Внимательно. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2020, 17:22 |
|
Как понимать текст SYS.STANDARD?
|
|||
---|---|---|---|
#18+
НеофитSQL Я сказал что он написан в псевдокоде по конкретным причинам, которые были указаны ранее. В таком случае, видимо в вашей речи слово псевдокод имеет своё значение. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2020, 17:28 |
|
Как понимать текст SYS.STANDARD?
|
|||
---|---|---|---|
#18+
НеофитSQL Вам это позволит поучаствовать в дискуссии на равных О, уже пошло деление на достойных участвовать в "дискуссии" и недостойных. Ну да, куда мне в калашный ряд-то. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2020, 17:29 |
|
Как понимать текст SYS.STANDARD?
|
|||
---|---|---|---|
#18+
НеофитSQL В свою очередь INTEGER - подтип NUMBER, Смотря, что такое number Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2020, 17:40 |
|
Как понимать текст SYS.STANDARD?
|
|||
---|---|---|---|
#18+
env НеофитSQL В свою очередь INTEGER - подтип NUMBER, Смотря, что такое number Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Я прочитал ваш пример, но он не относится к теме. Я думаю вы сами это понимаете, как впрочем и все читатели. По поводу "О, уже пошло деление на достойных участвовать в "дискуссии" и недостойных." это вы зря. Каждый для себя выбирает уровень участия в той или другой теме. Кто-то пришел поучиться, кто-то поделиться знаниями а кто-то постебаться от нечего делать. Я могу только предложить как вы можете более полно поучаствовать в этой теме, я не могу вас заставить отвлекаться на "а я еще и вот так умею, хоть это не в тему" примеры. Да и не хотел бы; может вам не комфортно свой тезис выдвигать по какой-нибудь личной причине. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2020, 18:13 |
|
Как понимать текст SYS.STANDARD?
|
|||
---|---|---|---|
#18+
НеофитSQL, У вас цель какая? Научиться пользоваться PL/SQL по прямому назначению или написать свой собственный компилятор для своего собственного языка, чтобы скомпилированный код мог исполняться ядром PL/SQL? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2020, 18:51 |
|
Как понимать текст SYS.STANDARD?
|
|||
---|---|---|---|
#18+
graycode НеофитSQL, У вас цель какая? Научиться пользоваться PL/SQL по прямому назначению или написать свой собственный компилятор для своего собственного языка, чтобы скомпилированный код мог исполняться ядром PL/SQL? У меня достаточно простые задачи в PL/SQL, которые не требуют обширных знаний и могут решаться новичком вроде меня. Поскольку насущные задачи квалификацию особо не повысят, остаются книги а также ... Мне действительно интересно нырнуть под капот и посмотреть как разработчики Оракла решали ту или иную проблему. Ограничения, ошибки или срезание углов (как с BINARY_INTEGER, или rowid) вызывают особый интерес, т.к. это бывает признаком сложных проблем, или тупиков архитектуры. Про которые мне интересно подумать и расширить кругозор. Например, я сейчас смотрю как оракл вызывает С библиотеки. Создатели считали это абсолютно необходимым для скорости, но похоже что в 11.2 только для себя, скорее всего из соображений безопасности. Также интересно как Оракл поступился безопасностью для ускорения исполнения кода в STANDARD, и что это означает для тех кто этот пакет модифицируют. Надеюсь я ответил на ваш вопрос. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2020, 20:33 |
|
Как понимать текст SYS.STANDARD?
|
|||
---|---|---|---|
#18+
env Вячеслав Любомудров, А до наката standard анонимные блоки с базовыми типами работать будут? ап. Мне тоже интересен авторитетный ответ на этот вопрос. Судя по интернету, ответ нет, т.к. при отсутствии STANDARD компилятор отказывается работать - мол нету STANDARD, и скомпилировать STANDARD обычными средствами тоже не получается (снова - нету STANDARD). Поэтому приходится запускать особые скрипты чтоб этот STANDARD заиметь, или как тут выразились, "накатать". https://db-blog.web.cern.ch/blog/franck-pachot/2018-12-minimal-oracle По ссылке описаны страдания человека, который развлекался установкой Оракла в абсолютно минимальной конфигурации, значительно меньше чем любая конфигурация рекомендуемая или поддерживаемая Ораклом. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2020, 20:41 |
|
Как понимать текст SYS.STANDARD?
|
|||
---|---|---|---|
#18+
НеофитSQL У меня достаточно простые задачи в PL/SQL, которые не требуют обширных знаний и могут решаться новичком вроде меня. Поскольку насущные задачи квалификацию особо не повысят, остаются книги а также ... Наверное стоит поискать работу с более глубокими и интересными задачами, тогда времени заниматься ерундой не будет. НеофитSQL Мне действительно интересно нырнуть под капот и посмотреть как разработчики Оракла решали ту или иную проблему. Ограничения, ошибки или срезание углов (как с BINARY_INTEGER, или rowid) вызывают особый интерес, т.к. это бывает признаком сложных проблем, или тупиков архитектуры. Про которые мне интересно подумать и расширить кругозор. Таким образом кругозор сильно вы не расширите, если реально хотите расширить, изучайте Си, изучайте как создают компиляторы и вливайтесь в ряды разработчиков того же PostgreSQL или Kotlin, там действительно нужно ковыряться в системных кишках, как раз то что вам интересно, а PL/SQL не про это. НеофитSQL Например, я сейчас смотрю как оракл вызывает С библиотеки Вы думали что Oracle написан на ассемблере или сразу в машинных кодах? НеофитSQL и что это означает для тех кто этот пакет модифицируют. Зачем его модифицировать? Oracle поставляет продукт решающий определенные задачи, если есть сильно большое желание помочь Oracle с этим, то нужно идти работать непосредственно в сам Oracle. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2020, 22:35 |
|
Как понимать текст SYS.STANDARD?
|
|||
---|---|---|---|
#18+
graycode, спасибо за совет. C/C++ и несколько ассемблеров я изучил в начале карьеры, собственно ими и занимался. Там для меня все вроде как понятно, исключая прогресс в C++ стандарте за крайние годы. > Зачем его [STANDARD] модифицировать? Oracle поставляет продукт решающий определенные задачи, > если есть сильно большое желание помочь Oracle с этим, то нужно идти работать непосредственно в сам Oracle. Мне не надо, но я знаю что человек с этого форума (Вячеслав) делал небольшое изменение прошлом, по бизнес необходимости. Его изменение изменило длину какого-то поля, и сработало . Это важно для этой темы, т.к. редкий случай. Из этого я заключил что по крайней мере в версии 10 этот пакет не пустышка для отвода глаз, которую Оракл как бы "типа компилит" с предсказуемо одинаковым результатом и выставлением флажка VALID. Как минимум тянет на инсталл скрипт, т.к. читает какие-то константы из этого stdspec.sql. Чем читает, еще пока не разобрался. Похоже, что не штатным компилятором, пока не уверен. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2020, 23:21 |
|
Как понимать текст SYS.STANDARD?
|
|||
---|---|---|---|
#18+
Что-то последнее время я мало кода постил. Вот загадка, сам придумал. Вроде в тему - см. комментарии. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9.
У меня на оракле 11.2 дает неожиданный результат. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2020, 23:29 |
|
Как понимать текст 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?all=1&fid=52&tid=1880841]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
55ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
77ms |
get tp. blocked users: |
1ms |
others: | 298ms |
total: | 476ms |
0 / 0 |