Oracle pi что это

Обновлено: 06.07.2024

Было несколько статей на тему миграции баз и версионность. Статьи бесспорно хороши, но только когда у вас несколько десятков табличек. У нас же 200к строк PL/SQL кода (число других объектов сопоставимо с этим) и команда из 10 человек.
Сначала пытались использовать для контроля всего связку RequesitePro + ClearQuest + ClearCase, но после непродолжительного времени от СС отказались и заменили на git с локальным хранилищем на gitorious.
Разные части приложения разделили на разные репозитории. Создали отдельные репозитории для модификаций для отдельных клиентов.
Подход к файлам следующий: есть baseline и есть патчи к нему, со временем и то и другое обновляется.

Написание кода

  1. CREATE OR REPLACE PROCEDURE upd_for_dept (
  2. dept_in IN employee.department_id%TYPE
  3. ,newsal_in IN employee.salary%TYPE)
  4. IS
  5. CURSOR emp_cur IS
  6. SELECT employee_id,salary,hire_date
  7. FROM employee WHERE department_id = dept_in;
  8. BEGIN
  9. FOR rec IN emp_cur LOOP
  10. UPDATE employee SET salary = NVL(newsal_in, 1000)
  11. WHERE employee_id = rec.employee_id;
  12. END LOOP;
  13. END upd_for_dept;


Здесь стоит обратить еще внимание на %TYPE. Всегда когда тип переменной это тип какой то колонки или поля, то следует использовать %TYPE.
В цикле FOR выполняется множество операторов UPDATE (и да всю процедуру можно запихать в один UPDATE). В Oracle DB pl/sql и sql код выполняют разные движки, и соответственно будет множество переключений контекстов между этими движками, что занимает какое то время.
Поэтому перепишем нашу процедуру следующим образом:

  1. CREATE OR REPLACE PROCEDURE upd_for_dept (
  2. dept_in IN employee.department_id%TYPE
  3. ,newsal_in IN employee.salary%TYPE)
  4. IS
  5. deptlist id_list;
  6. BEGIN
  7. SELECT employee_id
  8. BULK COLLECT INTO deptlist
  9. FROM employee WHERE department_id = dept_in;
  10. FORALL indx IN deptlist. FIRST ..deptlist. LAST
  11. UPDATE employee
  12. SET salary = NVL(newsal_in, 1000)
  13. WHERE employee_id = deptlist(indx);
  14. END upd_for_dept;


Оператор FORALL не вызовет переключений контекстов. Но что здесь еще плохо. Правильно это NVL. NVL — это функция PL/SQL, следовательно снова будет переключение кон текстов. Поэтому ее следует заменить на COALESCE или оператор CASE.
Тут естественным образом вырисовывается правило, об использовании функций встроенных в SQL движок.
При использовании коллекций естественным образом меняется дизайн процедур и функций. Конечным бы вариантом стала бы такая процедура:

Сразу отмечу, что в случае ошибки все математические функции возвращают NULL. Итак, перейдем к делу.

Знаки числа

Начнем с функции ABS (x), которая возвращает абсолютное значение переданного ей числа x. Пример:

SELECT ABS (-5)
Результат: 5
SELECT ABS (5)
Результат: 5

Знак числа можно определить с помощью функции SIGN (x) . Функция возвращает -1 если x отрицательное число, 1 если положительное и 0 если x является нулем. Пример:

SELECT SIGN (-5)
Результат: -1
SELECT SIGN (0)
Результат: 0
SELECT SIGN (5)
Результат: 1

Округление чисел

Начнем с функции FLOOR (x). Возвращает ближайшее целое число не превышающее x. Пример:

SELECT FLOOR (5.5)
Результат: 5
SELECT FLOOR (5.2)
Результат: 5
SELECT FLOOR (5.7)
Результат: 5
SELECT FLOOR (5)
Результат: 5
SELECT FLOOR (-5.2)
Результат: -6

Как видно, при задании любого положительного дробного числа от 5 до 6 возвращается целое число 5. А при передаче параметра -5.2 вернется -6, так как -6 меньше -5.2.

Обратное действие выполняет функция CEILING (x) . Она возвращает ближайшее целое число, которое превышает переданный параметр x. Пример:

SELECT CEILING (5.5)
Результат: 6
SELECT CEILING (5.2);
Результат: 6
SELECT CEILING (5.7)
Результат: 6
SELECT CEILING (5)
Результат: 5
SELECT CEILING (-5.5)
Результат: -5

Для округления дробного числа до ближайшего целого используется функция ROUND (x, d). Функция может принимать один или два параметра. Первый параметр x — число, которое необходимо округлить. Второй параметр d — целое число, определяющее разряд до которого необходимо округлить x. В случае если передан один параметр x, то происходит просто округление до ближайшего целого. Например:

