Execute external C programs from PL/SQL

Já foi publicado aqui no blog um artigo demonstrando como utilizar programas em Java dentro do banco Oracle. Agora irei demonstrar como fazer o mesmo mas como programas na linguagem C. Acredito que vai ser muito difícil alguém encontrar essas necessidade um dia, mas por causa do tópico da prova criei esse post aqui. Por falar em prova, eu já comprei o voucher, irei fazer a prova acredito que no final de janeiro, quando eu fizer eu posto os resultados e a minha impressão aqui.

Antes de começar a ver o exemplo, devemos entender um pouco como funcionar a execução de um programa externo em C, que é bem mais complicado do que em Java.

Para começar, devemos conhecer um processo que roda no O.S. chamado de extproc. Quando alguma aplicação invoca um programa externo em C, o Oracle Database inicia o processo extproc que carrega o programa externo, seja uma .DLL no Windows ou um .so no Linux/Solaris, cuida dos argumentos/parâmetros, recebe o retorno do programa e envia de volta para o Oracle. Ou seja, é um programa essencial nessa arquitetura.

Antigamente quem iniciava o extproc era o Oracle Listener e não o Oracle Database, mas agora com versões mais atuais isso mudou, eliminando o risco do Oracle Listener iniciar o processo inesperadamente. Esta agora é oa configuração padrão e é recomendado para maximizar a segurança. Mas, é possível reverter o comportamento e permitir que o Oracle Listener cuide do processo, caso necessário. Mas isso envolve fazer alterações nos arquivos do listener.ora e tnsnames.ora. O padrão hoje deixa o processo muito mais fácil e seguro, vamos ver como fica. Vamos primeiro criar o nosso arquivo com fonte em C e compilar e gerar a arquivo .so.

#include <ctype.h>

int terciocosta(char *istr, char *ostr){
        int i = 0;

        while(istr[i]){
                ostr[i] = toupper(istr[i]);
                i++;
        }

        return 0;
}

Vamos agora compilar e mover o arquivo para o diretório bin da ORACLE_HOME. Logo após isso será necessário criar um LIBRARY que aponta para o nosso arquivo .so, utilizando um diretório que será criado também no exemplo.

Para demonstração do uso foi criada uma função e a mesma foi utilizada em um bloco anônimo.

$gcc -fPIC -c terciocosta.c  
$ld -fPIC -shared -o terciocosta.so terciocosta.o
$mv terciocosta.so $ORACLE_HOME
$ sqlplus / as sysdba

SQL*Plus: Release 12.2.0.1.0 Production on Wed Dec 26 15:29:28 2018

Copyright (c) 1982, 2016, Oracle.  All rights reserved.


Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

SQL>CREATE DIRECTORY  BIN AS '/u01/oracle/app/oracle/product/12.2.0/dbhome_1/bin';

Directory created.

SQL>CREATE OR REPLACE LIBRARY terciocosta AS 'terciocosta.so' IN bin;
  2  /

Library created.

SQL>CREATE OR REPLACE FUNCTION fn_terciocosta (
  2    p_istr  IN VARCHAR2,
  3    p_ostr OUT VARCHAR2)
  4  RETURN binary_integer
  5  AS EXTERNAL
  6    LIBRARY terciocosta
  7    NAME "terciocosta"
  8    LANGUAGE c
  9    PARAMETERS (
 10      p_istr STRING,
 11      p_ostr STRING);
 12  /

Function created.

SQL>SET SERVEROUTPUT ON SIZE UNLIMITED;
SQL> DECLARE
  2     res BINARY_INTEGER;
  3     v_out CHAR(100);
  4  BEGIN
  5     res := fn_terciocosta('hello world', v_out);
  6     dbms_output.put_line(v_out);
  7  END;
  8  /
HELLO WORLD

PL/SQL procedure successfully completed.
Anúncios

Meu nome é Tércio Costa, sou formado em Ciências da Computação pela UFPB, tenho a certificação Oracle SQL Expert e OCP PL/SQL, mantendo um blog reconhecido pela OTN(oraclepress.wordpress.com), no qual também publico artigos técnicos no portal OTN, no portal http://www.profissionaloracle.com.br/gpo e na revista SQL Magazine. Além de tudo isto sou um Oracle ACE Associate por estar sempre contribuindo para a comunidade com um bom nível de expertise.

Marcado com: , ,
Publicado em PL/SQL

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s

Este site utiliza o Akismet para reduzir spam. Saiba como seus dados em comentários são processados.

Esse Blog é reconhecido pela
Certificações
Sou articulista

Clique para seguir este blog e receber notificações via email de novos posts.

Tércio Costa

Tércio Costa

Meu nome é Tércio Costa, sou formado em Ciências da Computação pela UFPB, tenho a certificação Oracle SQL Expert e OCP PL/SQL, mantendo um blog reconhecido pela OTN(oraclepress.wordpress.com), no qual também publico artigos técnicos no portal OTN, no portal http://www.profissionaloracle.com.br/gpo e na revista SQL Magazine. Além de tudo isto sou um Oracle ACE Associate por estar sempre contribuindo para a comunidade com um bom nível de expertise.

Links Pessoais

Serviços verificados

Visualizar Perfil Completo →

Total de Visualizações da Página
  • 138.077 Visualizações
%d blogueiros gostam disto: