Todos os post de Vih Damarques

Um eterno curioso. Pode Arnaldo ?

Instalando o Oracle REST Data Services (antigo APEX Listener) no Glassfish

1) Baixe a versão executável do Glassfish em http://glassfish.java.net

2) Instale o Glassfish

3) Baixe o ORDS em http://www.oracle.com/technetwork/developer-tools/rest-data-services/overview/index.html

4) Extraia o arquivo em uma pasta de fácil acesso (ex: C:\ords)

5) Abra o prompt de comando e acesse a pasta criada.

C:\> cd C:\ords

6) Altere o nome do arquivo ords.war para apex.war para que sua url de acesso ao apex seja http://localhost/apex

7) O primeiro passo para instalar o Oracle REST Data Services é configurar a pasta onde ficarão salvos os arquivos de configuração. Eu costumo utilizar a própria pasta C:\ords. Para isso use o comando:

c:\ords> java -jar apex.war configdir “c:\ords”

8) Depois de configurar a pasta, rode o comando para executar a configuração do ORDS:

c:\ords> java -jar apex.war setup

9) Nessa fase o programa de configuração irá fazer algumas perguntas, como IP do banco de dados, etc. Para o banco Oracle XE eu uso as seguintes configurações:

Servidor: localhost
Porta: 1521
Serviço ou SID: 2 (para especificar o SID)
SID: XE
Usuário do banco de dados: APEX_PUBLIC_USER
Senha: manager (Troque pela senha do seu usuário APEX_PUBLIC_USER)
Senha dos usuários APEX_LISTENER e APEX_REST_PUBLIC_USER: 2 (para usar a mesma senha do usuário APEX_PUBLIC_USER, ou então digite 1 e especifique as senhas)

9) Agora que o ords foi configurado, vamos iniciar o serviço do Glassfish. Um problema comum nessa parte, é que se você estiver usando o Oracle XE, provavelmente já vai ter o EPG (Embbeded PL/SQL Gateway) configurado para utilizar a porta 8080 (que é a porta padrão do Glassfish). Portanto podemos fazer duas coisas:

9.1) Interromper o banco de dados por alguns instantes para configurarmos o Glassfish, ou então

9.2) Desabilitar o listener do EPG usando o seguinte comando no banco de dados (prefiro essa opção):

begin
dbms_xdb.sethttpport(0);
end;
/

9.3) Agora vamos iniciar o Glassfish:

c:\ords> “c:\Program Files\glassfish-4.0\bin\asadmin” start-domain

10) Acesse o console de administração do Glassfish abrindo o browser de sua preferência e acessando a url http://localhost:4848

11) [OPCIONAL] Eu gosto de alterar a porta padrão do Glassfish para a porta 80, assim não preciso ficar colocando :8080 toda vez no final da url. Para isso navegue no menu do glassfish em configurações > server-config > Configuração de rede > Listeners de rede > http-listener-1 e altere a porta para 80. reinicie o glassfish com os comandos:

c:\ords> “c:\Program Files\glassfish-4.0\bin\asadmin” stop-domain
c:\ords> “c:\Program Files\glassfish-4.0\bin\asadmin” start-domain

12) Volte ao console de administração do Glassfish, vá em “Aplicações” e clique em “Implantar”. Na tela seguinte, ache o arquivo C:\ords\apex.war e clique em OK.

13) Precisamos agora copiar os arquivos estáticos do APEX (imagens, javascript e css) para nosso servidor glassfish. Portanto copie a pasta images que se encontra nos arquivos de instalação do apex, para a pasta C:\Program Files\glassfish-4.0\glassfish\domains\domain1\docroot . Obs: se você instalou o apex indicando a pasta /i/ para os arquivos estáticos, então renomeie a pasta images para i.

14) Pronto, você já deve conseguir acessar o apex pela url http://localhost/apex . Não se esqueça de subir novamente o banco de dados caso você tenha derrubado para realizar o passo 9.

15) Caso ao acessar a url você encontre o erro 503 Service Unavailable, tenha certeza que os usuários do APEX estão desbloqueados no banco de dados. Para ter certeza, apenas rode os comandos no banco como sysdba:

sql> ALTER USER anonymous ACCOUNT UNLOCK;
sql> ALTER USER apex_public_user ACCOUNT UNLOCK;
sql> ALTER USER flows_files ACCOUNT UNLOCK;

Caso o erro persista, tente olhar na pasta C:\Program Files\glassfish-4.0\glassfish\domains\domain1\logs para ter pistas sobre a possível causa.

Como instalar o Oracle APEX 4.2

1) Baixe o Oracle APEX em http://apex.oracle.com

2) Extraia o arquivo em um local fácil, por exemplo na unidade C:\ (assim será criada a pasta C:\apex)

3) Entre no prompt de comando clicando em iniciar > Executar (ou então aperte a tecla do windows + R), digite cmd e dê enter.

4) Acesse a pasta onde extraiu os arquivos:
C:\> cd c:\apex

5) Abra o sqlplus e conecte como sysdba (no exemplo estou utilizando o Oracle XE 11g):
C:\apex> C:\oraclexe\app\oracle\product\11.2.0\server\bin\sqlplus.exe system/senha as sysdba

6) Crie uma tablespace separada para o APEX e outra para os arquivos do APEX (isso ajuda na administração do APEX):

— Cria tablespace para o apex
sql> CREATE TABLESPACE APEX datafile ‘C:\oraclexe\app\oracle\oradata\XE\APEX.dbf’ SIZE 1000M EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO;

— Cria tablespace para os arquivos do apex
sql> CREATE TABLESPACE APEX_FILES datafile ‘C:\oraclexe\app\oracle\oradata\XE\APEX_FILES.dbf’ SIZE 400M EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO;

7) O comando a seguir instala (ou atualiza) o APEX. Os parâmetros são a tablespace para o APEX, a tablespace para os arquivos do APEX, a tablespace temporária e por último o caminho da pasta onde o APEX irá buscar os arquivos (por convenção utiliza-se /i/). Se você criou a tablespace com outro nome, ou quer utilizar alguma outra tablespace para o APEX, essa é a hora de mudar:

sql> @C:\apex\apexins.sql APEX APEX_FILES TEMP /i/

(deverá demorar alguns minutos)

8) Finalizado o procedimento de instalação é necessário mudar a senha de administrador do APEX. Após a instalação do APEX, o script sai automaticamente do sqlplus então vamos entrar novamente e depois chamar o script que muda a senha. Vou colocar a senha “manager” para o exemplo:

C:\apex> C:\oraclexe\app\oracle\product\11.2.0\server\bin\sqlplus.exe system/senha as sysdba
sql> @apxxepwd.sql manager

9) Agora precisamos copiar os arquivos estáticos (imagens, css e javascript) do APEX. Esse procedimento pode variar de acordo com o servidor web utilizado, mas vou assumir que estamos utilizando o EPG (Embbeded PL/SQL Gateway) que é um servidor que já vem pré-instalado e configurado com o Oracle. O parâmetro passado deve ser uma pasta acima de onde foram extraídos os arquivos do apex (em nosso exemplo seria a pasta raiz C:\ ):

sql> @apxldimg.sql C:\

10) Eu costumo desbloquear os usuários do APEX no banco de dados:

sql> ALTER USER anonymous ACCOUNT UNLOCK;
sql> ALTER USER apex_public_user ACCOUNT UNLOCK;
sql> ALTER USER flows_files ACCOUNT UNLOCK;

11) Também acho legal trocar a senha do usuário APEX_PUBLIC_USER caso deseje configurar um servidor APEX Listener ou Apache posteriormente:

sql> ALTER USER apex_public_user IDENTIFIED BY manager;