SELECT ROUND (50.45)
Результат: 50
SELECT ROUND (50.76)
Результат: 51

При значении аргумента, равного середине между двумя целыми числами, результат будет зависеть от конкретной СУБД, где используется язык SQL.

Если в функцию передан второй параметр, то после запятой останется столько знаков сколько указано в параметре. Например, если после запятой необходимо оставить один символ, то в качестве второго параметра указываем цифру 1:

SELECT ROUND (50.76, 1)
Результат: 50,8

Существует возможность округлять число до любого разряда до запятой, для этого просто вторым параметром указываем отрицательное число. Например:

SELECT ROUND (251.55, -1)
Результат: 250

В SQL еще имеется функция, которая не округляет, а отсекает десятичную часть дробного числа. Функция TRUNCATE (x, y) возвращает число x, усеченное до y десятичных знаков:

SELECT TRUNCATE (1.999, 1)

SELECT TRUNCATE (1.999, 0)

Функции выполняющие сложные математические операции

Начнем с самого простого. Функция MOD (x, y) возвращает остаток от деления x на y. Например:

SELECT MOD (10, 3)
Результат: 1

Следующая функция EXP (x), которая возвращает значение e (Число Эйлера) возведенное в степень x. Или научным языком, возвращает экспоненту числа. Пример:

SELECT EXP (3)
Результат: 20.085536923187668

Далее рассмотрим функцию LOG (x), которая возвращает натуральный логарифм числа x. Пример:

SELECT LOG (10)
Результат: 2.302585092994046

Для получения логарифма числа x, для произвольной основы логарифма y можно пользоваться формулой LOG (x)/LOG (y). Например:

SELECT LOG (8)/LOG (2)
Результат: 3

Для получения десятичного логарифма числа x существует функция LOG10 (x). Пример:

SELECT LOG10 (100)
Результат: 2

Для возведения в степень в языке SQL есть целых две функции: POW (x, y) и POWER (x, y). Возвращают число x возведенное в степень y. Пример:

SELECT POW (2, 3)
Результат: 8
SELECT POWER (3, 2)
Результат: 9

А функция SQRT (x) вычисляет квадратный корень числа x. Пример:

SELECT SQRT (16)
Результат: 4

Чтобы использовать в своих вычисления число «пи» в SQL есть функция PI (), которая возвращает значение этого числа:

SELECT PI ()
Результат: 3.141593

Тригонометрические функции в языке SQL

Кратенько пройдемся по тригонометрическим функциям:

Везде x задается в радианах. Примеры:

SELECT COS (PI ())
Результат: -1
SELECT SIN (PI ()/2)
Результат: 1
SELECT TAN (PI ()/4)
Результат: 1
SELECT COT (PI ()/3)
Результат: 0.577350269189626

Функции ACOS (x) и ASIN (x) вычисляют соответственно арккосинус и арксинус числа x, т.е. функции возвращают величину, косинус или синус которой равен x. При этом если значение x не находится в диапазоне от -1 до 1, то функции возвращают NULL. Например:

SELECT ASIN (-1)
Результат: -1.5707963267949
SELECT ACOS (-1)
Результат: 3.14159265358979
SELECT ACOS (1.1)
Результат: NULL

Функция ATAN (x) вычисляет арктангенс числа x, т.е. возвращает величину, тангенс которой равен x. Пример:

SELECT ATAN (3);
Результат: 1.24904577239825

Для преобразования радиан в градусы и обратно используются функции DEGREES (x) и RADIANS (x) соответственно:

SELECT DEGREES (PI ())
Результат: 180
SELECT RADIANS (180)
Результат: 3.14

Случайные числа

Функция RAND (x) генерирует случайное значение в диапазоне от 0 до 1. Если указан аргумент x, то он используется как начальное значение этой величины. Пример:

SELECT RAND ();
Результат:0.472241415009636
SELECT RAND (0.5);
Результат: 0.943597390424144

На этом все. Вроде рассмотрел все часто используемые в SQL математические функции. Возможно вам будет интересно узнать и о функциях обработки строк в SQL.

Кроме типов данных Oracle7, PL/SQL поддерживает несколько дополнительных типов данных и позволяет использовать в своих конструкциях некоторые основные типы с большим диапазоном.

Рассмотрим подробнее типы данных TABLE и RECORD, позволяющие создавать одномерные массивы и записи, широко используемые в программах PL/SQL.

Таблицы PL/SQL

Для описания типа данных TABLE используется синтаксис:

TYPE type_name IS TABLE OF < column_type | variable%TYPE |

table.column%TYPE > [NOT NULL] INDEX BY BINARY_INTEGER;

