Copyright © 2016, Oracle and/or its affiliates. All rights reserved. |
Oracle Database 12c R2: Новые возможности для разработчиков
Игорь Мельников Ведущий консультант, Oracle 30 ноября 2016 года
Copyright © 2016, Oracle and/or its affiliates. All rights reserved. |
Safe Harbor Statement
The following is intended to outline our general product direction. It is intended for information purposes only, and may not be incorporated into any contract. It is not a commitment to deliver any material, code, or functionality, and should not be relied upon in making purchasing decisions. The development, release, and timing of any features or functionality described for Oracle’s products remains at the sole discretion of Oracle.
Oracle Confidential – Internal/Restricted/Highly Restricted 3
Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | Oracle Confidential – Restricted 4
1
3
2
План
• SQLcl: Новый интерфейс командной строки для Oracle Database
• Новые возможности в SQL и PL/SQL
• Интеграция JSON и PL/SQL
Copyright © 2016, Oracle and/or its affiliates. All rights reserved. |
SQLcl: Новый интерфейс командной строки для Oracle Database
5
Copyright © 2016, Oracle and/or its affiliates. All rights reserved. |
Что такое SQLcl?
Что нового по сравнению с SQL*Plus?
Интеграция с script engines (JSR-292)
Заключение
План -SQLcl
Повышение эффективности работы DBA и разработчиков
Copyright © 2016, Oracle and/or its affiliates. All rights reserved. |
Новая утилита для работы с Oracle Database
Copyright © 2016, Oracle and/or its affiliates. All rights reserved. |
Java 8, JRE
Размер - 14 MB
Поддержка OCI/Thick клиентов СУБД
В настоящий момент – в статусе Production
Дистрибутив свободно доступен на OTN
Также автоматически устанавливается с Oracle Database 12.2
Не требует установки – нужно только распаковать
Выполняемый файл называется просто - ‘sql’
SQLcl
Copyright © 2016, Oracle and/or its affiliates. All rights reserved. |
C чего начать? Скачать
Распаковать (unzip)
Запустить файл ‘sql’
http://www.oracle.com/technetwork/developer-tools/sql-developer/downloads/index.html
Copyright © 2016, Oracle and/or its affiliates. All rights reserved. |
Поддержка всех платформ и версий СУБД
Copyright © 2016, Oracle and/or its affiliates. All rights reserved. |
Подключение к СУБД
Cпособы:
EZConnect
TNS
LDAP
Proxy
G/Login.SQL
/nolog
Native SSH tunnels
Ключ -oci для подключения через толстого клиента
Copyright © 2016, Oracle and/or its affiliates. All rights reserved. |
Выделены в списке вывода команды help
ALIAS
APEX
BRIDGE
CD
CTAS
DDL
FORMAT
HISTORY
INFORMATION (INFO & INFO+)
SSHTUNNEL
Что нового по сравнению с SQL+?
Copyright © 2016, Oracle and/or its affiliates. All rights reserved. |
Команды SQL*Plus, также поддерживаются …
COLUMN SALARY FORMAT $99,990
C/oldval/newval
DESC
& и &&
Copyright © 2016, Oracle and/or its affiliates. All rights reserved. |
Команды: ALIAS Cоздание собственных “команд” – соответствие SQL-запроса c bind-переменными и алиаса
Пример:
Показать все таблицы имеющие столбцы c типом :DATA_TYPE
Copyright © 2016, Oracle and/or its affiliates. All rights reserved. |
Команды: CTAS
DDL посылается в буфер – редактировать и выполнить
Copyright © 2016, Oracle and/or its affiliates. All rights reserved. |
Команды: DDL
Генерирует DDL для объекта
Можно создать SQL-скрипт с помощью команд DDL и SPOOL
Copyright © 2016, Oracle and/or its affiliates. All rights reserved. |
Автоматическое форматирование результатов запроса
SET SQLFORMAT
csv
html
xml
json
csv
insert
loader
ansiconsole
Форматирование результатов запроса
Copyright © 2016, Oracle and/or its affiliates. All rights reserved. |
История выполнения
История выполнения команд
Сохраняются последние 100 команд
Сохраняется между сессиями
Навигация с помощью UP/DN
Также отслеживается и отображается время выполнения и число выполнений
Copyright © 2016, Oracle and/or its affiliates. All rights reserved. |
INFOrmation – улучшенная команда DESCribe
Пример метаданных объекта: Таблица
Primary Key
Комментарии
Статус INMEMORY
Статистика (info+)
Индексы
Copyright © 2016, Oracle and/or its affiliates. All rights reserved. |
Автозавершение команд с помощью клавиши TAB
Тоже самое, что и ‘Ctrl+Spacebar’ в SQL Developer
Активируется с помощью табуляции (<TAB>)
Автоматическая подстановка имен таблиц и столбцов, имен файлов (для символа @) и т.д. – имеется встроенный парсер и SQL PL/SQL
Copyright © 2016, Oracle and/or its affiliates. All rights reserved. |
Форматирование с помощью ANSICONSOLE
Разбивка на страницы, форматирование столбцов, печать, листание страниц…
SET sqlformat ansiconsole
Copyright © 2016, Oracle and/or its affiliates. All rights reserved. |
ANSIConsole – цветовое выделение
Copyright © 2016, Oracle and/or its affiliates. All rights reserved. |
Выполнение скриптов на JavaScript
• В SQLcl интегрирован движок JavaScript (Oracle Nashorn) из JRE 8
• Скрипт может одновременно использовать JavaScript, SQL и PL/SQL
SCRIPT
var v_xBinds = {};
v_xBinds.v_pTableName = 'test';
util.execute('begin ' +
' dbms_stats.gather_table_stats(ownname => USER, ' +
' tabname => :v_pTableName); ' +
'end;',v_xBinds);
/
Copyright © 2016, Oracle and/or its affiliates. All rights reserved. |
Доступ к объектной модели SQLcl прямо из скрипта
• Скрипту доступно управление SQLcl через его объектную модель
SCRIPT
sqlcl.setStmt("select something from somewhere;
set serveroutput on \n
@myscript \n begin null;end;");
sqlcl.run();
• Cоздание собственных команд
• Триггеры на стороне клиента (сommand pre/post callback)
• Также скрипт может получить управление SQL Developer через его объектную модель: выполнить действия не через GUI, а программно!
Copyright © 2016, Oracle and/or its affiliates. All rights reserved. |
Интеграция с классами JRE
• Скрипт на JavaScript может прозрачно использовать любой класс из библиотек Java SCRIPT
// Импортируем классы Thread и Runnable
var Thread = Java.type("java.lang.Thread");
var Runnable = Java.type("java.lang.Runnable");
// Создаем новый поток
this.thread = new Thread(new Runnable(){
run: main()
});
// Запускаем наш поток!
this.thread.start();
/
Copyright © 2016, Oracle and/or its affiliates. All rights reserved. |
Загрузка и выполнение JS-скрипта прямо внутри СУБД Новое в Oracle Database 12.2
• Загрузка скрипта в СУБД как текстового ресурса OJVM Avrora:
[oracle@host1 ~]$ loadjava –v –r –u scott/tiger test1.js
• Выдача пользователю прав на выполнение скрипта в БД:
GRANT dbmsjava_script TO scott;
• Выполнение скрипта в БД:
begin
dbms_javascript.run(‘test1.js’);
end;
Copyright © 2016, Oracle and/or its affiliates. All rights reserved. |
SQLcl - заключение
Утилита командной строки необходима DBA и разработчикам
SQL*Plus – удобный и хороший инструмент, но лишен многих современных возможностей
SQLcl – это мощная утилита с интегрированными скриптовыми движками JVM (Jython, JRuby, Scala, Closure, Groove, …)
SQLcl позволяет повысить продуктивность работы администраторов и разработчиков
Cтандартно входит в состав Oracle Database 12.2
Повышение эффективности работы DBA и разработчиков
Copyright © 2016, Oracle and/or its affiliates. All rights reserved. |
Новые возможности в SQL и PL/SQL
Oracle Confidential – Internal/Restricted/Highly Restricted 29
Copyright © 2016, Oracle and/or its affiliates. All rights reserved. |
SQL> CREATE TABLE
with_a_really_really_really_really_really_long_name (
and_lots_and_lots_and_lots_and_lots INT,
of_really_really_really_really_really_long_cols INT
);
Table created.
Длинные имена (до 128 байтов) в БД
• Длинные имена поддерживаются для всех объектов БД:
• Индексы, пользователи, PL/SQL-объекты, задания Oracle Scheduler, …
• Поддержка длинных имен в всех интерфейсах доступа к БД:
• JDBC, OCI, ODP.Net
Copyright © 2016, Oracle and/or its affiliates. All rights reserved. |
CREATE OR REPLACE PROCEDURE process_tab IS
tab VARCHAR2(30);
BEGIN
SELECT table_name
INTO tab
FROM user_tables
WHERE …
Проблема с длинными именами
SQL> EXEC proccess_tab;
ORA-06502: PL/SQL: numeric or value error: character string
buffer too small
Copyright © 2016, Oracle and/or its affiliates. All rights reserved. |
• Гибкий контроль за размерностью переменных:
Cтатические выражения в объявлении переменных
Static expression in declaration
DECLARE
v1 VARCHAR2(30);
var_length constant PLS_INTEGER := 30;
v2 VARCHAR2(var_length+10);
BEGIN
...
Значение выражения должно быть известно на момент компиляции
• В статическом выражении разрешены только константы и вызовы встроенных функций
• Запрещены обращения к SQL и вызовы пользов. PLSQL-функций
Copyright © 2016, Oracle and/or its affiliates. All rights reserved. |
CREATE OR REPLACE PROCEDURE process_tab is
$IF dbms_db_version.ver_le_12_1 $THEN
tab VARCHAR2(30);
$ELSE
tab VARCHAR2(ORA_MAX_NAME_LEN);
$END
BEGIN
… … …
ORA_MAX_NAME_LEN – служебная константа
12.1
12.2+
Только одна строка компилируется
Copyright © 2016, Oracle and/or its affiliates. All rights reserved. |
Обработка ошибок преобразования данных Ошибки преобразования типов нужно обрабатывать программно
SELECT
to_date(created_date, 'dd-mon-yyyy')
FROM
ext_tab;
ORA-01843: not a valid month
• Усложняется логика приложения и повышаются затраты на сопровождение (изменение) кода
Copyright © 2016, Oracle and/or its affiliates. All rights reserved. |
Обработка ошибок преобразования данных
Pluggable DB RAC и ASM In-Memory Sharding Partitioning PL/SQL JSON
Декларативные правила обработки ошибок преобразование типов
SELECT
to_date(created_date, 'dd-mon-yyyy')
FROM
ext_tab
WHERE
VALIDATE_CONVERSION(created_date as date,
'dd-MON-yyyy') = 1;
• Упрощается логика приложения и снижаются затраты на сопровождение (изменение) кода
SELECT
to_date(created_date DEFAULT '01-JAN-0001'
ON CONVERSION ERROR,'dd-mon-yyyy')
FROM
ext_tab;
Copyright © 2016, Oracle and/or its affiliates. All rights reserved. |
Обработка ошибок преобразования данных VALIDATE_CONVERSION – полный синтаксис
VALIDATE_CONVERSION (
<expression> as <data type>,
[ <format mask> ],
[ <nls_parameters> ]
)
1 = Преобразование успешно! 0 = Ошибка преобразования
По умолчанию используются NLS-установки
Copyright © 2016, Oracle and/or its affiliates. All rights reserved. |
Обработка ошибок преобразования типов Расширенный синтаксис оператора CAST
CAST (
<expression> AS <data type>
[ default <value> ON CONVERSION ERROR ],
[ <format mask> ],
[ <nls_parameters> ]
)
TO_DATE()
TO_NUMBER()
TO_TIMESTAMP()
и т.д.
Также …
Copyright © 2016, Oracle and/or its affiliates. All rights reserved. |
Определение регистронезависимых данных • Упрощение миграции с продуктов сторонних производителей с
регистронезависимой функциональностью • Cортировки и сравнения
используются объявленный collation
• Если collation не задан, тогда он наследуется от collation table по умолчанию на уровне таблицы или схемы
• Оператор COLLATE может быть использован для явного указания collation table в любом месте выражения
_CI = case-insensitive
Inherits BINARY
CREATE TABLE product
( id NUMBER,
name VARCHAR2(50) COLLATE BINARY_CI,
comments VARCHAR2(500)
) DEFAULT COLLATION BINARY;
SELECT name, comments FROM product
WHERE name LIKE '%BASE%' OR
comments COLLATE BINARY_CI LIKE '%REPORT%';
NAME COMMENTS _
Oracle Database
Activity-Based Management
Business Intelligence Replaces Reports
_CI = case-insensitive
наследует BINARY
Copyright © 2016, Oracle and/or its affiliates. All rights reserved. |
Как оченить качество тестов PL/SQL? До PL/SQL 12.2: невозможно точно измерить процент покрытия кода тестами
• Нужно экспериментальным путем подбирать параметры тестов, чтобы обеспечить полное покрытие кода тестами - необходимо инструментирование кода флагами
CREATE FUNCTION isValidAmount(v_pNum in number) RETURN boolean is
BEGIN
IF (v_pNum >= .1 THEN
RETURN TRUE;
END IF;
--делаем проверки и вычисления
… … …
RETURN FALSE;
END;
-1 1
Copyright © 2016, Oracle and/or its affiliates. All rights reserved. |
• Новый пакет DBMS_PLSQL_CODE_COVERAGE: –START_COVERAGE – включить измерение покрытия выполняемого кода
–STOP_COVERAGE - выключить
–ANALYZE_COVERAGE – получить отчет по проценту покрытия кода после тестов
–RESET_COVERAGE – сбросить счетчики измерения покрытия кода
–FLUSH_COVERAGE – записать на диск счетчики
PL/SQL 12.2: Точное измерение покрытия кода после тестов
PL/SQL block code coverage
Copyright © 2016, Oracle and/or its affiliates. All rights reserved. |
• Cоздание служебных таблиц для хранения информации о покрытии кода тестами:
• Запустить тесты с измерением покрытия кода:
Использование пакета DBMS_PLSQL_CODE_COVERAGE
PL/SQL block code coverage
BEGIN
dbms_plsql_code_coverage.create_coverage_tables;
END;
BEGIN
dbms_plsql_code_coverage.start_coverage('TEST1');
your_test_procedures;
dbms_plsql_code_coverage.stop_coverage;
END;
Copyright © 2016, Oracle and/or its affiliates. All rights reserved. |
• Запрос по служебным таблицам:
Получение результатов покрытия кода тестами
PL/SQL block code coverage
SELECT
u.owner,
u.name,
u.type,
round((sum(b.covered)*100)/count(*)) as pct_covered
FROM
dbmspcc_runs r
JOIN dbmspcc_units u ON r.run_id = u.run_id
JOIN dbmspcc_blocks b ON b.object_id = u.object_id
AND b.run_id = u.run_id
WHERE
r.run_comment = 'TEST1'
AND not_feasible = 0
GROUP BY
u.owner, u.name, u.type
Copyright © 2016, Oracle and/or its affiliates. All rights reserved. |
• Для служебных процедур (например: инициализация окружения тестирования), можно отключить сбор информации:
• Отключить для части кода измерение покрытия тестами:
Директива компилятора для выключения измерения покрытия
PL/SQL block code coverage - pragma
CREATE PROCEDURE initTestEnv IS
PRAGMA COVERAGE (‘NOT_FEASIBLE’);
BEGIN
… … …
END;
BEGIN
… … …
PRAGMA COVERAGE (‘NOT_FEASIBLE_START’);
debug_proc1();
PRAGMA COVERAGE (‘NOT_FEASIBLE_STOP’);
… … …
END;
Copyright © 2016, Oracle and/or its affiliates. All rights reserved. |
CREATE OR REPLACE PACKAGE customer_pkg AS
/* get_customers_upper is deprecated. Do not use
or I'll come for you! */
CURSOR get_customers_upper (p_name varchar2) IS
SELECT * FROM customers
WHERE upper(customer_name) = upper(p_name);
pragma deprecate(get_customers_upper,
'Use get_customers instead');
CURSOR get_customers (p_name varchar2) IS
SELECT * FROM customers
WHERE customer_name = p_name;
PL/SQL-прагма DEPRECATE
Copyright © 2016, Oracle and/or its affiliates. All rights reserved. |
PL/SQL-прагма DEPRECATE При использования устаревшего API выводится предупреждение
Warning: Procedure altered with compilation errors.
LINE/COL ERROR
-------- ------------------------------------------------
4/29 PLS-06020: reference to a deprecated entity:
GET_CUSTOMERS_UPPER declared in unit
CUSTOMER_PKG[2,10].
Use get_customers instead
8/9 PLS-06020: reference to a deprecated entity:
GET_CUSTOMERS_UPPER declared in unit
CUSTOMER_PKG[2,10].
Use get_customers instead
Copyright © 2016, Oracle and/or its affiliates. All rights reserved. |
Application Containers
Public 46
Хранение и распространение информации между несколькими PDB
Account Type • Credit • Debit • Check • Savings
Bank Account
Person
Bank Card
PDB$SEED APP ROOT PDB1 PDB2 PDB3
Copyright © 2016, Oracle and/or its affiliates. All rights reserved. |
Что такое Application Container?
• Application container это коллекция PDB содержащих Application Root и прикладные PDB, ассоциированные с ним
Public 47
CDB$ROOT
App Root AppPDB 1 AppPDB 2 PDB1
CDB$ROOT
APP Root PDB1
AppPDB 1 AppPDB 2
Физическое представление Логическое представление
Copyright © 2016, Oracle and/or its affiliates. All rights reserved. |
Application Containers • Совместное использование кода и данных приложения несколькими PDB
SQL> CREATE PLUGGABLE DATABASE saas_sales_ac AS APPLICATION CONTAINER ADMIN
USER saas_sales_ac_adm IDENTIFIED BY manager;
SQL> ALTER PLUGGABLE DATABASE saas_sales_ac OPEN;
SQL> ALTER PLUGGABLE DATABASE APPLICATION saas_sales_app BEGIN INSTALL '1.0';
SQL> CONNECT saas_sales_adm/******@saas_sales_ac
SQL> CREATE TABLE saas_sales_adm.sales_mlt SHARING=METADATA
(YEAR NUMBER(4),
REGION VARCHAR2(10),
QUARTER VARCHAR2(4),
REVENUE NUMBER);
… … … … … … …
SQL> ALTER PLUGGABLE DATABASE APPLICATION saas_sales_app END INSTALL '1.0‘;
METADATA DATA DATA_EXTENDED NONE
Copyright © 2016, Oracle and/or its affiliates. All rights reserved. |
Application Containers
• Application Root PDB определяет общую информацию необходимую приложению
– Метаданные и данные разделяются несколькими PDB
• Только одна копия общих данных и метаданных приложения
• Быстрое развертывание PDB из шаблона (Application Seed)
• Отображение данных из нескольких PDB (на основе оператора CONTAINERS)
• Поддержка обновления приложения на месте (In-Place Patching)
• Поддержка обновления через Unplug/Plug в Application Root новой версии
Public 49
Будущее для разработки приложений СУБД Oracle Database
Copyright © 2016, Oracle and/or its affiliates. All rights reserved. |
AQ Sharded Queues Архитектура для производительности и масштабируемости
Instance 1
Part Shard
ENQ DEQ
Part Shard
ENQ DEQ
Part Shard
ENQ DEQ
Instance 2
Instance 3
Модель с единой логической очередью
Физическая очерерь: секции привязанные к узлам кластера RAC
ENQ
ENQ
ENQ
DEQ
DEQ
DEQ
Copyright © 2016, Oracle and/or its affiliates. All rights reserved. |
Real Time Materialized View
CREATE MATERIALIZED VIEW sum_sales_rtmv
REFRESH FAST ON DEMAND
ENABLE QUERY REWRITE
ENABLE ON QUERY COMPUTATION
AS
SELECT prod_name, SUM(quantity_sold) AS sum_qty, COUNT(quantity_sold) AS
cnt_qty, SUM(amount_sold) AS sum_amt,
COUNT(amount_sold) AS cnt_amt, COUNT(*) AS cnt_star
FROM sales, products
WHERE sales.prod_id = products.prod_id
GROUP BY prod_name;
Copyright © 2016, Oracle and/or its affiliates. All rights reserved. |
Интеграция JSON c PL/SQL
• Новые встроенные PL/SQL-объектные типы для манипуляции с JSON-документами
• JSON_OBJECT_T : для работы с JSON-объектами
• JSON_ARRAY_T : для работы с массивами JSON-объектами
• JSON_OBJECT_T и JSON_ARRAY_T это подтипы JSON_ELEMENT_T
• Эти объектные типы предоставляют набор методов для манипулирования JSON
• Частичное изменение JSON-документа теперь поддерживается в PL/SQL
Copyright © 2016, Oracle and/or its affiliates. All rights reserved. |
Генерация JSON из строки таблицы
• Для генерации JSON доступны следующие функции: – JSON_OBJECT / JSON_OBJECTAGG
– JSON_ARRAY / JSON _ARRAYAGG
Public 54
SQL> SELECT JSON_OBJECT('Id' is EMPLOYEE_ID, 'FirstName' is FIRST_NAME,
2 'LastName' is LAST_NAME) JSON
3 FROM HR.EMPLOYEES
4 WHERE EMPLOYEE_ID = 100;
JSON
------------------------------------------------------------------------------
{ "Id" : 100 , "FirstName" : "Steven" , "LastName" : "King" }
SQL>
Copyright © 2016, Oracle and/or its affiliates. All rights reserved. |
JSON Data Guide: автоматический вывод cхемы JSON
SQL> desc MOVIE_TICKETS
NAME TYPE
--------------------- -----------
BOOKING_ID RAW(16)
BOOKING_TIME TIMESTAMP(6)
BOOKING_DETAILS VARCHAR2(4000)
Таблица содержит JSON-документы
JSON DataGuide Таблица расширяется виртуальными столбцами
SQL> desc MOVIE_TICKETS
NAME TYPE
--------------------- -----------
BOOKING_ID RAW(16)
BOOKING_TIME TIMESTAMP(6)
BOOKING_DETAILS VARCHAR2(4000)
BOOKING_DETAILS$Movie VARCHAR2(16)
BOOKING_DETAILS$Theater VARCHAR2(16)
BOOKING_DETAILS$Adults NUMBER
BOOKING_DETAILS$Time VARCHAR2(32) {
"Theater":"AMC 15",
"Movie":"Jurrasic World 3D",
"Time”:”2015-11-26T18:45:00",
"Tickets":{
"Adults":2
}
}
DBMS_JSON.Add_Virt_Col(
“MOVIE_TICKETS”,
“BOOKING_DETAILS”);
Copyright © 2016, Oracle and/or its affiliates. All rights reserved. |
Интеграция JSON с PL/SQL WITH FUNCTION updateTax(JSON_DOC in VARCHAR2 ) RETURN VARCHAR2 IS
jo JSON_OBJECT_T;
price NUMBER;
taxRate NUMBER;
BEGIN
jo := JSON_OBJECT_T(JSON_DOC);
taxRate := jo.get_Number('taxRate');
price := jo.get_Number('total');
jo.put('totalIncludingTax', price * (1+taxRate));
RETURN jo.to_string();
END;
ORDERS AS (
SELECT '{"taxRate":0.175,"total":10.00}' JSON_DOCUMENT
FROM dual
)
SELECT JSON_DOCUMENT, updateTax(JSON_DOCUMENT)
FROM ORDERS;
JSON_DOCUMENT UPDATETAX(JSON_DOCUMENT)
------------------------------- ---------------------------------------------------------
{"taxRate":0.175,"total":10.00} {"taxRate":0.175,"total":10.00,"totalIncludingTax":11.75}
Public 56
Copyright © 2016, Oracle and/or its affiliates. All rights reserved. |
JSON-индекс : универсальный индекс для JSON-документов
• Поддержка поиска в JSON использую ключ, путь и значение
• Поддержка поиска по диапазону для числовых значений
• Поддержка полнотекстового поиска:
– Поддержка логических операторов в предикатах поиска (AND, OR, NOT)
– Поиск фраз, поиск и близость "в поле" поисков.
– Неточные запросы: нечеткое соответствие, по произношению
– Автоматическая языковая поддержка для 32 языков
– Полная, интегрированная структура тезауруса ISO
Public 57
CREATE SEARCH INDEX JSON_SEARCH_INDEX
ON J_PURCHASEORDER (PO_DOCUMENT) FOR JSON;
Copyright © 2016, Oracle and/or its affiliates. All rights reserved. |
LiveSQL.oracle.com
58
Вся мощь Oracle SQL в вашем браузере
Copyright © 2016, Oracle and/or its affiliates. All rights reserved. |
Oracle On GitHub
Oracle Confidential – Internal/Restricted/Highly Restricted 59
www.github.com/oracle
• Официальный контент от Oracle на GitHub
• Примеры и инструменты на Java, SQL, Python, Node.js, PL/SQL, Docker
• Репозиторий регулярно обновляется
• Главный источник для компонентов Open Source
Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | Oracle Confidential – Internal/Restricted/Highly Restricted 60