Документ создан: 11.03.2016

Внешние таблицы.

Наткнулся на заметку и решил попробовать.

Данные, полученные скриптом на стороне сервера.

Практического применения пока не придумал, но действия таковы:

  1. В операционной системе, на которой установлен Oracle RDBMS:
    • создаём каталог:
      mkdir -p /u01/app/oracle/admin/XE/sh
    • в каталоге создаём скрипт "disk_usage.sh" следующего содержания:
      #!/bin/bash
      
      /bin/df -k | /bin/grep "^/" | /bin/sort -k1 | /bin/sed 's/ \+/~/g; s/%//g'


      Результат работы скрипта выглядит так:

      /dev/sda1~495844~111984~358260~24~/boot
      /dev/sda2~100660656~4775920~90748352~5~/u01
      /dev/sda3~30106576~10357276~18196916~37~/
      /dev/sda6~39661976~2269268~35354900~7~/home
    • там же создаём файл "dummy.dat":
      touch dummy.dat
  2. В Oracle:
    • создаём каталог:
      create directory BIN as '/u01/app/oracle/admin/XE/sh/';
    • выдаём необходимые полномочия пользователю, например, "TEST":
      grant read, write, execute on directory BIN to test;
    • подключаемся к БД под пользователем TEST и создаём таблицу. Например:
      create table disk_usage
      ( filesystem varchar2(20)
      , fs_size number
      , fs_used number
      , fs_available number
      , fs_use_percent number(3)
      , mount_point varchar2(255)
      )
      organization external
      (
      type oracle_loader
      default directory BIN
      access parameters
      (
      records delimited by newline
      preprocessor BIN: 'disk_usage.sh'
      fields terminated by "~"
      )
      location (BIN:'dummy.dat')
      )
      reject limit unlimited
      ;
      
    • выполняем запрос:
      select * from disk_usage;

      и получаем:

      FILESYSTEM    FS_SIZE    FS_USED FS_AVAILABLE FS_USE_PERCENT MOUNT_POINT
      ---------- ---------- ---------- ------------ -------------- ---------------
      /dev/sda1      495844     111984       358260             24 /boot
      /dev/sda2   100660656    4776012     90748260              5 /u01
      /dev/sda3    30106576   10357352     18196840             37 /
      /dev/sda6    39661976    2269268     35354900              7 /home

Данные, полученные из файла на стороне сервера.

Так же можно использовать и внешний файл, например, csv. Эта процедура немного проще.

  1. В операционной системе, на которой установлен Oracle RDBMS:
    • создаём каталог:
      mkdir -p /u01/app/oracle/admin/XE/files
    • помещаем в созданном каталоге требуемый файл. В нашем случае мы его создадим так:
      cut -d':' -f1,5,6,7 /etc/passwd | sed 's/:/;/g' > users.csv

      получится похожее:

      ...
      nginx;nginx user;/var/cache/nginx;/sbin/nologin
      apache;Apache;/var/www;/sbin/nologin
      www-data;;/home/www-data;/bin/bash
      tomcat;;/home/tomcat;/bin/bash
      ...
  2. В Oracle:
    • создаём каталог:
      create directory FILES as '/u01/app/oracle/admin/XE/files';
    • выдаём необходимые полномочия пользователю, например, "TEST":
      grant read, write on directory FILES to test;
    • подключаемся к БД под пользователем TEST и создаём таблицу. Например:
      create table users
      ( login varchar2(32)
      , lcomment varchar2(250)
      , home varchar2(250)
      , shell varchar2(50)
      )
      organization external
      ( default directory FILES
      access parameters
      ( records delimited by newline
      fields terminated by ';'
      )
      location ('users.csv')  
      )
      ;
    • выполняем, например, такой запрос:
      select * from users where login in ('nginx','apache','www-data','tomcat');

      получаем:

      LOGIN                     LCOMMENT   HOME                           SHELL
      ------------------------- ---------- ------------------------------ ---------------
      nginx                     nginx user /var/cache/nginx               /sbin/nologin
      apache                    Apache     /var/www                       /sbin/nologin
      www-data                             /home/www-data                 /bin/bash
      tomcat                               /home/tomcat                   /bin/bash
 
Recent changes RSS feed Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki Donate