12) O apex já está pronto, bastando acessar a url http://localhost:8080/apex para começar a desenvolver. Caso queira administrar as workspaces, acesse com as credenciais:

Workspace: INTERNAL
Username : ADMIN
Password : manager (provisorio)

13) É interessante executar o script que configura o APEX para trabalhar com Web Services RESTful (e também para usar o apex listener). Para isso execute os comandos abaixo. Lembrando que você será perguntado sobre as senhas para os usuários APEX_LISTENER e APEX_REST_PUBLIC_USER que serão criados, eu geralmente uso a mesma do usuário APEX_PULBIC_USER.

C:\apex> C:\oraclexe\app\oracle\product\11.2.0\server\bin\sqlplus.exe system/senha as sysdba
sql> @apex_rest_config.sql

14) (OPCIONAL) Podemos também traduzir o APEX para o português. Para isso, precisamos executar:

C:\apex> set NLS_LANG=American_America.AL32UTF8
C:\apex> cd builder\pt-br
C:\apex> C:\oraclexe\app\oracle\product\11.2.0\server\bin\sqlplus.exe system/senha as sysdba
sql> alter session set current_schema = APEX_040200;
sql> @load_pt-br.sql

É isso, obrigado!

Qualquer dúvida é só comentar!

“Pessoas que são boas em arranjar desculpas raramente são boas em qualquer outra coisa.”
– Benjamin Franklin

Como interceptar uma função em JavaScript ?

Boa tarde !

Está difícil de postar com frequência, mas esses dias descobri algo tão interessante que me motivou a tirar as teias de aranha daqui mais uma vez.
Bom, vamos logo ao assunto.

Um dia desses no trabalho me vi obrigado a interceptar a execução de uma função JavaScript de terceiros.
Mas o que eu quis dizer com “interceptar” ?!

No geral, eu precisava executar códigos meus antes e depois que uma determinada função (que não era minha) fosse executada, mas mantendo a chamada da função.
Após quebrar um pouco a cabeça e brincar com contextos de função, cheguei a uma solução limpa e que fez o trabalho pra mim.

Vamos supor que a função que eu gostaria de interceptar se chamasse bar().
Vou postar um código para termos como exemplo, mas a função não precisa ter sido criada por você:

var bar = function(){
  for (var i = 1; i <= 3; i++)
    alert(i);
};

Agora o código para interceptar essa função:

var foo = bar; // Note que não podemos colocar aqui os parênteses "()" na função "bar"
bar = function() {
  alert('Esse comando será executado ANTES da função original');
  foo.apply(this, arguments); // Chamada da função original
  alert('Esse comando será executado DEPOIS da função original');
};

Como puderam notar, a mágica está em atribuir a função para outra variável, e então criar outra função que execute a função original. O comando “apply” está presente em todas as funções e permite executar outra função em um contexto diferente, passando um array de parâmetros (que em todas as funções podem ser acessadas pela variável “arguments”).
Nesse caso então, podemos executar quaisquer comandos antes ou depois do apply que chama a função original encaminhando os parâmetros recebidos para a função original.

Espero que tenha sido útil !

Até mais !

“A mente é um fogo a ser aceso, não um vaso a preencher.”
– Plutarco

Como transformar uma string delimitada em linhas no Oracle?

Boa tarde !

Hoje vou escrever sobre um assunto que me foi questionado nos comentários de um post anterior. No outro post, eu mostrei algumas maneiras de transformar várias linhas de uma tabela em apenas uma linha via select, com valores separados por um delimitador. Após algum tempo da publicação, recebi um comentário de um leitor perguntando como seria possível fazer o inverso, ou seja, transformar uma string de uma linha só, com vários valores separados também por um delimitador em várias linhas.