Имя (например, name_plsql_table), которое описывается табличным типом данных, называется таблицей PL/SQL. Это описание, размещаемое в разделе DECLARE, имеет вид: name_plsql_table type_name;
Ссылки на строки таблицы PL/SQL осуществляются аналогично ссылкам на элементы одномерного массива: name_plsql_table(index), где index принадлежит типу BINARY_INTEGER. Например, для ссылки на третью строку в таблице PL/SQL «ename_tab» следует написать: ename_tab(3).

Для присвоения значения конкретной строке таблицы PL/SQL используется синтаксис: name_plsql_table(index) := expr;

Для ввода в таблицу PL/SQL значений из какого-либо столбца базовой таблицы или представления, а также для выборки значений из таблицы PL/SQL, необходимо использовать цикл.

Записи PL/SQL

Если создаваемая запись (sotr) соответствует описанию столбцов какой-либо базовой таблицы (например, kadry), то ее объявление можно осуществить в разделе DECLARE с помощью атрибута %ROWTYPE: sotr kadry%ROWTYPE;

В противном случае для объявления записи необходимо сначала определить ее тип данных. Для описания типа данных RECORD используется синтаксис:

При объявлении типа записи можно присвоить ее полям некоторые значения. Если же для поля вводится ограничение NOT NULL (для предотвращения назначения пустых значений), то этому полю надо обязательно присвоить значение. Например:

TYPE SotrRecTyp IS RECORD (nomer NUMBER(4) NOT NULL := 1001,

familiy CHAR(20), dolgnost CHAR(14), otdel NUMBER(3) := 102);

Объявление создаваемой записи (например, name_plsql_record) производится в разделе DECLARE и имеет вид: name_plsql_record type_name;
Ссылки на отдельные поля записи осуществляются так: name_plsql_record.field_name;
Для присвоения значения конкретному полю записи используется синтаксис: name_plsql_record.field_name := expr;

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

Переменные, константы и выражения PL/SQL

В программах PL/SQL могут использоваться переменные и константы, описываемые в разделе DECLARE с помощью конструкции вида: variable_name [CONSTANT] type_name [NOT NULL] [ < := | DEFAULT >expr ]
Например:

Запись опубликована 08.04.2010 в 5:50 дп и размещена в рубрике Oracle7 краткий справочник. Вы можете следить за обсуждением этой записи с помощью ленты RSS 2.0. Можно оставить комментарий или сделать обратную ссылку с вашего сайта.


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

1- Введение

PL/SQL (Procedural Language/Structured Query Language) это процедурно-ориентированный язык программирования использующийся для Oracle SQL. Является расширением Oracle SQL.

PL/SQL включает компоненты процедурно-ориентированного языка включая условие и цикл. Он позволяет объявлять константы и переменные, процедуры и функции, виды данных и переменные видов данных, и trigger. Он может обрабатывать исключения (ошибки времени запуска) Массив так же поддерживается для использования коллекций в PL/SQL. От версии 8 и далее он включает объектно-ориентированные функции. Может создать такие единицы PL/SQL как процедуры, функции, пакеты, виды данных, triggers, которые хранятся в базе данных для переиспользования приложением, чтобы взаимодействовать с приложениями Oracle.

Примечание: В следующих изображениях я использую инструмент PL/SQL Developer версии 8.x, но нет отличия если вы используете PL/SQL Developer версии 10.x или другую версию.

2- Что нужно чтобы начать с PL/SQL?

Чтобы иметь быстрый доступ к PL/SQL вам нужен инструмент программирования. По моему опыту работы, вы можете использовать PL/SQL Developer, это визуальный инструмент для работы с Oracle и программирования PL/SQL.

Вы можете посмотреть инструкцию установки и конфигурации PL/SQL по ссылке:

3- Обзор PL/SQL

Есть некоторые определения, которые вы должные четко знать при программировании с PL/SQL:

  1. Каждая команда SQL заканчивается точкой с запятой (;)
  2. Команды "языка определения данных" (Data Definition Language - DDL) не используются в PL/SQL
  3. Команда SELECT.. INTO возврщает много строк создающих exception ( > 1 строки).
  4. Команда SELECT .. INTO не возвращает строки создающие exception
  5. Команды "языка манипулирования данными" (Data Manipulation Language - DML) может подействовать на многие строки данных.
  6. Использовать оператор := чтобы дать значение переменной.

PL/SQL организован по блокам команд. Один блок команды может содержать подблок команд внутри.

4- Базовые команды PL/SQL

Здесь я представляю обзор команд PL/SQL. Вы поймете больше через примеры в следующих частях.

4.1- Команда If-elsif-else

4.2- Не предопределенный цикл (LOOP)

4.3- Предопределенный цикл (FOR LOOP)

4.4- Цикл while (WHILE)

5- Начать с PL/SQL используя PL/SQL Developer

Для начала вам нужно открыть PL/SQL Developer, и войти как пользователь learningsql:


В PL/SQL Developer создать новое окно SQL:




Кликните на иконку

Читайте также: