powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как понимать текст SYS.STANDARD?
56 сообщений из 56, показаны все 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
Как понимать текст SYS.STANDARD?
    #40004113
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
booby
НеофитSQL,

скажи спасибо, что тебе не сильно врут.
В "других языках" ни строчке официального библиотечного кода верить нельзя даже приблизительно.
Они там просто ничему не соответствуют.


Я не пытаюсь обидеть твоего любимого ребенка, поэтому "а у вас негров линчуют" тут не очень подходит.

Когда я выпускал header files для MSDN, мы туда только правду размещали. Т.е. за Windows SDK/DDK я ручаюсь, по крайней мере до семерки. С чем запускался мейк для сборки Винды - то и шло всем программистам, без правок.
...
Рейтинг: 0 / 0
Как понимать текст SYS.STANDARD?
    #40004115
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
...
Рейтинг: 0 / 0
Как понимать текст SYS.STANDARD?
    #40004117
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env
.. типы и подтипы, определённые в пространстве имён пакета sys.standard не обязаны совпадать с типами дефолтного пространства имён.


Я не сразу смог прочитать предложение выше, поэтому отвечаю с задержкой.

Вы не правы.

В случае пакета SYS.STANDARD, о котором идет речь, типы и подтипы пакета обязаны совпадать с типами дефолтного пространства, т.е. не являются локальными для пакета и не требуют указания sys.standard. перед ними.
Это особенность этого пакета.

Источник: документация Оракл. https://docs.oracle.com/cd/A57673_01/DOC/server/doc/PLS23/ch8.htm
...
Рейтинг: 0 / 0
Как понимать текст SYS.STANDARD?
    #40004161
oragraf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Другими словами - поскольку STANDARD/spec содержит некоторые лживые декларации

Мастер и МаргаритаЕго послали, чтобы над верою надругался и подвел народ под римские мечи!
...
Рейтинг: 0 / 0
Как понимать текст SYS.STANDARD?
    #40004169
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неофит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.

Вы можете привести какое-либо проверяемое обоснование вашего утверждения?
Я-то могу
А ты уже достал своей пургой, несущейся с умным видом
Код: 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.
oracle@helios:~$ export ORACLE_SID=neofit
oracle@helios:~$ sqlplus / as sysdba     

SQL*Plus: Release 18.0.0.0.0 - Production on Wed Sep 30 11:18:06 2020
Version 18.10.0.0.0

Copyright (c) 1982, 2018, Oracle.  All rights reserved.

Connected to an idle instance.

SQL> host cat > $ORACLE_HOME/dbs/init$ORACLE_SID.ora
db_name=neofit
sga_target=1024m
^D
SQL> startup nomount
ORACLE instance started.

Total System Global Area 1073737496 bytes
Fixed Size                  8646424 bytes
Variable Size             671088640 bytes
Database Buffers          381681664 bytes
Redo Buffers               12320768 bytes
SQL> create database;

Database created.

SQL> column name format a30
SQL> alter session set nls_date_format='dd-mm-yyyy hh24:mi:ss';

Session altered.

SQL> select name, type#, ctime from obj$ where name='STANDARD';

no rows selected

SQL> @?/rdbms/admin/stdspec

Session altered.


Package created.


Session altered.

SQL> select name, type#, ctime from obj$ where name='STANDARD';

NAME                                TYPE# CTIME
------------------------------ ---------- -------------------
STANDARD                                9 30-09-2020 11:23:30

SQL> @?/rdbms/admin/stdbody

Session altered.


Package body created.


Session altered.

SQL> select name, type#, ctime from obj$ where name='STANDARD';

NAME                                TYPE# CTIME
------------------------------ ---------- -------------------
STANDARD                                9 30-09-2020 11:23:30
STANDARD                               11 30-09-2020 11:24:00

SQL>

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

Я не все смог понять в вашем примере, но вижу что вы пользуетесь версией 18 чтобы опровергнуть мои выводы о 11.2.

Когда у меня будет доступ к 18/19, я сделаю сравнительный анализ.
...
Рейтинг: 0 / 0
Как понимать текст SYS.STANDARD?
    #40004197
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Я не все смог понять в вашем примере, но вижу что вы пользуетесь версией 18 чтобы опровергнуть мои выводы о 11.2.


Неофит, чтобы Ваше умное лицо выглядело реально умно - следует все-таки разобраться в вопросе.
Вячеслав создал новую, абсолютно пустую БД.
Показал, что в ней нет объекта с именем STANDARD.
И накатил пакет штатным скриптом.
Так, как это делается всегда при ручном создании БД от самых первых версий, в которых появился pl/sql.
Чем убедительно показал несостоятельность Ваших измышлизмов относительно сути пакета и невозможности его наката на БД из sql*plus.
...
Рейтинг: 0 / 0
Как понимать текст SYS.STANDARD?
    #40004206
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Wrote file afiedt.buf

  1  declare
  2     i sys.standard.binary_integer := -2147483648;
  3  begin
  4      dbms_output.put_line(i);
  5      i := i+1;
  6      dbms_output.put_line(i);
  7      i := i-2;
  8      dbms_output.put_line(i);
  9* end;