Para resolver a questão pensei em duas formas:

  1. Utilizando uma função PIPELINED

    Essa solução tem a lógica mais simples, pois é criada uma função em PL/SQL onde há um loop que percorre a string inteira a procura de ocorrências do delimitador. Essa função deve ser PIPELINED, ou seja, retorna uma espécie de “tabela em memória”.
    Segue o código da package com a função:
    CREATE OR REPLACE PACKAGE PKG_SEPARA AS
      TYPE linhas IS TABLE OF VARCHAR2(32000);
      FUNCTION explodir(p_string IN CLOB, p_delimiter IN VARCHAR2) RETURN linhas PIPELINED;
    END pkg_separa;
    /
    
    CREATE OR REPLACE PACKAGE BODY PKG_SEPARA AS
      FUNCTION explodir(p_string IN CLOB, p_delimiter IN VARCHAR2) RETURN linhas PIPELINED AS
        v_linha varchar2(32000);
        v_cont  number := 1;
        v_ate   number;
      BEGIN
        loop
          v_ate := instr(substr(p_string,v_cont), p_delimiter);
          if (v_ate = 0 and v_cont < length(p_string)) then
            v_ate := length(p_string);
          end if;
          v_linha := substr(substr(p_string,v_cont), 1, v_ate - 1);
          v_cont := v_cont + v_ate;
          exit when trim(v_linha) is null;
          pipe row (v_linha);
        end loop;
      END explodir;
    END PKG_SEPARA;
    /
    
    E para testarmos:
    select *
      from table(pkg_separa.explodir('1245;45678;7789;64646;4478',';'));
  2. Utilizando uma query recursiva

    Se você não puder ou não quiser criar objetos no banco de dados, é possível fazer com apenas uma query recursiva, utilizando a palavra chave connect e brincando com os levels. Segue o código:

    with str as (select '1245;45678;7789;64646;4478' x, ';' delimiter from dual)
    select substr(str.x
                 ,instr(str.delimiter||ltrim(str.x,str.delimiter),str.delimiter,1,level)
                 ,instr(rtrim(str.x,str.delimiter)||str.delimiter,str.delimiter,1,level)
                 -instr(str.delimiter||ltrim(str.x,str.delimiter),str.delimiter,1,level)) a
    from str
    connect by level <= regexp_count(str.x, str.delimiter) + 1;

    [UPDATE] O leitor Márcio Faria sugeriu um outro exemplo bem bacana e muito mais limpo. Segue o código:

    SELECT regexp_substr(info, separador, 1, LEVEL) info
      FROM (SELECT '1245;45678;7789;64646;4478' info, '[^;]+' separador FROM dual)
    CONNECT BY regexp_substr(info, separador, 1, LEVEL) IS NOT NULL

Bom, é isso. Testei os códigos acima com o Oracle 11g, tanto com strings varchar2 ou clob.

Até mais!

No inferno, os lugares mais quentes são reservados àqueles que escolheram a neutralidade em tempo de crise.
– Dante Alighieri

Desvendando a URL do APEX

Saudações!

Hoje vou explicar de forma muito simples o padrão de URL utilizado pelo Oracle Application Express.

URL Autoexplicativa:

 http://apex.oracle.com/pls/apex/f?p=1:2:3:4:5:6:7:8:9

Onde:

  • apex.oracle.com:  Domínio ende se encontra o servidor
  • /pls: Indica que o servidor está utilizando Apache com o mod_plslq para conexão com o APEX
  • /apex: É o dad (Database Access Descriptor) configurado no apache, que indica em qual base se conectar.
  • f?p=  ” f ” é a procedure do APEX acessada que recebe as solicitações, e ” p ” indica os parâmetros como veremos a seguir:

 

