powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как понимать текст SYS.STANDARD?
25 сообщений из 56, страница 1 из 3
Как понимать текст SYS.STANDARD?
    #40003599
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tldr: этот пакет SYS.STANDARD - он "живой" или "справочный"?
Мое исследование говорит, что справочный
и написан в псевдокоде. В нем есть ошибки и неверные посылы, поэтому в отличие от настоящих исходников он не может считаться истиной в последней инстанции. Все же, есть польза от его прочтения.

Я почитал SYS.STANDARD на досуге, там есть немало любопытных приемчиков и комментариев.
Заметил некоторые нестыковки, как с документацией так и с функционалом по факту, поэтому возник вопрос в [subj].

Нестыковка с документацией:
В пакете STANDARD написано следующее:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
  type NUMBER is NUMBER_BASE;
  ..
  subtype INTEGER is NUMBER(38,0);
  ..
  subtype BINARY_INTEGER is INTEGER range '-2147483647'..2147483647;
  ..
  subtype pls_integer is binary_integer;



у меня в версии 11.2 PL/SQL тип PLS_/BINARY_INTEGER определен как ограниченный подтип NUMBER, что есть десятичное число переменной длины. Документация обещает что тип BINARY_INTEGER (также PLS_INTEGER) это 32-битные переменные, которые хранятся в естественном для компьютера двоичном формате и быстрее работают с арифметикой.
Поскольку dump() в PL/SQL не доступен, я не смог проверить напрямик как BINARY_INTEGER хранится в памяти.
Однако по косвенным признакам (скорость исполнения бит операций над PLS_INTEGER в разы быстрее), документация права.

Нестыковка с фактом:
В пакете определены две полиморфные функции, с разными типами параметров.
Код: plsql
1.
2.
  function BITAND (LEFT pls_integer, RIGHT pls_integer) return pls_integer;
  function BITAND (LEFT integer, RIGHT integer)         return integer;



Из практики я знаю, что попытка вызова полиморфных функций с null параметром даст ошибку компиляции PLS-00307.
Однако, я могу вызывать bitand(null,null) без ошибок, т.е. эта функция определена не так, как записано в пакете STANDARD.

Вот еще более очевидный пример несоответствия факту:
Код: plsql
1.
  subtype BINARY_INTEGER is INTEGER range '-2147483647'..2147483647;



- синтаксическая ошибка, одинарные кавычки.
- запрещенная операция, для подтипов NUMBER запрещен диапазон (PLS-00572: improper constraint form used)
- n binary_integer := -2147483648 ; -- присваивание вне диапазона значений работает, ошибки нет.

Моя догадка, что этот пакет компилируется совсем другим компилятором, который понимает определение операторов, прагму 'interface' и кавычки в запрещенных определениях подтипов. Судя по присутствию восклицаний и имен разработчиков в комментариях, этот файл не сильно чистили для публики. Просто его нельзя воспринимать как PL/SQL код и делать выводы как если бы он был таковым.
...
Рейтинг: 0 / 0
Как понимать текст SYS.STANDARD?
    #40003758
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL


Из практики я знаю , что попытка вызова полиморфных функций с null параметром даст ошибку компиляции PLS-00307.

у Вас мало практики
дает ошибку когда не может определить тип,
пробуйте напр cast(null as number)


ps
SYS.STANDARD не изучал
.....
stax
...
Рейтинг: 0 / 0
Как понимать текст SYS.STANDARD?
    #40003765
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все там нормально
И обрабатывается это обычным путем -- этот пакет загружается и компилируется через обычный sqlplus при установке/апгрейде словаря БД

Но чувак пытается переложить свой (не знаю, насколько большой) опыт работы с другими языками на [PL/]SQL
...
Рейтинг: 0 / 0
Как понимать текст SYS.STANDARD?
    #40003790