SQL> /
-2147483648
-2147483647
declare
*
ERROR at line 1:
ORA-01426: numeric overflow
ORA-06512: at line 7



НеофитSQL,
НеофитSQL
подтипы пакета обязаны совпадать

Но есть нюансы..
...
Рейтинг: 0 / 0
Как понимать текст SYS.STANDARD?
    #40004255
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
Как понимать текст SYS.STANDARD?
    #40004296
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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" :)
...
Рейтинг: 0 / 0
Как понимать текст SYS.STANDARD?
    #40004298
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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 Оракл так не сделал.
...
Рейтинг: 0 / 0
Как понимать текст SYS.STANDARD?
    #40004300
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
ведь INTEGER это NUMBER

Если смотреть по sys.standard, то это NUMBER_BASE(38,0). Но воспользоваться типом NUMBER_BASE нигде кроме как в sys.standard нельзя.


НеофитSQL
и (2)написан в псевдокоде

НеофитSQL
написан на языке отличающемся от стандартного PL/SQL нет сомнений

Соломенный аргумент для подтверждения тезиса. Если "отличается от стандартного PL/SQL", то конечно это псевдокод, да, логично.
...
Рейтинг: 0 / 0
Как понимать текст SYS.STANDARD?
    #40004301
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав Любомудров,

А до наката standard анонимные блоки с базовыми типами работать будут?
...
Рейтинг: 0 / 0
Как понимать текст SYS.STANDARD?
    #40004310
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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.
Есть другие, менее понятные для меня расхождения, но пока эти два.

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

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

НеофитSQL
Примешивать тип NUMBER_BASE к этой конкретной дискуссии нет необходимости.


Прочтите своё же первое сообщение в теме. Внимательно.
...
Рейтинг: 0 / 0
Как понимать текст SYS.STANDARD?
    #40004320
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Я сказал что он написан в псевдокоде по конкретным причинам, которые были указаны ранее.


В таком случае, видимо в вашей речи слово псевдокод имеет своё значение.
...
Рейтинг: 0 / 0
Как понимать текст SYS.STANDARD?
    #40004321
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Вам это позволит поучаствовать в дискуссии на равных


О, уже пошло деление на достойных участвовать в "дискуссии" и недостойных. Ну да, куда мне в калашный ряд-то.
...
Рейтинг: 0 / 0
Как понимать текст SYS.STANDARD?
    #40004324
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
В свою очередь INTEGER - подтип NUMBER,

Смотря, что такое number

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SQL> ed
Wrote file afiedt.buf

  1  create or replace package wtf is
  2      subtype number is varchar2(100);
  3      subtype integer is number(5);
  4      g_s integer := 'abcd';
  5* end;
SQL> /

Package created.

SQL> set serverout on
SQL> exec dbms_output.put_line(wtf.g_s);
abcd
...
Рейтинг: 0 / 0
Как понимать текст SYS.STANDARD?
    #40004331
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env
НеофитSQL
В свою очередь INTEGER - подтип NUMBER,

Смотря, что такое number

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SQL> ed
Wrote file afiedt.buf

  1  create or replace package wtf is
  2      subtype number is varchar2(100);
  3      subtype integer is number(5);
  4      g_s integer := 'abcd';
  5* end;
SQL> /

Package created.

SQL> set serverout on
SQL> exec dbms_output.put_line(wtf.g_s);
abcd



Я прочитал ваш пример, но он не относится к теме. Я думаю вы сами это понимаете, как впрочем и все читатели.

По поводу "О, уже пошло деление на достойных участвовать в "дискуссии" и недостойных." это вы зря.

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

Я могу только предложить как вы можете более полно поучаствовать в этой теме,
я не могу вас заставить отвлекаться на "а я еще и вот так умею, хоть это не в тему" примеры.
Да и не хотел бы; может вам не комфортно свой тезис выдвигать по какой-нибудь личной причине.
...
Рейтинг: 0 / 0
Как понимать текст SYS.STANDARD?
    #40004341
graycode
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
НеофитSQL,

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

У вас цель какая? Научиться пользоваться PL/SQL по прямому назначению или написать свой собственный компилятор для своего собственного языка, чтобы скомпилированный код мог исполняться ядром PL/SQL?


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

Мне действительно интересно нырнуть под капот и посмотреть как разработчики Оракла решали ту или иную проблему.
Ограничения, ошибки или срезание углов (как с BINARY_INTEGER, или rowid) вызывают особый интерес, т.к. это бывает признаком сложных проблем, или тупиков архитектуры. Про которые мне интересно подумать и расширить кругозор.
Например, я сейчас смотрю как оракл вызывает С библиотеки. Создатели считали это абсолютно необходимым для скорости, но похоже что в 11.2 только для себя, скорее всего из соображений безопасности. Также интересно как Оракл поступился безопасностью для ускорения исполнения кода в STANDARD, и что это означает для тех кто этот пакет модифицируют.

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

А до наката standard анонимные блоки с базовыми типами работать будут?


ап.

Мне тоже интересен авторитетный ответ на этот вопрос.

Судя по интернету, ответ нет, т.к. при отсутствии STANDARD компилятор отказывается работать - мол нету STANDARD, и скомпилировать STANDARD обычными средствами тоже не получается (снова - нету STANDARD).
Поэтому приходится запускать особые скрипты чтоб этот STANDARD заиметь, или как тут выразились, "накатать".

https://db-blog.web.cern.ch/blog/franck-pachot/2018-12-minimal-oracle
По ссылке описаны страдания человека, который развлекался установкой Оракла в абсолютно минимальной конфигурации, значительно меньше чем любая конфигурация рекомендуемая или поддерживаемая Ораклом.
...
Рейтинг: 0 / 0
Как понимать текст SYS.STANDARD?
    #40004367
graycode
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
НеофитSQL
У меня достаточно простые задачи в PL/SQL, которые не требуют обширных знаний и могут решаться новичком вроде меня.
Поскольку насущные задачи квалификацию особо не повысят, остаются книги а также ...

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

НеофитSQL
Мне действительно интересно нырнуть под капот и посмотреть как разработчики Оракла решали ту или иную проблему.
Ограничения, ошибки или срезание углов (как с BINARY_INTEGER, или rowid) вызывают особый интерес, т.к. это бывает признаком сложных проблем, или тупиков архитектуры. Про которые мне интересно подумать и расширить кругозор.

Таким образом кругозор сильно вы не расширите, если реально хотите расширить, изучайте Си, изучайте как создают компиляторы и вливайтесь в ряды разработчиков того же PostgreSQL или Kotlin, там действительно нужно ковыряться в системных кишках, как раз то что вам интересно, а PL/SQL не про это.

НеофитSQL
Например, я сейчас смотрю как оракл вызывает С библиотеки

Вы думали что Oracle написан на ассемблере или сразу в машинных кодах?

НеофитSQL
и что это означает для тех кто этот пакет модифицируют.

Зачем его модифицировать? Oracle поставляет продукт решающий определенные задачи, если есть сильно большое желание помочь Oracle с этим, то нужно идти работать непосредственно в сам Oracle.
...
Рейтинг: 0 / 0
Как понимать текст SYS.STANDARD?
    #40004376
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
graycode,

спасибо за совет. C/C++ и несколько ассемблеров я изучил в начале карьеры, собственно ими и занимался.
Там для меня все вроде как понятно, исключая прогресс в C++ стандарте за крайние годы.

> Зачем его [STANDARD] модифицировать? Oracle поставляет продукт решающий определенные задачи,
> если есть сильно большое желание помочь Oracle с этим, то нужно идти работать непосредственно в сам Oracle.

Мне не надо, но я знаю что человек с этого форума (Вячеслав) делал небольшое изменение прошлом, по бизнес необходимости.

Его изменение изменило длину какого-то поля, и сработало . Это важно для этой темы, т.к. редкий случай.

Из этого я заключил что по крайней мере в версии 10 этот пакет не пустышка для отвода глаз, которую Оракл как бы "типа компилит" с предсказуемо одинаковым результатом и выставлением флажка VALID. Как минимум тянет на инсталл скрипт, т.к. читает какие-то константы из этого stdspec.sql. Чем читает, еще пока не разобрался. Похоже, что не штатным компилятором, пока не уверен.
...
Рейтинг: 0 / 0
Как понимать текст SYS.STANDARD?
    #40004379
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что-то последнее время я мало кода постил.

Вот загадка, сам придумал. Вроде в тему - см. комментарии.


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
declare 
  f binary_float;  -- определен в STANDARD ->  subtype BINARY_FLOAT  is NUMBER;
  d binary_double; -- определен в STANDARD ->  subtype BINARY_DOUBLE is NUMBER;
begin
  d := 4e84; -- оценка числа фотонов во Вселенной
  f := d;

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



У меня на оракле 11.2 дает неожиданный результат.
...
Рейтинг: 0 / 0
Как понимать текст 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
56 сообщений из 56, показаны все 3 страниц
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как понимать текст SYS.STANDARD?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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