Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СУБД Oracle / Лекции / Лек_ORAC / L89 / Формирование отчетов в SQL-PLUS.doc
Скачиваний:
49
Добавлен:
16.04.2013
Размер:
205.82 Кб
Скачать

Функции pl/sql

  • Многострочные– применяются к группам строк

  • Однострочные– применяются к отдельным строкам

    • Системные переменные– создаютсяOracleи содержат информацию о среде, в которой функционирует БД.

    • Символьные– позволяют преобразовать символьные строки в числовые форматы или форматы дат

    • Календарныефункции – используются для обработки сравнения и выполнения вычислений с датами

    • Числовыефункции – некоторые операции над числами

    • Прочие однострочные функции

Системные переменные

  • SYSDATE

Insert into purchase values (‘Prod_1’, 10, sysdate, ’sh’);

Insert into purchase values (‘Prod_1’ ,10, sysdate-7,’sh’);

INSERT INTO purchase VALUES (‘Prod_1’, 10, sysdate+7,’SH’);

  • USER

SELECT USER FROM DUAL; --увидите своё зарегистрированное имя

  • USERENV

SELECT USERENV(‘TERMINAL’) FROM DUAL; -- увидите имя своего

-- компьютера

Символьные функции

UPPER(исх.текст) – возвращает текст большими буквами («исходный текст» - это может быть и имя поля, и выражение)

LOWER(исх.текст) – возвращает текст маленькими буквами

INITCAP(исх.текст) – возвращает текст, где каждое слово начинается с большой буквы

CONCAT(исх.текст1, исх.текст2) – сцепка строк, аналогична операции “||

INSTR(исх.текст, текст_для_поиска, позиция_начала_поиска) – возвращает позицию, с которой в исходном тексте встречается текст для поиска.

SUBSTR(исх.текст, позиция_начального_символа, кол-во_символов) – возвращает вырезку из исходного текста, заданной длины и с заданной позиции.

LENGTH(исх.текст) – возвращает длину исходного текста.

LPAD(исх.текст, длина), RPAD(исх.текст, длина) – фиксация ширины текста (за счёт добавления или отрезания)

LTRIM(исх.текст),RTRIM(исх.текст)– урезает у исходного текста все пробелы с левой или правой стороны.

Примеры выполнения функций UPPER,LOWERиINITCAP

SELECT UPPER(product_name) FROM product;

SELECT LOWER(product_name) FROM product;

SELECT INITCAP(product_name) FROM product;

SQL> SELECT UPPER(product_name) FROM product;

UPPER(PRODUCT_NAME)

---------------------------

SMALL WIDGET

MEDIUM WODGET

CHROME РНООBAR

ROUND CHROME SNAPHOO

EXTRA HUGE MEGA РНООВAR +

SQL> SELECT LOWER(product_name) FROM product;

LOWER(PRODUCT_HAME)

---------------------------

small widget

medium wodget

chrome phoobar

round chrome snaphoo

extra huge mega phoobar +

SQL> SELECT INITCAP(product_name) FROM product;

Iniтсaр(product_name)

---------------------------

Small Widget

Medium Wodget

Chrome Phoobar

Round Chrome Snaphoo

Extra Huge Mega Phoobar +

SQL>

Пример использования функции LENGTH

SELECT product_name, LENGTH (product_name) NAME_LENGTH

FROM product

WHERE LENGTH(product_name) > 15

ORDER BY product_name;

Разбор данных с использованием функции SUBSTR

SQL> SELECT SUBSTR (item_id, 1, 2) MFGR_LOCATION,

2 SUBSTR (item_id, 4, 3) ITEM_NUMBER,

3 item_desc

4 FROM old_item

5 ;

MF ITE ITEM_DESC

-- --- -------------------------

LA 101 Can, Small

LA 102 Can, Large

LA 103 Bottle, Small

LA 104 Bottle, Large

NY 101 Box, Small

NY 102 Box, Large

NY 103 Shipping Carton, Small

NY 104 Shipping Carton, Large

8 rows selected.

SQL>

Результаты, возвращаемые функцией INSTR

SQL> SELECT item_desc,

2 INSTR(item_desc,

3 ',',

4 1

5 )

6 FROM old_item;

ITEM_DESC INSTR(ITEM_DESC,’,’,1)

----------------------- ----------------------

Can, Small 4

Can, Large 4

Bottle, Small 7

Bottle, Large 7

Box, Small 4

Box, Large 4

Shipping Carton, Small 16

Shipping Carton, Large 16

8 rows selected.

SQL>

Выделение подстроки переменной длины

SQL> SELECT item_desc,