serpv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В этом деле главное не начать вносить "улучшения".
Типа увеличить диапазон значений BINARY_INTEGER в определениях SYS.STANDARD, т.к. "моему приложению этого мало".
...
Рейтинг: 0 / 0
Как понимать текст SYS.STANDARD?
    #40004047
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax
НеофитSQL


Из практики я знаю , что попытка вызова полиморфных функций с null параметром даст ошибку компиляции PLS-00307.

у Вас мало практики
дает ошибку когда не может определить тип,
пробуйте напр cast(null as number)


Не думал что кого-то заденет слово "практика". Я имел в виду из прикладного эксперимента, а не из теоретических рассуждений основанных на богатом жизненном опыте SQL. Ибо с позиции SQL-стажа я рассуждать пока не могу, а вот эксперимент - легко.

В этом конкретном примере, я заметил что декларации одной из функций в STANDARD не объясняют поведение моей системы.
Код: plsql
1.
2.
3.
4.
5.
  -- так написано в STANDARD. параметры отличаются типом, и nullable.
  function BITAND (LEFT pls_integer, RIGHT pls_integer)
        return pls_integer;
  function BITAND (LEFT integer, RIGHT integer)
        return integer;



Из практики (о ней чуть ниже) я знаю, что в этом случае вызов bitand(null,null) должен быть пойман на стадии компиляции, однако это не происходит.
Код: plsql
1.
2.
3.
4.
5.
6.
SQL> select bitand(null,null) from dual
  2  /
BITAND(NULL,NULL)
-----------------

SQL>



Эксперимент: я создал пакет "nonstd" с двумя функциями с аналогичными сигнатурами. Имя поменял на MySum.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SQL> select nonstd.MySum(null,null) from dual -- должно дать ошибку, недостаточно информации о типе для полиморфизма
  2  /
select besdig.MySum(null,null) from dual
ORA-06553: PLS-307: too many declarations of 'MYSUM' match this call

SQL> select bitand(null,null) from dual; -- bitand все еще работает?
BITAND(NULL,NULL)
-----------------

SQL>



Выводы в начале темы. Если кто-то хочет проверить на своей платформе, код ниже.


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
create or replace package nonstd is
  function MySum(LEFT pls_integer, RIGHT pls_integer) return pls_integer;
  function MySum(LEFT integer,     RIGHT integer)     return integer;
end nonstd;
/
create or replace package body nonstd is
  function MySum(LEFT pls_integer, RIGHT pls_integer) return pls_integer is
  begin 
    return LEFT+RIGHT; 
  end MySum;

  function MySum(LEFT integer, RIGHT integer) return integer is
  begin 
    return LEFT+RIGHT; 
  end MySum;
end nonstd;
/

...
Рейтинг: 0 / 0
Как понимать текст SYS.STANDARD?
    #40004050
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Если кто-то хочет проверить


Что проверять? Что SQL-функция bitand это не синоним для sys.standard.bitand?

Код: plsql
1.
2.
3.
select sys.standard.bitand(null,null) d from dual;

ORA-06553: PLS-307: too many declarations of 'BITAND' match this call



упд. Вот уж точно, многия знания - многия печали.
...
Рейтинг: 0 / 0
Как понимать текст SYS.STANDARD?
    #40004051
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вячеслав Любомудров
Все там нормально
И обрабатывается это обычным путем -- этот пакет загружается и компилируется через обычный sqlplus при установке/апгрейде словаря БД

Но чувак пытается переложить свой (не знаю, насколько большой) опыт работы с другими языками на [PL/]SQL


Это утверждение не сочетается с наличием синтаксических ошибок в SYS.STANDARD.
К примеру,
Код: plsql
1.
subtype BINARY_INTEGER is INTEGER range '-2147483647'..2147483647;


не компилируется по двум причинам, указанным в первом сообщении.

Если бы компилировалось, то присваивание
Код: plsql
1.
i binary_integer := '-2147483648;


выдавало бы ошибку.

