Oracle SQL


Обновление данных WHERE CURRENT OF

Учебный тренинг. SQL от новичка до профессионала.
Бесплатные авторские видеокурсы SQL, PLSQL, JAVA

Если вы используете для обновления или удаления данных курсор select for update, то использование WHERE CURRENT OF
в этом случае наиболее удобно.
Выражение CURRENT как показано используется после конструкции WHERE и имеет следующий синтаксис
UPDATE имя таблицы
  SET обновляемые поля и значения
  WHERE CURRENT OF имя курсора;

для обновления данных

Рассмотрим несколько примеров:
подготовим тестовые данные
create table tab11 as select * from all_objects where rownum < 25;


обновление данных с использованием WHERE CURRNT OF
declare 
    cursor C is
    select *
      from tab11 t
     FOR UPDATE OF object_name, owner; 
begin
  FOR i in C loop
   update tab11 set object_name = 'update1' , owner = 'OW'  
   where current of C;
  end loop; 
  commit;  
end;


таким образом, мы, обновляем каждую запись нашего курсора заданным значением.
добавлено: 13 мар 17 просмотры: 3503, комментарии: 0



простой и элегантный способ вставки записей в таблицу без перечисления полей

Учебный тренинг. SQL от новичка до профессионала.
Бесплатные авторские видеокурсы SQL, PLSQL, JAVA

для демонстрации создадим некоторую таблицу на основе all_objects
 create table s_obj as select * from all_objects where rownum < 5

в данном случае таблица содержит 4 записи
с помощью инструкции PL SQL заполним данную таблицу следующим образом
begin
  for i in (select * from all_objects where rownum < 21) loop 
    i.object_name := 'prefix'||i.owner; --меняем данные перед вставкой
    insert into s_obj values i;
  end loop; 
end;

commit;
проверим
select * from s_obj
SYS	ICOL$ ...
SYS	I_USER1 ...
...
SYS	prefixSYS ...
SYS	prefixSYS ...
...


подобную методику вы сможете применять в своих функциях и процедурах pl sql
добавлено: 13 мар 17 просмотры: 3696, комментарии: 1



как размножить строки... cross join и connect by

Учебный тренинг. SQL от новичка до профессионала.
Бесплатные авторские видеокурсы SQL, PLSQL, JAVA

итак , нам необходимо размножить строки в некоторой таблице, на основе заданного запроса
пусть это будет следующий запрос
select object_name from all_objects where object_type = 'CLUSTER'

этот запрос вернет нам 10 строк , по условиям задачи необходимо повторить эти 10 строк по 10 раз

создадим таблицу с размноженными строками , здесь на поможет конструкция cross join и оператор иерархии connect by
вот скрипт создания такой таблицы:
 create table copy1 as select * from 
 (select level lnl from dual connect by level < 11) 
cross join (select object_name from all_objects where object_type = 'CLUSTER') 

где level < 11 количество вставляемых строк

подсчитаем количество строк в данной таблице
 select count(*) from copy1

-- 100 строк, все верно

продемонстрируем работу оператора insert применительно к данной задаче
очистим таблицу
delete from copy1;

произведем вставку
insert into copy1(lnl, object_name) 
select * from (select level lnl from dual connect by level < 11) cross join 
(select object_name from all_objects where object_type = 'CLUSTER')


посмотрим, что получилось
select object_name,count(1) from copy1 group by object_name

успех...
добавлено: 13 мар 17 просмотры: 3016, комментарии: 0



Использование типа Timestamp в oracle

Учебный тренинг. SQL от новичка до профессионала.
Бесплатные авторские видеокурсы SQL, PLSQL, JAVA

TIMESTAMP – специальный тип данных в oracle расширяющий возможности типа данных date

Представлен в трех вариантах:
timestamp
Год, месяц, часы , минуты , секунды

timestamp with local time zone
то же что и предыдущий тип данных, но дополнительно включает еще и следующие значения временных зон
time_zone_hour и time_zone_minute или же time_zone_region

timestamp with local time zone
тип данных со значением часового пояса

поля данных типа timestamp

Создадим таблицу c полями указанных типов
create table ttmstamp(t1 timestamp, t2 timestamp with time zone, t3 timestamp with local time zone);


Для работы с типом Timestamp существует специальная функция
CURRENT_TIMESTAMP, которая возвращает текущее время дата со значениями часового пояса заданного в параметрах сессии .
У данной функции нет параметров.
Пример использования
ALTER SESSION SET TIME_ZONE = '-3:0';

select CURRENT_TIMESTAMP from dual;


ALTER SESSION SET TIME_ZONE = '-4:0';
select CURRENT_TIMESTAMP from dual;

