Oracle SQL

Фильтр по тегу: sql


SERIALIZABLE режим

Чалышев Максим Михайлович
В СУБД ORACLE есть возможность, чтобы пользователь всегда видел только те данные в таблицах, которые были доступны с начала его сессии
Такой режим (уровень изоляции) называется SERIALIZABLE. Для того чтобы включить этот режим используется команда

Alter session set isolation_level=serializable;

Следующий пример показывает отличие режима SERIALIZABLE от стандартного режима эксплуатации СУБД. Уровня изоляции READ COMMITTED
Откроем в двух разных окнах программу SQL Developer (или создадим новый Worksheet) подключимся к схеме SYS как администратор.
создадим таблицу man5
Create table Man5(prt number, name varchar2(50));



INSERT INTO man5 VALUES(20, 'Олег');
INSERT INTO man5 VALUES(21, 'Влад');
INSERT INTO man5 VALUES(22, 'Саша');
Commit;


читать дальше...
добавлено: 18 фев 19 просмотры: 623, комментарии: 0



Контекст сеанса

Чалышев Максим Михайлович
Введение
В каждой сессии есть возможность использовать специальные структуры данных, именуемые контекст.
Контексты - это набор данных вида - параметр значение. Контекст предоставляет дополнительные возможности для приложений, использующих СУБД Oracle.
Теория и практика
Контекст - это предопределённый набор параметров и значений создаваемый в рамках определенной сессии. Несколько таких наборов параметр значение, объединяется с помощью структуры называемой контекстом.

Задается значение контекста с помощью процедуры DBMS_SESSION.SET_CONTEXT

Функция SYS_CONTEXT позволяет получить значение заданного контекста в раках сессии.
Для создания контекста специальная команда CREATE CONTEXT.
Сначала следует создать специальною процедуру для управления контекстом.

CREATE OR REPLACE PROCEDURE set_mycontext_value ( par IN VARCHAR2, val IN VARCHAR2 ) 
AS BEGIN  DBMS_SESSION.SET_CONTEXT ( 'myctx', par, val ); END;

CREATE OR REPLACE CONTEXT myctx USING set_mycontext_value;

читать дальше...
добавлено: 18 фев 19 просмотры: 463, комментарии: 0



Планировщик JOB заданий. Управление.

Чалышев Максим Михайлович
Введение
В Oracle есть специальный механизм запланировать выполнение определённой программы, на заданное время, это может быть оператор SQL, программа на языке PLSQL, либо даже внешняя программа. Этот механизм называется механизмом заданий Job

Данный механизм может применяться, например, для планирования запуска тяжелых запросов в ночное время или на выходные дни, распределения задач построения отчетности.

Теория и практика

Для управления заданиями в Oracle существует специальные пакет DBMS_JOB:
Создание заданий
Можно использовать механизм dbms_job
Или механизм dbms_scheduler – более современный способ
DBMS_JOB.SUBMIT(
 JOB OUT BINARY_INTEGER,
 WHAT IN VARCHAR2,
 NEXT_DATE IN DATE DEFAULT SYSDATE,
 INTERVAL IN VARCHAR2 DEFAULT NULL,
 NO_PARSE IN BOOLEAN DEFAULT FALSE,
 INSTANCE IN BINARY_INTEGER DEFAULT any_instance,
 FORCE IN BOOLEAN DEFAULT FALSE
);


Здесь:
JOB – Входной параметр уникальный идентификатор задания. Идентификатор генерируется специальной системной последовательностью.
WHAT - анонимный PL/SQL блок, в данном блоке указывается последовательность команд которая будет выполнена в процессе работы задания.
В же в этом параметре можно также писать команды вставки удаления редактирования (inser update delete), а так же команды для создания создания индексов таблиц, создания индексов, ограничений.
NEXT_DATE – дата время следующего выполнения задания.
Если будет указана дата меньше чем текущую дата, то выполнение задания будет начато немедленно.
INTERVAL – Вычисляемая дата следующего выполнения задания в столбце NEXT_DATE. Примеры интервала задания:
NULL
Задание выполнится однократно и удалится.
читать дальше...
добавлено: 18 фев 19 просмотры: 476, комментарии: 0