1 – A plicação: É o ID ou alias de sua aplicação. Pode ser acessado na aplicação como :APP_ID
2 – Página: Número ou alias da página. Pode ser acessado por :APP_PAGE_ID
3 – Sessão: Número da sessão atual. Se for nulo, o banco cria uma automaticamente e se a página for pública, pode usar o zero. É acessado por :APP_SESSION
4 – Requisição: Parâmetro que pode ser usado para identificar uma ação específica prevista na página, os botões por exemplo, utilizam para submitar a página com uma ação específica (CREATE, DELETE, etc). Pode ser acessado internamente por :REQUEST
5 – Debug: Pode ser basicamente YES, NO ou LEVELn. Define se a página será carregada gravando dados do processamento para posteriormente serem debugados. No caso do LEVEL, ele loga apenas eventos em um determinado nível de debug, para que seja mais legível e direto. Possui outros valores possíveis, como REMOTE, mas que infelizmente não são muito utilizados. Acessado como :DEBUG
6 – Limpar Cache: Limpa o cache (valor dos itens) de uma ou mais páginas. Para isso basta incluir o número das páginas que deseja limpar o cache separado por vírgulas. É possivel também redefinir a paginação de um relatório na página com o comando RP. Também aceita o valor APP para limpar o cache de toda aplicação (incluindo intens de aplicação) e SESSION que é parecido com o APP, porém limpa o cache de todas as aplicações que utilizam aquela sessão.
7 – Nome do Item: Uma lista de nome de itens (separados por vírgula) para terem valores assimilados por url.
8 – Valor do Item: Uma lista de valores dos itens previamente declarados no parametro anterior, seguindo a mesma ordem. Algo importante é que os valores não podem conter “ponto e vírgula” e apenas podem conter vírgulas caso o valor esteja entre barras. ex.: \1,99\
9 – Amigável para impressão: Determina se a  ágina deve ser renderizada em modo de impressão. Geralmente este último parâmetro não é utilizado. Para ativá-lo é necessário entrar com o valor YES. Pode ser acessado na aplicação com o comando V(‘PRINTER_FRIENDLY’)
Em alguns casos, a aplicação pode estar com o SSP (Session State Protection) ativado. Neste caso, sempre que uma url for acessada, ela recebe um parâmetro adicional:
&cs=15F9976D7DF15FCA7A3B8409CD6FD195 : Onde o “cs” indica que é um checksum da página, o que previne problemas de segurança como a adulteração de URL ou “URL tampering”.

Espero que tenha sido esclarecedor!

Se você deseja obter mais detalhes, pode verificar diretamente na documentação oficial.

É isso ai!

Muitas coisas não ousamos empreender por parecerem difíceis; entretanto, são difíceis porque não ousamos empreendê-las.
– Séneca

Afinal de contas: O quê é, e pra que serve o jQuery ?! – Parte 1

Boa noite leitores! rs

hoje irei abordar um tema que gera muitas dúvidas em pessoas que estão começando a desvendar o maravilhoso mundo do desenvolvimento web: jQuery !

Como o assunto é um pouco extenso, vou dividir o artigo em duas partes. Nessa primeira parte irei abordar o conceito por cima, e no próximo me aprofundarei um pouco mais.

Muito se houve falar hoje em dia em jQuery, mas para muitos ainda é um tremendo mistério. Ouvimos e lemos diariamente sobre as fantásticas feitiçarias funcionalidades que ele possui, que mais parecem ser coisa de outro mundo!

Vou começar então com uma afirmação que pode desapontar a muitos: jQuery é APENAS JAVASCRIPT, e não é capaz de fazer NADA que o javascript não possa fazer !
Bom, quebramos aqui então um mito muito comum onde muitas pessoas acreditam que o jQuery é mágico, e que realiza milagres (em alguns casos pode até facilitar, mas não tanto… rs).
O JavaScript possui algumas limitações (até por questão de segurança) como por exemplo, não acessa arquivos da máquina (como uma foto que está no seu C:), não acessa hardware nenhum da máquina, como CD, webcam, etc. Uma exceção fica por conta do microfone, que pode ser acessado mas apenas pelo Google Chrome (artifício da Google para facilitar as buscas, utilizando voz). Necessidades atuais, tais como Sistemas Operacionais na nuvem e Webapps podem mudar esse cenário em breve, mas isso é um outro tópico.