читать дальше...
добавлено: 13 мар 17 просмотры: 7365, комментарии: 0



Использование GUID в ORACLE

Учебный тренинг. SQL от новичка до профессионала.
Бесплатные авторские видеокурсы SQL, PLSQL, JAVA

GUID некоторая уникальная последовательность символов, в некоторых случаях, может использоваться в качестве первичного ключа.
Рассмотрим основные работы с GUID в ORACLE.

Получить GUID в ORACLE можно, воспользовавшись функцией
sys_guid()
запрос в этом случае будет выглядеть следующим образом
select sys_guid() from dual

результат
4A9B3CF364FB92CAE050A8C0670A0D3A
Для получения GUID в PL SQL используются несколько аналогичная команда
Следует так же отметить, что для ранения GUID в ORACLE используются следующие типы данных
raw(16) и varchar2(32);

следующие примеры демонстрируют работу c GUID в PL/SQL ORACLE
declare
  p_raw raw(16); 
begin
  p_raw := sys_guid;
  dbms_output.put_line(p_raw);
end;

результат 4A9B3CF3650092CAE050A8C0670A0D3A

declare
  p_vc2 varchar2(32);
begin
  p_vc2 := sys_guid;
  dbms_output.put_line(p_vc2);
end;

результат 4A9B3CF3652292CAE050A8C0670A0D3A
читать дальше...
добавлено: 13 мар 17 просмотры: 4200, комментарии: 2



Заливаем дамп с Oracle Enterprise на OracleXE

Учебный тренинг. SQL от новичка до профессионала.
Бесплатные авторские видеокурсы SQL, PLSQL, JAVA
в создании данного материала мне помог мой коллега Куракин Роман
в данном материале упоминается дамп для одной схемы, но, для нескольких схем, дамп заливается аналогично

1. Cнимаем дамп на источнике
#>expdp schemas=USER1 dumpfile=dampfiledat.dmp

(пользователь sys as sysdba пароль /)

Дамп будет создан в папке
  /ora_home/oracle/admin/orcl/dpdump/


2. Переносим дамп на компьютер, где установлен OraceXE в аналогичную папку
например
c:\oraclexe\app\oracle\admin\XE\dpdump\expdat.dmp для Windows
        или    /u01/app/oracle/admin/XE/dpdump/expdat.dmp для *nix 
систем

3. создаем пользователя на XE
create tablespace U_tbl datafile 'user1.dat' size 300M autoextend on;

create temporary tablespace U_TEMP tempfile 'U_temp.dat' size 600M autoextend on;

create user USER1 identified by password1 default tablespace U_tbl  temporary tablespace U_TEMP;

grant create session to USER1;

grant create table to USER1;

grant unlimited tablespace to USER1;

grant connect to USER1;

grant resource to USER1;

если необходимо 

grant dba to USER1;


4. Если пользователь уже существует и содержит старые данные то удаляем пользователя и создаем заново, табличное пространство пересоздавать не надо:

* drop user USER1 cascade;


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

#> impdp USER1/password1 schemas=USER1 dumpfile=expdat.dmp transform=SEGMENT_CREATION:N PARTITION_OPTIONS=MERGE
добавлено: 30 янв 17 просмотры: 1404, комментарии: 4



Анализ отчетов AWR

Учебный тренинг. SQL от новичка до профессионала.
Бесплатные авторские видеокурсы SQL, PLSQL, JAVA

Анализ отчетов AWR


1.Что такое AWR отчеты
2. Для чего используются AWR отчеты
3. Построение AWR отчетов
4. Системные представления AWR репозитория отчетов
5. AWR отчет в формате HTML
6. Основные параметры отчетов AWR
7. На что еще следует обратить внимание!

1. Что такое AWR отчеты

Automatic Workload Repository представляет из себя набор внутренних таблиц словаря данных БД Oracle и специальный фоновый процесс MMON, который появился в версии Oracle10g.
Периодически AWR создает статистическую копию (снимок) и сохраняет информацию в таблицах расположенных в табличном пространстве SYSAUX. По умолчанию регулярный период сбора установлен на 60 минут. Это значение может быть уменьшено до 10 минут при желании. Механизм сбора статистической копии (awr snapshot) установлен в базе данных 10G по умолчанию и в отличии от пакета statspack установки на автоматический сбор информации не требуется.

Скрипт формирования AWR заполняет специальный AWR репозиторий набор таблиц и представлений словаря данных Oracle помощью специального системного процесса NMON.


2.Для чего используются AWR отчеты

Automatic Workload Repository (AWR) используется для сбора статистики производительности, включая:

Время ожидания ресурсов базы данных (foreground и background wait events). Эту статистическую информацию можно использовать для первоначального определения 'узких' мест в производительности базы данных
читать дальше...
добавлено: 01 ноя 16 просмотры: 11219, комментарии: 0



Поиск известного значения в неизвестной базе...

Учебный тренинг. SQL от новичка до профессионала.
Бесплатные авторские видеокурсы SQL, PLSQL, JAVA

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

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

То есть, ты видишь на экране условное значение , необходимо разобраться , из каких таблиц и столбцов значение считывается.

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

Подготовим тестовые данные
create table t1(n number);
create table t2(n number);
create table t3(n number);
create table t4(n number);
insert into t1 select level from dual connect by level < 10;
insert into t2 select level from dual connect by level < 20;
insert into t3 select level from dual connect by level < 10;
insert into t4 select level from dual connect by level < 20;
commit;

соберем статистику по таблицам необходимой схемы
begin
 	dbms_stats.gather_schema_stats(ownname => 'TRADE', estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE, cascade=>FALSE);
end;

читать дальше...
добавлено: 21 окт 15 просмотры: 3196, комментарии: 0



Использование DBMS_METADATA

Учебный тренинг. SQL от новичка до профессионала.
Бесплатные авторские видеокурсы SQL, PLSQL, JAVA

Часто в работе возникают ситуации , когда необходимо посмотреть исходный код DLL обьека , а специальных графических средств нет под рукой
в этом нам поможет пакет DBMS_METADATA и метод GET_DDL
DBMS_METADATA.GET_DDL -- входные параметры
object_type - Тип обьека (TABLESPACE, CONSTRAINT , CONSTRAINT, Index)
name - Наименование обьекта например : USERS
schema - схема , по умолчанию схема сессии пользователя или SYS
приведем некоторые примеры

-- извлечь исходный код для табличного пространства USERS
select DBMS_METADATA.GET_DDL('TABLESPACE','USERS') from dual
/*
  CREATE TABLESPACE "USERS" DATAFILE 
  '/path/users01.dbf' SIZE 52000
  AUTOEXTEND ON NEXT 130000 MAXSIZE 32007M
  LOGGING ONLINE PERMANENT BLOCKSIZE 8192
  EXTENT MANAGEMENT LOCAL AUTOALLOCATE DEFAULT NOCOMPRESS SEGMENT SPACE MANAGEMENT AUTO
   ALTER DATABASE DATAFILE 
  '/path/users01.dbf' RESIZE 917504000
  */


-- извлечь исходный код для ограничения PK_EMP из схемы SCOTT
select DBMS_METADATA.GET_DDL('CONSTRAINT','PK_EMP','SCOTT') from dual
/*
  ALTER TABLE "SCOTT"."EMP" ADD CONSTRAINT "PK_EMP" PRIMARY KEY ("EMPNO")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS"  ENABLE 
*/


-- извлечь исходный код для таблицы EMP из схемы SCOTT
select DBMS_METADATA.GET_DDL('TABLE','EMP','SCOTT') from dual
/*
  CREATE TABLE "SCOTT"."EMP" 
   (	"EMPNO" NUMBER(4,0), 
	"ENAME" VARCHAR2(10), 
	"JOB" VARCHAR2(9), 
	"MGR" NUMBER(4,0), 
	"HIREDATE" DATE, 
	"SAL" NUMBER(7,2), 
	"COMM" NUMBER(7,2), 
	"DEPTNO" NUMBER(2,0), 
	 CONSTRAINT "PK_EMP" PRIMARY KEY ("EMPNO")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS"  ENABLE, 
	 CONSTRAINT "FK_DEPTNO" FOREIGN KEY ("DEPTNO")
	  REFERENCES "SCOTT"."DEPT" ("DEPTNO") ENABLE
   ) SEGMENT CREATION IMMEDIATE 
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS" 
 */
добавлено: 31 авг 15 просмотры: 2018, комментарии: 0



MODEL. SQL высший пилотаж. Часть 2. Сложные последовательности.

Учебный тренинг. SQL от новичка до профессионала.
Бесплатные авторские видеокурсы SQL, PLSQL, JAVA

Используем Model для создания массивов
-- создание одномерного массива
SELECT *
FROM dual
    MODEL DIMENSION BY (0 as т1)
    MEASURES (cast(dummy as varchar2(20)) as ct) 
    RULES (        
        ct[0] = '1',
        ct[1] = '2',       
        ct[1] = '3',
        ct[2] = '4',
        ct[3] = '5'
    ) order by 1;
--Т1	CT
--0	1
--1	3
--2	4
--3	5


читать дальше...
добавлено: 03 июл 15 просмотры: 3932, комментарии: 0