Каждый может посмотреть в свой SYS.STANDARD и убедиться что это так, по крайней мере для 11.2.

Вы можете привести какое-либо проверяемое обоснование вашего утверждения?
...
Рейтинг: 0 / 0
Как понимать текст SYS.STANDARD?
    #40004054
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env
НеофитSQL
Если кто-то хочет проверить


Что проверять? Что SQL-функция bitand это не синоним для sys.standard.bitand?

Код: plsql
1.
2.
3.
select sys.standard.bitand(null,null) d from dual;

ORA-06553: PLS-307: too many declarations of 'BITAND' match this call



упд. Вот уж точно, многия знания - многия печали.


Признаю ошибку.
Мой эксперимент был проведен неверно, т.к. я не знал о разнице между SQL bitand() и PL/SQL bitand(). Теперь знаю.
Этот конкретный довод считать недействительным.
...
Рейтинг: 0 / 0
Как понимать текст SYS.STANDARD?
    #40004058
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL,

Подход "я нашёл в каком-то модуле описание каких-то типов и функций и экстраполирую это знание на дефолтное пространство имён" неверен в принципе, независимо от того pl/sql это или c.
...
Рейтинг: 0 / 0
Как понимать текст SYS.STANDARD?
    #40004061
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
НеофитSQL

Вы можете привести какое-либо проверяемое обоснование вашего утверждения?
ищи по форуму, было уже многократно. Из-за твоей лени и наглости и так по сто раз одно и тоже пересказывают
...
Рейтинг: 0 / 0
Как понимать текст SYS.STANDARD?
    #40004065
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
К примеру,
Код: plsql
1.
subtype BINARY_INTEGER is INTEGER



И вырывать из контекста - тоже не очень хорошая идея. Для начала - а что здесь такое INTEGER?
...
Рейтинг: 0 / 0
Как понимать текст SYS.STANDARD?
    #40004072
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
SQL> create or replace package scott.standard is begin null; end;
  2  /
create or replace package scott.standard is begin null; end;
*
ERROR at line 1:
ORA-06555: this name is currently reserved for use by user SYS


SQL> create or replace procedure scott.standard is begin null; end;
  2  /
create or replace procedure scott.standard is begin null; end;
*
ERROR at line 1:
ORA-06555: this name is currently reserved for use by user SYS


SQL> create or replace function scott.standard retunn number is begin return 1; end;
  2  /
create or replace function scott.standard retunn number is begin return 1; end;
*
ERROR at line 1:
ORA-06555: this name is currently reserved for use by user SYS


SQL>



А простым смертным Constrained Subtypes .

SY.
...
Рейтинг: 0 / 0
Как понимать текст SYS.STANDARD?
    #40004078
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
env
НеофитSQL
К примеру,
Код: plsql
1.
subtype BINARY_INTEGER is INTEGER



И вырывать из контекста - тоже не очень хорошая идея. Для начала - а что здесь такое INTEGER?


В данном конкретном случае, по сути - обманка, противоречащая, если не формальному описанию того, что такое subtype
(которое вполне себе мутн о , за сознательно выброшенными соглашениями языка-родителя),
то, по крайней мере, "естественному" чтению.
"Естественно" было бы ожидать, что subtype не может порождать собственного независимого семейства подтипов.

Здесь, оказывается, может.
И это невозможно прочитать глазами.
...
Рейтинг: 0 / 0
Как понимать текст SYS.STANDARD?
    #40004084
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env
НеофитSQL
К примеру,
Код: plsql
1.
subtype BINARY_INTEGER is INTEGER



И вырывать из контекста - тоже не очень хорошая идея. Для начала - а что здесь такое INTEGER?


Когда читаешь дискуссию с середины, она кажется вырванной из контекста.
Посмотрите в первом сообщении темы, там в первой дюжине строк все указано, в том числе

