Пример PI-Day

Вот очень быстрый и простой тест Oracle MLE, механизма, который позволяет запускать хранимые процедуры JavaScript или Python в базе данных Oracle (в настоящее время находится в стадии бета-тестирования).

Бета-версия MLE предоставляется в виде образа докера, содержащего Oracle Database 12.2 с дополнительными библиотеками MLE. Я создал виртуальную машину в Oracle Cloud, чтобы протестировать ее и показать сквозную демонстрацию в Oracle Linux 7.

Получить программное обеспечение

Вот где можно скачать сервер баз данных с бета-версией MLE:



и клиент SQLcl



Я скачаю их со своей ВМ, где у меня нет браузера,

но загрузка программного обеспечения Oracle требует вмешательства человека для принятия условий лицензии. Затем я запускаю загрузку со своего ноутбука (где я могу войти в свою учетную запись Oracle и принять лицензию), приостанавливаю загрузку и копирую ссылку, содержащую значение «AuthParam». Затем я могу использовать этот URL-адрес, чтобы загрузить его с помощью wget на моей виртуальной машине в каталоге /tmp:

Как только это будет в каталоге /tmp, я устанавливаю и запускаю докер, распаковываю SQLcl и создаю контейнер MLE:

sudo su
# install docker and java from OL7 Add-Ons
yum-config-manager --enable ol7_addons
yum install -y docker-engine docker-compose java
#start docker
systemctl start docker
docker info | grep -A2 ^Storage
# install SQLcl, the client to connect to the database
unzip -d /tmp /tmp/sqlcl-18.4.0.007.1818.zip*
# start the MLE beta
docker load --input /tmp/mle-docker-0.3.0.tar.gz*
cat > /tmp/mle.yml <<'CAT'
version: '3.1'
services:
  ora122MLE:
    image: mle-docker:0.3.0
    restart: always
    environment:
      ORACLE_SID: CDB1
      ORACLE_PDB: PDB1
      ORACLE_PWD: oracle
    ports:
      - 1521:1521
    volumes:
      - "/var/tmp/oradata:/opt/oracle/oradata"
      - "/tmp:/home/oracle/myproject"
CAT
mkdir -p /var/tmp/oradata
docker-compose -f /tmp/mle.yml up

Я мог бы создать образ докера, содержащий SQLcl, но я не фанат контейнеров. Моя ОС - это виртуальная машина, SQLcl работает на виртуальной машине Java, действительно ли мне нужно помещать это в контейнер между двумя виртуальными машинами? В контейнере работает только база данных, потому что именно так поставляется бета-версия.

[Обновление от 17 марта 2019 г.] Это нормально, только если между клиентом и сервером выполняется несколько циклов. Реализация docker-proxy для подключения хоста к контейнеру вообще неэффективна, а затем лучше установить SQLcl в самом контейнере или другом связанном контейнере.

Создание контейнера в docker-compose up занимает много времени. Потерпи. Вот как работают образы докеров базы данных: они должны создать базу данных при создании контейнера.

Причина в том, что база данных хранит постоянные данные, а затем может быть создана только после запуска контейнера. А базу данных Oracle создать просто невозможно. Здесь я помещаю базу данных в /var/tmp, а каталог myproject сопоставляется с /tmp.

Бета-версия MLE основана на официальных сценариях сборки образов Docker, предоставленных Oracle. Все в порядке, когда вы видите «БАЗА ДАННЫХ ГОТОВА К ИСПОЛЬЗОВАНИЮ».

Давайте проверим пароль, который я определил в файле docker-compose, и создадим пользователя DEMO в подключаемой базе данных:

/tmp/sqlcl/bin/sql sys/oracle@//localhost/pdb1 as sysdba
 connect sys/oracle@//localhost/pdb1 as sysdba
 grant dba to demo identified by demo;
 connect demo/demo@//localhost/pdb1

Документация бета-версии MLE находится по адресу: https://oracle.github.io/oracle-db-mle/docker. Поскольку я делаю это 14 марта или 14 марта, который в странах, использующих формат MM/DD, известен как День PI, я создам функцию PI, которая может округлять до 2 знаков после запятой:

connect demo/demo@//localhost/pdb1
create javascript source named "test1.js" as
module.exports.PI=function (d) {
 return Math.round(10**d*Math.PI)/10**d;
}
/
create function PI(decimals in number)
return number as language javascript
name 'test1\.js.PI(decimals number) return number';
/
select PI(2) from dual;

В предыдущей бета-версии нам приходилось использовать внешнюю утилиту (dbjs) для загрузки кода JavaScript. Теперь это намного проще с оператором CREATE SOURCE.

Теперь я готов со средой MLE для дальнейших тестов…