Быстрая очистка таблиц и EXECUTE IMMEDIATE.

Чалышев Максим Михайлович
Введение
Для быстрой очистки таблиц в Oracle применяется специальный оператор TRUNCATE TABLE.
Данный оператор является оператором DDL, оператором мгновенного выполнения и поэтому для его вызова нам потребуется оператор динамического SQL.
Динамический SQL используется в ORACLE с помощью команды EXECUTE IMMEDIATE
Теория и практика
Оператор EXECUTE IMMEDIATE выполняет динамический оператор SQL или анонимный PL / SQL блок. В нашем случае мы будем использовать EXECUTE IMMEDIATE для работы с TRUNCATE TABLE.
Текст динамического SQL заключается в кавычки.
Оператор TRUNCATE TABLE используется для быстрого удаления всех записей из таблицы в Oracle. По результату аналогичен DELETE, без условий WHERE, но выполняется гораздо быстрее.
Синтаксис
TRUNCATE TABLE table_name
  [ PRESERVE MATERIALIZED VIEW LOG | PURGE MATERIALIZED VIEW LOG ]
  [ DROP STORAGE | REUSE STORAGE ] ;

читать дальше...
добавлено: 18 фев 19 просмотры: 442, комментарии: 0



Внешние таблицы External Table

Чалышев Максим Михайлович
Внешние таблицы – специальный механизм Oracle СУБД с помощью которого можно обращаться в данным , хранящимся в файлах вне базы данных как к обычным таблицам.

Для загрузки данных могут использоваться команды драйвера OracleLoader. В ExternalTable не могут применяться операторы изменения данных (DELETE INSERT UPDATE MERGE).

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

Все это делает механизм внешних таблиц особенно эффективным для проектов DWH(хранилищ данных) , при формировании ETL(процедур загрузки) для данных.

Теория и практика

Предположим, у нас есть несколько файлов заданного формата, файлы расположены в каталоге temp на диске c:
Необходимо подключить эти файлы как внешние таблицы к экземпляру нашей базы данных.

Название файлов city.csv и man.csv, кодировка UTF8 - ниже представлено содержание этих файлов текстовом виде.

city.csv

1,Москва,10000000
2,Владимир,500000
3,Орел,300000
4,Курск,200000
5,Казань,2000000
7,Котлас,110000
8,Мурманск,400000
9,Ярославль,500000 

man.csv
9152222221,Андрей,Николаев,1,22
9152222222,Максим,Москитов,1,31
9153333333,Олег,Денисов,3,34
9173333334,Алиса,Никифорова,4,31
9173333335,Таня,Иванова,4,31
9213333336,Алексей,Иванов,7,25
9213333331,Андрей,Некрасов,2,27
9213333332,Миша,Рогозин,2,21
9214444444,Алексей,Галкин,1,38

Вы можете создать эти файлы сами с помощью любого текстового редактора. Напоминаю, что кодировка файлов UTF8.
Перед использованием внешних таблиц необходимо создать специальный объект directory указывающий на каталог, где расположены файлы для внешних таблиц

CREATE OR REPLACE DIRECTORY ext_tab_data AS 'c:/temp';

Здесь
• ext_tab_data – название объекта directory
• AS 'c:/temp' – каталог, где расположены файлы для формирования внешних таблиц.
Далее формируем временные таблицы
Создаем таблицу для файла city.csv
читать дальше...
добавлено: 18 фев 19 просмотры: 442, комментарии: 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 просмотры: 6425, комментарии: 5



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

Учебный тренинг. 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 просмотры: 3960, комментарии: 0



Создание табличной (pipelined) функции с помощью динамического SQL запроса в ORACLE

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

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

select o.OBJECT_NAME, o.OBJECT_TYPE from all_objects o
 where upper(object_name) like upper('t%') and rownum < 35


