Oracle SQL
Отличие Oracle SQL и ANSI SQL
  • NULL значения

    В Oracle нельзя вставить пустую строку, так как она будет рассматриваться как NULL

  • Оператор UPDATE

    1.использование табличных алиасов для ссылок на обновляемую таблицу в подзапросах
    2.подзапросы в правой части предложения SET в отличие от только выражений в ANSI SQL
    3.список обновляемых колонок в левой части предложения SET, в отличии от одной колонки в ANSI SQL
    4.подзапросы в предложении SET или WHERE могут ссылаться на обновляемую таблицу
    5.Оператор UPDATE поддерживает обновление подзапросов
     UPDATE emp aaa 
    SET deptno    =(SELECT deptno FROM dept WHERE loc='Москва'),
    SET (sal,comm)=(SELECT 1.1*AVG(sal),1.5*AVG(comm)
    FROM emp bbb WHERE aaa.deptno=bbb.deptno)
    
  • Внешние соединения
    SELECT * FROM tab1 LEFT JOIN tab2 ON col1=col2  - аналогичен запросу:
    SELECT * FROM tab,tab2  WHERE col1=col2 (+)
    
    SELECT * FROM tab1 RIGHT JOIN tab2 ON col1=col2  - аналогичен запросу:
    SELECT * FROM tab,tab2  WHERE col1 (+)=col2 
    
  • Древовидные запросы
    SELECT LPAD(' ',2*(LEVEL-1)) || ename org_chart, empno,  mgr,  job
    FROM emp
    START WITH job = 'PRESIDENT'
    CONNECT BY PRIOR empno = mgr;
    ORG_CHART    EMPNO       MGR        JOB
    ------------ ----------  ---------- ---------
    KING         7839                   PRESIDENT
      JONES      7566        7839       MANAGER
        SCOTT    7788        7566       ANALYST
          ADAMS  7876        7788       CLERK
        FORD     7902        7566       ANALYST
          SMITH  7369        7902       CLERK
      BLAKE      7698        7839       MANAGER
        ALLEN    7499        7698       SALESMAN
        WARD     7521        7698       SALESMAN
  • Оператор SELECT

    1.NULL в списке выборки
    2.Запрос из запроса (SELECT FROM (SELECT….))
    3.Левая часть оператора IN может быть списком выражений в отличии от одиночного выражения в ANSI SQL
    4.Не только столбец, а любое выражение может быть использовано с оператором LIKE
    5.Любое выражение, а не только отдельный столбец может быть использован в операторах сравнения IS NULL и IS NOT NULL
    6.В предложении ORDER BY может быть использовано любое выражение содержащее любые столбцы любых таблиц предложения FROM в отличии от только имен, алиасов, номеров позиций столбцов списка выборки
    7.В предложении GROUP BY может быть использовано любое выражение содержащее любые столбцы любых таблиц предложения FROM в отличии от только имен, алиасов столбцов списка выборки
    8.Вложенные агрегатные функции MIN(MAX(col1)) (уровень вложенности не более 2)
CONDITIONS
Приоритет операций
  • Arithmetic operators
  • Concatention operator
  • Comparison conditions
  • IS NOT NULL, LIKE, NOT IN
  • NOT BETWEEN
  • NOT logical condition
  • AND logical condition
  • OR logical condition
A AND NULL
  • TRUE, NULL = NULL
  • FALSE, NULL = FALSE
  • NULL, NULL = NULL< /li >
A OR NULL
  • TRUE, NULL = TRUE
  • FALSE, NULL = NULL
  • NULL, NULL = NULL< /li >
LIKE:WHERE job_id LIKE '%SA\_%' ESCAPE '\';
JOINS
  • Equijoins - равенство в where
  • NonEquijoins - другая операция соединения
  • outer joins - для отображения рядов не удовлетворяющих условию. Таблица у колонки которой не стоит (+) будут отображены все записи
  • Self joins - соединение таблицы самой с собой

  • CROSS JOIN - каждая запись одной таблицы с каждой записью другой
  • NATUARAL JOIN - аналогично inner join, но связь по одноименным колонкам
  • JOIN table USING(column) - аналогично с указанием колонки
  • JOIN table ON condition - с указанием условия связи
  • LEFT JOIN table ON condition - все записи основной таблицы
  • RIGHT JOIN table ON condition - все записи связанной таблицы
  • FULL JOIN table ON condition - все записи обоих таблиц
CREATE USER, SCHEMA
логинишься как system/manager@your_db_alias и создаешь:
CREATE USER your_schema IDENTIFIED BY your_password 
  default tablespace STREAM_LOTTERY // tablespace для схемы
  temporary tablespace TEMP 
  profile DEFAULT 
  quota unlimited on STREAM_LOTTERY // права на tablespace
  quota unlimited on USERS; 