subtype INTEGER is NUMBER(38,0);
...
Рейтинг: 0 / 0
Как понимать текст SYS.STANDARD?
    #40004086
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY,

почему б ораклю не сделать
subtype BINARY_INTEGER is INTEGER range '-214748364 8 '..2147483647;

.....
stax
...
Рейтинг: 0 / 0
Как понимать текст SYS.STANDARD?
    #40004097
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
subtype INTEGER is NUMBER(38,0);

Отлично! А что такое NUMBER?

упд. Это я к тому, чтобы вы сами прочитали своё первое сообщение в этой теме и осознали, что типы и подтипы, определённые в пространстве имён пакета sys.standard не обязаны совпадать с типами дефолтного пространства имён. Как только осознаете, что опять старательно сравниваете зелёное с круглым по степени мохнатости - пишите.
...
Рейтинг: 0 / 0
Как понимать текст SYS.STANDARD?
    #40004098
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby
...
"Естественно" было бы ожидать, что subtype не может порождать собственного независимого семейства подтипов.
...

Здесь подразумевалось - независимого в смысле PLS-00307
...
Рейтинг: 0 / 0
Как понимать текст SYS.STANDARD?
    #40004101
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax
SY,

почему б ораклю не сделать
subtype BINARY_INTEGER is INTEGER range '-214748364 8 '..2147483647;

.....
stax


-214748364 8 это -0. Про +0 и -0 слышал?

SY.
...
Рейтинг: 0 / 0
Как понимать текст SYS.STANDARD?
    #40004103
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY,

у меня руки чесались так написать, но я по ним нашлёпал...

Судя по всему, когда-то так и было.
Сейчас это уже не так.
Вероятно, по крайней мере, с 10-ки, может с 9-ки - не проверишь уже.
...
Рейтинг: 0 / 0
Как понимать текст SYS.STANDARD?
    #40004105
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
но в каком-нибудь древнем клиентском софте на это можно и нарваться...
...
Рейтинг: 0 / 0
Как понимать текст SYS.STANDARD?
    #40004106
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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 системных пакетов, и было включено только для образования. Там тоже есть что почитать.
...
Рейтинг: 0 / 0
Как понимать текст SYS.STANDARD?
    #40004107
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL,

скажи спасибо, что тебе не сильно врут.
В "других языках" ни строчке официального библиотечного кода верить нельзя даже приблизительно.
Они там просто ничему не соответствуют.
...
Рейтинг: 0 / 0
Как понимать текст SYS.STANDARD?
    #40004109
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY
Про +0 и -0 слышал?

Никогда не слышал про +-0 применительно к дополнительной кодировке.
...
Рейтинг: 0 / 0
Как понимать текст SYS.STANDARD?
    #40004110
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous
SY
Про +0 и -0 слышал?

Никогда не слышал про +-0 применительно к дополнительной кодировке.

binary_integer не всегда был машинным ....
Библиотечная реализация могда иметь свой взгляд, надо формсы хотя бы 6-е поднимать, чтобы диапазон значений проверить.
Хотя в 6-х оно уже может быть и ест 80000000 правильно.
...
Рейтинг: 0 / 0
Как понимать текст SYS.STANDARD?
    #40004111
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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.
declare 
  i binary_integer := -2147483648;
begin
  i := i/2;
  dbms_output.put_line( i );
end;



Печатает -1073741824

Вывод - как все другие 32-битные двоичные числа со знаком, BINARY_INTEGER использует интервал (-2147483648,2147483647).
Декларация в STANDARD была сделана симметричной или для красоты, или в попытке предотвратить exception при смене знака.
Но это не сработало:


Код: plsql
1.
2.
3.
4.
5.
declare 
  i binary_integer := -2147483648;
begin
  i := -i; -- вылетает с overflow
end;
...
Рейтинг: 0 / 0
25 сообщений из 56, страница 1 из 3
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как понимать текст SYS.STANDARD?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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