Определим типы возвращаемых данных
читать дальше...
добавлено: 19 июн 15 просмотры: 4700, комментарии: 0



Множественный UPDATE

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

изучаем SQL группа в контакте - присоединяйтесь


Итак, небольшая заметка по операторы UPDATE
предположим что нам необходимо заменить значения в таблице 1 , данными из таблицы 2
можно конечно написать что то вроде
update t1 set t1.f1=select t2.f1 from t2 where t2.key1 = t1.key

но у нас есть более легкий способ произвести подобную операцию
UPDATE
(
SELECT
       t.c1,
       t.c2,
       s.c1 AS c1_new,
       s.c2 AS c2_new
 
FROM table1 t
INNER JOIN table2 s ON s.key=t.key
)
tt
SET tt.c1=tt.c1_new, tt.c2=tt.c2_new


Где table1, table2 это
То есть на основании данных из одной таблицы мы обновляем данные в другой таблице, важно наличие первичного ключа в каждой из представленных таблиц
приведем пример демонстрирующий работу UPDATE с несколькими таблицами

create table PHONES1
(
  PHONENUM VARCHAR2(48) not null primary key,
  NAME VARCHAR2(48)
);

create table PHONES
(
  PHONENUM VARCHAR2(48) not null primary key,
  NAME VARCHAR2(48)
);


заполним данными и выполним UPDATE
INSERT INTO PHONES1(PHONENUM, name) values ('495 1211133','Алексеев1');
INSERT INTO PHONES1(PHONENUM, name) values ('499 3311133','Михайлов1');
INSERT INTO PHONES1(PHONENUM, name) values ('917 12122sd3','Коробочкин1');
INSERT INTO PHONES1(PHONENUM, name) values ('499 33111133','Костин1');

INSERT INTO PHONES(PHONENUM, name) values ('495 1211133','Алексеев');
INSERT INTO PHONES(PHONENUM, name) values ('499 3311133','Михайлов');
INSERT INTO PHONES(PHONENUM, name) values ('917 12122sd3','Коробочкин');
INSERT INTO PHONES(PHONENUM, name) values ('499 33111133','Костин');
INSERT INTO PHONES(phonenum, name) values ('214 331das1133','Докучаев');

UPDATE (SELECT   t.phonenum AS phonenum1,       t.phonenum phonenum2,        s.name AS name1, t.name AS name_new FROM phones1 t
INNER JOIN phones s ON s.phonenum=t.phonenum )  Tt SET tt.name1=tt.name_new

результат - обновление данных в phones из таблицы phones1
добавлено: 08 апр 15 просмотры: 4604, комментарии: 3



SQL и биржевой график (Основные показатели фондового рынка)

Чалышев Максим Михайлович
Основные показатели рынка, рыночные свойства
публикация третья

Чалышев М.М www.orasource.ru
изучаем SQL группа в контакте - присоединяйтесь
Учебный тренинг. SQL от новичка до профессионала.
Бесплатные авторские видеокурсы SQL, PLSQL, JAVA

1. SQL и биржевой график. Получение истории котировок с сервиса РБК
2. SQL и биржевой график. Зачем нужна СИСТЕМА
3. SQL и биржевой график. Основные показатели фондового рынка
4. SQL и биржевой график. Анализ рыночных показателей
5. SQL и биржевой график. Создание торговой системы
6. SQL и биржевой график. Анализ эффективности торговой стратегии
7. SQL и биржевой график. Оптимизация торговой системы + Управление капиталом = 41% годовых
8. SQL и биржевой график. Бонус. Торговая система, которая принесла ее создателю миллиард долларов

Исходные тексты, архив

Итак, у нас имеются история цен, по самым ликвидным акциям,
(где взять историю цен как, как заполнить таблицу истории из сервиса РБК я рассказал в предыдущей статье)
У финансовых рынков существует несколько очень интересных технических свойств , неэффективностей, которые позволяют инвестору рассчитывать на финансовый выигрыш.

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

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