GRANT CONNECT TO your_schema;
Изменение пароля пользователем:
ALTER USER scott IDENTIFIED BY lion;
Security
GRANT:
ALTER USER scott IDENTIFIED BY lion;
GRANT priv[(columns)] ON object TO user|role|PUBLIC
[WITH GRANT OPTION];
GRANT SELECT,INSERT,UPDATE,DELETE (ALL)
ON object
TO role (user);
GRANT update(dep_id,loc_id)
ON depart
TO scott, manager;
REVOKE:
REVOKE priv|ALL
ON object
FROM user|role|PUBLIC
[CASCASE CONSTRAINTS];
Привелегии данные другому пользователю при этом так-же будут удалены.
CASCADE может быть использовано при удалении REFERENCES привилегии.
Контроль привелегий
Data Dictionary TableDescription
ROLE_SYS_PRIVS System privileges granted to roles
ROLE_TAB_PRIVS Table privileges granted to roles
USER_ROLE_PRIVS Roles accessible by the user
USER_TAB_PRIVS_MADE Object privileges granted on the user’s objects
USER_TAB_PRIVS_RECD Object privileges granted to the user
USER_COL_PRIVS_MADE Object privileges granted on the columns of the user’s objects
USER_COL_PRIVS_RECD Object privileges granted to the user on specific columns
USER_SYS_PRIVS Lists system privileges granted to the user
AGGREGATING

Список функций
AVG([DISTINCT|ALL]n) Среднее значение n, игнорирует NULL
COUNT(*|[DISTINCT|ALL]n) Число рядов, где n не NULL. * - Все ряды, включая NULL
MAX([DISTINCT|ALL]n) Максимальное значение n, игнорирует NULL
MIN([DISTINCT|ALL]n) Минимальное значение n, игнорирует NULL
STDDEV([DISTINCT|ALL]n)  Стандартное отклонение n, игнорирует NULL
SUM([DISTINCT|ALL]n) Сумма n, игнорирует NULL
VARIANCE([DISTINCT|ALL]n) Дисперсия n, игнорирует NULL
DISTINCT - исключает дублирующие значения

Наследование
SELECT MAX(AVG(salary)) FROM emp
GROUP BY department_id
-максимальная средняя зарплата по отделам.

Ограничения
SELECT job_id, SUM(salary) FROM
emp WHERE
job_id NOT LIKE '%REP%' GROUP
BY job_id HAVING
SUM(salary) >  13000
ORDER BY SUM(salary);
SUBQUERY ANY, ALL
ANY:
WHERE salary < ANY (...)
< - означает меньше максимума
> - означает больше минимума.

ALL:
WHERE salary < ALL (...)
< - означает меньше минимума
> - означает больше максимума.
TABLE
Создать таблицу из подзапроса
CREATE TABLE table
[(column,..)]
AS subquery;
Модификация таблицы
ALTER TABLE table
ADD (column datatype [DEFAULT expr],
...);

ALTER TABLE table
MODIFY (...);
Удаление, отключение колонок
ALTER TABLE table
DROP (column) [CASCADE CONSTRAINTS];

ALTER TABLE table
SET UNUSED (column);

ALTER TABLE table
DROP UNUSED COLUMNS;
Удаление, очистка таблицы
DROP TABLE table;

TRUNCATE TABLE table;
Переименование
RENAME table_old TO table_new;
Комментарий
COMMENT ON TABLE table
IS 'text';
VIEW
CREATE:
CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view
[(alias, alias)]
AS query
[WITH CHECK OPTION [CONSTRAINT constraint]]
[WITH READ ONLY [CONSTRAINT constraint]];
Constraints
Определение констрейна при создании таблицы
  
Column ...,
CONSTRAINT name constraint_type (column,..)
Типы констрейнов
NOT NULL
UNIQUE(column,...)
PRIMARY KEY(column,...)
FOREIGN KEY(column,...) REFERENCES table(column,...)
CHECK(condition)
Добавление
ALTER TABLE table
ADD [CONSTRAINT name] constraint_type (column,..)
Удаление
ALTER TABLE table
DROP CONSTRAINT name
Выключение
ALTER TABLE table
DISABLE|ENABLE CONSTRAINT name [CASCADE];
TRANSACTION
  • COMMIT - завершает транзакцию
  • SAVEPOINT name - фиксирует точку
  • ROLLBACK - откат всей транзакции
  • SEROLLBACK TO SAVEPOINT name - откат до точки
Примечания
  • Создание SAVEPOINT с таким же именем удаляет предыдущую точку
  • Авто commit - после DDL и DCL команд, выход из SQL PLUS
  • Авто rollback - после аварийного выхода из SQL PLUS
LOCK TABLE tbl
IN lockmode MODE [NOWAIT]
  • ROW SHARE
  • ROW EXCLUSIVE
  • SHARE UPDATE
  • SHARE
  • SHARE ROW EXCLUSIVE
  • EXCLUSIVE
External tables
CREATE DIRECTORY emp_dir AS '/flat_files'

