- •2 Order by deptno;
- •3 Order by deptno;
- •10 Clark 2450
- •20 Smith 800
- •8 Row selected
- •11/05/2003 Main report Page: 1
- •Функции pl/sql
- •Insert into purchase values (‘Prod_1’, 10, sysdate, ’sh’);
- •Insert into purchase values (‘Prod_1’ ,10, sysdate-7,’sh’);
- •Iniтсaр(product_name)
- •2 Last_name,
- •20,’Dallas’,
- •30,’Chicago’,
- •40,’Boston’,
- •6 Rows selected.
- •Настройка среды sql*Plus
- •Файлы сценариев sql (скрипты)
- •Разновидности комментариев
- •16 Row selected
- •2 From emp, salgrade
- •4 And sal between losal and hisal;
- •Intersect
- •Union union at all
- •2 Union
- •4 Union
- •6 Minus
- •8 Order by 2,1;
- •Контрольные вопросы
2 Last_name,
3 hire_date,
4 LAST_DAY(hire_date)+1 INSURANCE_START_DATE
5 FROM person;
FIRST_NAME LAST_NAME HIRE_DATE INSURANCE
---------------- ----------------- --------- ----------
Charlene Atlas 01-FEB-02 01-MAR-02
Gary Anderson 15-FEB-02 01-MAR-02
Bobby Barkenhagen 28-FEB-02 01-MAR-02
Laren Baxter 01-MAR-02 01-APR-02
SQL>
Вложение функций для работы с датами
SQL>SELECT product_name,
2 quantity_on_hand,
3 last_stock_date,
4 LAST_DAY(ADD_MONTHS(last_stock_date,3))+1 RESTOCK_DATE
5 FROM product
6 WHERE quantity_on_hand <= 100
7 ORDER BY product_name;
PRODUCT_NAME QUANTITY_ON_HAND LAST_STOC RESTOCK_D
---------------------- ---------------- --------- ---------
Chrome Phoobar 100 15-JAN-03 01-MAY-03
Small Widget 1 15-JAN-03 01-MAY-03
Square Zinculator 1 09-JUL-00 01-NОV-00
SQL>
Пример решения проблемы с использованием TRUNC. Пусть были введены данные:
INSERT INTO product VALUES ‘Prod N’, 45, 1, SYSDATE);
SELECT * FROM product;
Однако, естественный запрос …
SELECT * FROM product
WHERE last_stock_date = ‘dd-mm-yy’; -- сегодняшняя дата
… не дал никаких результатов. Их нет потому, что данные типа DATEсодержат не только дату, но и время. Решение проблемы:Нужно усечь время.
Либо в запросе:
SELECT * FROM product
WHERE TRUNC(last_stock_date) = ‘dd-mm-yy’; -- сегодняшняя дата
Либо в БД:
DELETE FROM product
WHERE product_name = ‘Prod N’;
INSERT INTO product VALUES ‘Prod N’, 45, 1, TRUNC(SYSDATE));
Тогда данные будут получены при обычном запросе:
SELECT * FROM product
WHERE last_stock_date = ‘dd-mm-yy’; -- сегодняшняя дата
Числовые функции
ROUND(число, точность) – округляет число до точности (число знаков после запятой). Точность – целое число, если она с минусом, то округляется указанное число целочисленных разрядов.
TRUNC(число, точность) – урезает число до числа знаков после запятой (точности). Точность – целое число, если она с минусом, то округляется указанное число целочисленных разрядов.
MOD(число, мода) – вычисляет остаток от деления числа на моду.
Примеры.
TRUNC (100.567,1);
ROUND (999,-3);
Другие однострочные функции
NVL(входное_значение, результат_если_null) – присваивает значение пустому полю.
NVL2(входное_значение, результат_если_не_null, результат_если_null) – присваивает заранее определённое значение полю.
COALESCE(выражение [,выражение] …) – возвращает первое встреченное неNULLзначение выражения в списке.
Это почти эквивалентно упрощённому поисковому CASE-выражению, гдеk-условием является – “k-выражение IS NOT NULL” . Эта функция может использоваться как расширение функцииNVLдля нескольких входных значений, однако тогда требуется, чтобы последнее выражение вCOALESCEи было бы тем самым возвращаемым не-NULLвыражением, иначе (если все выражения равныNULL) функция вернётNULL.
DECODE(источник_входных_данных,
входное_значение_1, выходное_значение_1,
входное_значение_2, выходное_значение_2,
. . . . . . .
последнее_входное_значение, последнее_выходное_значение,
[вых.значение_по умолчанию_при_отсутствии_совпадений]
)
Это почти эквивалентно простому CASE-выражению (и похоже на множество вложенных конструкцийIF-THEN-ELSE).
Пример для NVL.
SELECT ename, sal+comm FROM emp;
Может ничего не выдать, если comm=NULL.
Чтобы в этом случае был выдан 0, нужен оператор
SELECT ename, sal+NVL(comm,0) FROM emp;
Обратите внимание, что если нужно выдать содержимое не текстового поля (числового или даты), при этом заменяя отсутствующие значения на некоторый условный знак (например, “N/A”), то не пройдёт очевидное решение:
SELECT ename, NVL(sal, “N/A”) “Sales”
FROM emp;
Поскольку в одном и том же поле окажутся и числа и текст.
Решение состоит в следующем:
SELECT ename, NVL(TO_CHAR(sal), “N/A”) “Sales”
FROM emp;
Пример для DECODE.
SELECT ename, DECODE(deptno,10,’New York’,