2 SUBSTR(item_desc,

3 1 ,

4 INSTR(item_desc,

5 ',',

6 1

7 ) - 1

8 )

9 FROM old_item;

ITEM_DESC SUBSTR(ITEM_DESC,1,INSTR(

----------------------- -------------------------

Can, Small Can

Can, Large Can

Bottle, Small Bottle

Bottle, Large Bottle

Box, Small Box

Box, Large Box

Shipping Carton, Small Shipping Carton

Shipping Carton, Large Shipping Carton

8 rows selected.

SQL>

Разбор на несколько строк переменной длины (с созданием заголовков)

SQL> SELECT item_desc,

2 SUBSTR(item_desc,

3 1,

4 INSTR(item_desc,

5 ',',

6 1

7 ) - 1

8 ) CATEGORY,

9 SUBSTR(item_desc,

10 INSTR(item_desc,

11 ',',

12 1

13 ) + 2,

14 99

15 ) ITEM_SIZE

16 FROM old_item;

ITEM_DESC CATEGORY ITEM_SIZE

----------------------- ---------------- ----------------------

Can, Small Can Small

Can, Large Can Large

Bottle, Small Bottle Small

Bottle, Large Bottle Large

Box, Small Box Small

Box, Large Box Large

Shipping Carton, Small Shipping Carton Small

Shipping Carton, Large Shipping Carton Large

8 rows selected.

SQL>

При простой конкатенации строк отчёт получается не очень красивым:

SQL> SELECT 'Item ' ||

2 item_id ||

3 ' is described as a ' ||

4 item_desc ||

5 '.' "Item Description Sentence"

6 FROM old_item;

Item Description Sentence

------------------------------------------------------------------

Item LA-101 is described as a Can, Small .

Item LA-102 is described as a Can, Large .

Item LA-103 is described as a Bottle, Small .

Item LA-104 is described as a Bottle, Large .

Item NY-101 is described as a Box, Small .

Item NY-102 is described as a Box, Large .

Item NY-103 is described as a Shipping Carton, Small .

Item NY-104 is described as a Shipping Carton, Large .

8 rows selected.

SQL>

Лишние пробелы можно убрать с помощью функций типа “xTRIM”

SQL> SELECT 'Item ' ||

2 RTRIM (item_id) ||

3 ' is described as a ' ||

4 RTRIM (item_desc) ||

5 '.' "Item Description Sentence"

6 FROM old_item;

Item Description Sentence

------------------------------------------------------------------

Item LA-101 is described as a Can, Small.

Item LA-102 is described as a Can, Large.

Item LA-103 is described as a Bottle, Small.

Item LA-104 is described as a Bottle, Large.

Item NY-101 is described as a Box, Small.

Item NY-102 is described as a Box, Large.

Item NY-103 is described as a Shipping Carton, Small.

Item NY-104 is described as a Shipping Carton, Large.

8 rows selected.

SQL>

Символьные функции преобразования типов

TO_NUMBER(исх.текст) – преобразует в действительное число, числовое значение хранящееся в исходном текстовом поле

TO_CHAR(входное_значение, код_формата) – преобразует дату, время или число в текст.

TO_DATE(входное_значение, код_формата) – преобразует текстовое представление даты и/или времени в действительное значение даты/времени.

Элементы кода формата даты и времени для функции TO_CHAR

Элемент

Значение

AD

A.D.

Обозначение года новой эры (с точками или без точек)

AM

A.M.

Обозначение времени до полудня (с точками или без точек)

BC

B.C.

Обозначение года до новой эры (с точками или без точек)

CC

SCC

Век (для четырёхзначного года); в варианте с “S” даты до н.э. предваряются знаком “-“

D

День недели (1-7)

DAY

Название дня недели, дополненное пробелами до 9 символов

DD

День месяца (1-31)

DDD

День года (1-366)

DY

Сокращённое название дня недели

E

Сокращённое название эпохи (для восточных календарей)

EE

Полное название эпохи (для восточных календарей)

HH

Час дня (1-12)

HH12

Час дня (1-12)

HH24

Час дня (0-23)

IW

Неделя года (1-53) согласно стандарту ISO

IYYY

Четырехзначный год согласно стандарту ISO

IYY

IY

I

Последние цифры (три, две или одна) года, согласно стандарту ISO

J

Юлианский день; количество дней прошедших с 1 января 4712 г. до н.э. Число с этим спецификатором должно быть целым.

MI

Минуты (0-59)

MM

Месяц (01-12; январь=01)

MON

Сокращённое название месяца

MONTH

Название месяца, дополненное пробелами до 9 символов.

PM

P.M.

Обозначение времени после полудня (с точками или без точек)

Q

Квартал года (1,2,3,4; январь-март = 1)

RM

Римский номер месяца (I-XII; январь =I)

RR

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

RRRR

На входе допустимы четыре или две цифры. Для двух цифр результат тот же, что и для RR.

SS

Секунды (0-59)

SSSSS

Секунды от полуночи (0-86399)

WW

Неделя года (1-53), где первая неделя начинается в первый день года и продолжается до седьмого дня года.

W

Неделя месяца (1-5), где первая неделя начинается в первый день месяца и продолжается до седьмого дня месяца

Y,YYY

Год с запятой в указанной позиции

YEAR

SYEAR

Год в буквенном написании; в варианте с “S” даты до н.э. предваряются знаком “-“

YYYY

SYYYY

Год из четырёх цифр; в варианте с “S” даты до н.э. предваряются знаком “-“

YYY

YY

Y

Последние цифры года (три, две или одна)

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

SP

Преобразует число в количественное числительное. DDSP  ONE, TWO, FOUR.

TH

Преобразует число в его порядковую версию. DDTH 

1TH, 2TH, 4TH.

SPTH

Преобразует число в порядковое числительное. DDSPTH  FIRST, SECOND, FOURTH.

Пример.

TO_CHAR (hiredate, ‘MM/DD/YY’)

Схема расчета века для спецификатора RR. Указывает, к какому веку относится год, заданный последними цифрами.

Последние цифры текущего года

Последние цифры заданного года

От 0 до 49

От 50 до 99

От 0 до 49

Текущий век

Следующий век

От 50 до 99

Предыдущий век

Текущий век

При преобразовании чисел в строку используются те же самые форматы, что и в операторе COLUMNFORMAT, за исключением “Ann”.

Пример.

TO_CHAR (price, ‘$9,999.00’)

Для функции TO_DATEэлементы кода формата такие же, за исключением того, что нет форматов:CC/SCC,E/EE,HH12,IW,IYYYI,Q,YEAR/SYEAR.

Пример.

TO_DATE(sysdate, ‘HH/MM/SS : SSSSS’)

Что делает следующий пример:

SELECT INITCAP(RTRIM(TO_CHAR(SYSDATE,‘MONTH’))) || ‘ ’

|| LOWER(TO_CHAR(SYSDATE, ‘DDTH’)) FROM DUAL;

Если это трудно понять посмотрим его по шагам назад:

SELECT INITCAP(RTRIM(TO_CHAR(SYSDATE,‘MONTH’))) || ‘ ’

|| TO_CHAR(SYSDATE, ‘DDTH’) FROM DUAL;

SELECT RTRIM(TO_CHAR(SYSDATE, ‘MONTH’)) || ‘ ’

|| TO_CHAR(SYSDATE, ‘DDTH’) FROM DUAL;

SELECT TO_CHAR(SYSDATE, ‘MONTH’)

|| TO_CHAR(SYSDATE, ‘DDTH’) FROM DUAL;

Календарные функции

ADD_MONTHS (начальная_дата, количество_месяцев) – возвращает дату с тем же днём месяца, что и в исходной дате, но отнесённую на заданное количество месяцев в будущее или прошлое.

MONTHS_BETWEEN(конечная_дата, начальная_дата) – интервал в месяцах между двумя датами

NEXT_DAY (date, dw) – возвращает дату, соответствующую дню недели (указанному параметромdw), которые следует за датой, указанной параметромdate.

LAST_DAY(date) – возвращает дату последнего дня месяца, на который приходится указанная дата date.

ROUND(date[, ‘date_format’]) – округление даты с точностью, заданной параметром ‘date_format’, если точность не задана, то округляется до суток. Формат даты аналогичен функцииTO_DATE.

TRUNC(date[, ‘date_format’]) – усечение даты с точностью, заданной параметром ‘date_format’, если точность не задана, то усекается до суток.

Примеры использования функции ADD_MOUNTHS:

SQL> SELECT ADD_MONTHS('28-NOV-00', 1) FROM DUAL;

ADD_MONTH

---------

28-DEC-00

SQL> SELECT ADD_MONTHS('29-NOV-00', 1) FROM DUAL;

ADD_MONTH

---------

29-DEC-00

SQL> SELECT ADD_MONTHS('30-NOV-00', 1) FROM DUAL;

ADD_MONTH

---------

31-DEC-00

SQL> SELECT АDD_MОNТНS('31-DЕС-00', -1) FROM DUAL;

ADD_MONTH

---------

30-NOV-00

SQL>

Использование функции LAST_DAY для определения первого дня следующего месяца:

SQL> SELECT first_name,

Соседние файлы в папке L89