CREATE TABLE oldemp (
empno NUMBER, empname CHAR(20), birthdate DATE)
ORGANIZATION EXTERNAL
(TYPE ORACLE_LOADER
DEFAULT DIRECTORY emp_dir
ACCESS PARAMETERS
(RECORDS DELIMITED BY NEWLINE
FIELDS TERMINATED BY ','
(empno CHAR,
empname CHAR,
birthdate CHAR date_format date mask "dd-mon-yyyy""))
LOCATION ('emp1.txt))
PARALLEL 5
REJECT LIMIT 200;
INDEX
CREATE INDEX name
ON table(column,...);
DEPENDENCIES
Просмотр
select * from user_dependencies
  • name, varchar2(30) - name of the object,
  • type, varchar2(17) - type of the object,
  • referenced_owner, varchar2(30) - owner of referenced object (remote owner if remote object),
  • referenced_name, varchar2(64) - name of referenced object,
  • referenced_type, varchar2(17) - type of referenced object,
  • referenced_link_name, varchar2(128) - name of dblink if this is a remote object,
  • schemaid, number
  • dependency_type
Для просмотра все цепочки следует загрузить скрипт ultdtree.sql. Теперь можно выполнить процедуру
DEPTREE_FILL('TYPE','OWNER','OBJECT')
после чего использовать view DEPTREE или IDEPTREE (то-же но с отступом).
Установка режима перекомпеляции для удаленных объектов
ALTER SYSTEM SET
REMOTE_DEPENDENCIES_MODE

ALTER SESSION SET
REMOTE_DEPENDENCIES_MODE
Значения
  • TIMESTAMP
  • SIGNATURE
Автоматическая перекомпиляция
  • Для локальных перед выполнением
  • Для зависимых от удаленных процедур при повторном выполнении
  • Для зависимых от удаленных таблиц и пр. перекомпиляция не производится
Явная перекомпилеяция
ALTER PROCEDURE name COMPILE
ALTER PACKAGE name COMPILE [PACKAGE]
ALTER PACKAGE name COMPILE BODY
ALTER TRIGGER name [COMPILE[DEBUG]]
TABELSPACE
  • Создаем
    CREATE TABLESPACE MYTAB 
      DATAFILE  '/usr/oracle/dbs/streams_tbs.dbf'
      SIZE 25M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED;
  • Удаляем
    ALTER TABLESPACE MYTAB OFFLINE;
    DROP TABLESPACE MYTAB including contents and datafiles;
  • Просмотр существующих
    select * from DBA_TABLESPACES;
    select * from DBA_DATA_FILES;
  • Перемещаем файл
    ALTER TABLESPACE MYTAB OFFLINE;
    ALTER TABLESPACE MYTAB 
    rename datafile '...dbf' to '...dbf';
    ALTER TABLESPACE MYTAB ONLINE;
  • Добавление файла
    ALTER TABLESPACE MYTAB
    add datafile '...dbf' size 100M autoextend on;
Перемещение таблиц и индексов на нужный tablespace:
DECLARE
  sql_text  VARCHAR2(1000);
BEGIN

  FOR rec IN (SELECT * FROM ALL_TABLES
           where owner= 'LOTTERY_LOCAL1' AND (tablespace_name is null OR NVL(tablespace_name,'') != 'STREAM_LOTTERY') ) 
  LOOP
      sql_text := 'ALTER TABLE LOTTERY_LOCAL1.' || rec.table_name || ' MOVE TABLESPACE ' || 'STREAM_LOTTERY';
      Dbms_Output.put_line( sql_text );

      begin
         EXECUTE IMMEDIATE sql_text;
      exception
        when others then
            Dbms_Output.put_line('Unknown error:(' || SQLCODE || ')' || SQLERRM);
      end;

  END LOOP;
END;

DECLARE
  sql_text  VARCHAR2(1000);
BEGIN

  FOR rec IN (SELECT * FROM ALL_INDEXES
           where owner= 'LOTTERY_LOCAL1' AND (tablespace_name is null OR NVL(tablespace_name,'') != 'STREAM_LOTTERY') ) 
  LOOP
      sql_text := 'ALTER INDEX LOTTERY_LOCAL1.' || rec.index_name || ' REBUILD TABLESPACE ' || 'STREAM_LOTTERY';
      Dbms_Output.put_line( sql_text );

      begin
            EXECUTE IMMEDIATE sql_text;
            Dbms_Output.put_line(sql_text);
      exception
        when others then
            Dbms_Output.put_line('Unknown error:(' || SQLCODE || ')' || SQLERRM);
      end;

  END LOOP;
END;
AUDIT
  • Установка параметра
    alter system set AUDIT_TRAIL='DB' SCOPE=spfile;
  • Назначение аудита для объекта:
    AUDIT INSERT,UPDATE,DELETE 
    ON object
    BY ACCESS
    WHENEVER SUCCESSFUL;
  • Назначение аудита для сессии:
    AUDIT SESSION WHENEVER SUCCESSFUL;
  • Просмотр
    select * from AUD$;
    select * from DBA_AUDIT_OBJECT;
    select * from DBA_AUDIT_SESSION;
Hosted by uCoz