Você deve estar se perguntando: Então pra que raios eu preciso desse jQuery ai ?!
A resposta é simples: jQuery é uma biblioteca para JavaScript, ou seja ele é um conjunto de códigos que facilita a programação! Com o jQuery, códigos que teriam antes centenas ou milhares de linhas tem apenas dezenas ou menos, e essa é a sua mágica. Não é a toa que o slogan do projeto é: “Escreva menos, faça mais”. Essencialmente, o jQuery ficou famoso também por uma funcionalidade que na verdade é “terceirizado” do Sizzle.js (apesar de as duas terem o mesmo criador) que são os seletores. Para  exemplificar, vou começar a mostrar um pouco de códigos.

O que torna os seletores do jQuery extremamente fáceis, é que eles utilizam os padrões do tão famoso CSS3 e alguns recursos a mais que melhoram ainda mais as possibilidades.

Para começar pelo simples temos que ter em mente que uma página html é um documento estruturado, formado por tags, como div, span, table, etc. Para conhecer melhor a estrutura html visite este site. Quando queremos manipular algum desses elementos, utilizamos o JavaScript como nosso aliado. Para selecionar uma div pelo atributo id (um atributo id deve se único no documento html) nós precisamos realizar o comando:

Com jQuery, esse código seria reduzido para apenas:

Percebem que já existe uma redução no tamanho do código? Isso, ao longo do projeto, ajuda DEMAIS na codificação, porque facilita na criação e na manutenção do código.

No próximo artigo darei mais detalhes e comandos desse tão falado jQuery ai… 😀

 

Quando vires um homem bom, tenta imitá-lo; quando vires um homem mau, examina-te a ti mesmo.
– Confúcio

Como agrupar várias linhas em apenas uma no Oracle ?

Olá gente, aqui estou eu mais uma vez para lhes dar outra dica simples, porém muito útil no dia-a-dia.

Por vezes me deparei com situações em que uma query retornava vários registros, mas eu precisava de apenas 1 registro, com os resultados separados por vírgula, por exemplo. Vou apresentar neste post as 3 maneiras mais simples que encontrei de realizar isto.

Para exemplificar, segue a query “CRUA”:

select ename from emp

ENAME
----------
KING
BLAKE
CLARK
JONES
MARTIN
ALLEN
TURNER
JAMES
FORD
SMITH
SCOTT
ADAMS
MILLER

13 linhas selecionadas

Bom, a primeira (e mais simples) maneira de agrupar essas linhas em uma única linha, é usando a função de grupo (não documentada) WM_CONCAT, que está presente a partir do Oracle 10g. Essa função agrupa a coluna e separa os resultados por uma vírgula (não tem como mudar). Ficaria então assim:

select wm_concat(ename) from emp

ENAME
----------
ADAMS,ALLEN,BLAKE,CLARK,FORD,JAMES,JONES,KING,MARTIN,MILLER,SCOTT,SMITH,TURNER

1 linha selecionada

Um dos problemas desta função é que não está presente em todos os bancos Oracle, e nem tem tem esse dever por não ser documentada. Outro ponto negativo é que os registros sempre são divididos por vírgulas.

A próxima saída para nosso problema seria fazer um autêntico “migué”, utilizando xml para resolver o problema.  MAS COMO ?!
A ideia é simples, criamos um xml com a função xmlelement, depois extraímos o texto do xml e aplicamos a função de grupo xmlagg que é a grande responsável por agrupar os resultados.

Segue código:

select rtrim(xmlagg(xmlelement(e,ename,';').extract('//text()')),';') from emp;

ENAME
----------
ADAMS;ALLEN;BLAKE;CLARK;FORD;JAMES;JONES;KING;MARTIN;MILLER;SCOTT;SMITH;TURNER

1 linha selecionada

Sucesso!
O ponto positivo desta técnica é que podemos agora escolher qual será o separador das strings (no caso eu utilizei um ponto e vírgula). Acredito que essa função xml também só está presente a partir do 10g.

A última solução (mas não menos importante) que irei abordar no tópico de hoje se refere ao comando LISTAGG que está presente nos bancos 11g a partir do release 2.
O grande ponto forte deste comando (além de sua simplicidade, e a capacidade de escolher o separador) é a possibilidade de ordenação dos registros da lista.

Segue código:

select LISTAGG(ename, '#') WITHIN GROUP (ORDER BY ename desc)  from emp;

ENAME
----------
TURNER#SMITH#SCOTT#MILLER#MARTIN#KING#JONES#JAMES#FORD#CLARK#BLAKE#ALLEN#ADAMS

1 linha selecionada

Bom é isso aí gente!
Se rolar alguma dúvida é só postar!

Até mais!

Não há como juntar o pó, se continuo insistindo em sentir a ventania.
–  Reynaldo Martins

Threads em PL/SQL ?

Boa Noite minha gente !

Ainda estou me acostumando com isso aqui, pegando no tranco… hehe

Hoje vou postar um pouco sobre Oracle PL/SQL (e com o tempo vocês vão perceber que eu gosto da coisa… rs)

A dica que vou dar é muito simples mas funcional. Vamos supor que temos um processo que demora muito tempo para ser executado, e não sabemos o porque. O primeiro passo, é claro, seria debugar o seu código. Um método convencional para tal ação seria inserir aluns “dbms_output.put_line” no código. Mas e se você quisesse gravar o resultado desse debug? Você poderia apenas inserir uma linha em alguma tabela temporária. Problema resolvido, certo??? ERRADO !

Para que o insert funcione, é necessário que exista um commit no código, o que pode não ser permitido dependendo do processamento que está sendo feito. Nesse caso, nosso processo iria inserir as linhas mas não conseguiríamos ver (caso o processo nao chegasse ao final) o que não é interessante. Para resolver tal questão, decidi criar uma procedure PRC_LOG que ao ser chamada insere um registro numa tabela de log e commita. Para que esse commit não interfira no “processo pai” que está sendo executado, é necessário que a procedure esteja com o pragma autonomous_transaction. Um pragma define o estado do código, é como se estivéssemos mandando uma mensagem para o compilador do oracle. Existem diversos tipos de pragma, e o que utilizamos (autonomous_transaction) serve para executar o processo em modo “autônomo”, ou seja de modo independente ao processamento atual (em outro contexto). Em programação, esse conceito é conhecido como Thread (ou processamento paralelo) e pode ser aplicado para qualquer coisa além do descrito acima, basta usar a criatividade! =]

Segue então, o código do exemplo acima:

-- create table log (a varchar2(4000));

create or replace procedure PRC_LOG (PARAM in varchar2) as
  pragma autonomous_transaction;
begin
  insert into LOG values ( PARAM );
  commit;
end PRC_LOG;
/

É isso ai! Simples mas funcional.

Espero que tenham gostado!

Até a próxima =]

Se você enxergar o que está por trás de todas as coisas sem exceção, então tudo se tornará transparente para você. Mas um mundo completamente transparente é um mundo invisível.
– C.S. Lewis 

Hello world ! ;P

Olá pessoal,

Faz um tempo que estou pensando em fazer um blog para compartilhar algumas coisas com quem tiver interessado e decidi me mexer.  Aqui postarei sobre assuntos diversos como informática, música, filosofia, pensamentos e qualquer outra coisa que dê na telha. Espero que possamos discutir bastante para crescermos cada vez mais!

 

Até logo!

“A mente que se abre a uma nova idéia jamais voltará ao seu tamanho original.”
– Albert Einstein