Mostrando postagens com marcador SQL Commands. Mostrar todas as postagens
Mostrando postagens com marcador SQL Commands. Mostrar todas as postagens

sexta-feira, 25 de setembro de 2020

Explorando o código das páginas do APEX

 Olá,


já precisou saber como o APEX implementa determinada funcionalidade?

Recentemente precisei saber como o App Builder do APEX fazia a exportação e importação de uma aplicação, entretanto, como consultar o código do App Builder?

Como você deve saber, o App Builder é uma aplicação APEX. Basta reparar na URL o "f?p=4000".





Para entender como as aplicações do APEX (App Builder, SQL Workshop etc) funcionam por dentro faça o seguinte:

1) Baixe o arquivo de instalação da versão desejada do APEX em http://apex.oracle.com/download

2) Descompacte o arquivo baixado

3) Acesse a pasta apex > builder

Repare acima que os arquivos na pasta "apex > builder" são fXXXX.sql onde XXXX é o número da aplicação APEX. Essas aplicações são acessadas quando você utiliza o APEX.

4) Logue em algum espaço de trabalho, acesse o App Builder e clique no botão "Importar"

5) Selecione o arquivo desejado e clique em "Próximo >". 

(Na imagem abaixo foi selecionado o AppBuilder, que é a aplicação f4000.sql)

Obs: Esta tela de importação é do APEX 20.1. Em outras versões do APEX a tela pode ser ligeiramente diferente.

6) Clique novamente em "Próximo >"



7) Como sugestão é interessante alterar o ID do aplicativo para um número similar ao da aplicação APEX original. Para isso, selecione "Alterar ID da aplicação" e no campo "Novo Aplicativo" digite 100 antes do número do aplicativo original. No nosso exemplo 1004000, pois a aplicação original tinha o ID 4000.



8) Clique em "Instalar Aplicativo"


Pronto! Agora você pode acessar a aplicação recém-instalada e verificar o código de cada uma das páginas.

Um detalhe é que você provavelmente não conseguirá executar a aplicação, pois deverá faltar privilégios nos objetos de banco internos do APEX, mas isso não impedirá de explorar o código de cada uma das páginas!

Espero que tenha sido útil!

Até a próxima!

quarta-feira, 9 de maio de 2018

Migrando os dados utilizando o Comandos SQL

Olá pessoal,

vamos para nossa última postagem da "trilogia" de posts sobre colocar uma aplicação Apex em operação.

O post de hoje é sobre a migração dos dados de um ambiente para outro.

Normalmente quando estamos colocando uma aplicação em operação, queremos migrar alguns dados. Os principais dados que normalmente tem que ser migrados são os de tipo, por exemplo: TIPO_ALUNO, TIPO_PROCESSO, etc.

Entretanto, em ambientes onde o desenvolvedor consegue fazer alterações diretamente na operação (produção), é comum que ele comece a fazer as alterações diretamente na operação e abandone o ambiente de desenvolvimento. Cuidado com essa má prática!

Vamos abordar duas situações para essa migração de dados:
1) Ambiente de origem e destino no mesmo banco
2) Ambiente de origem e destino em bancos diferentes

MIGRAÇÃO DE DADOS COM AMBIENTES NO MESMO BANCO

Segue um passo a passo para a migração.

Passo 1) Entrar no Comandos SQL do ambiente que contém os dados. (Tenha atenção neste passo, para não errar o ambiente). "SQL Workshop" > "Comandos SQL"




Passo 2)  Copie e cole o script abaixo no Comandos SQL para fornecer os grants de SELECT para seu ambiente de destino. Não esqueça de trocar a variável "v_ambiente_destino" para o nome do seu ambiente de destino!

-----INICIO SCRIPT-----
DECLARE
v_comando VARCHAR2(200);
v_ambiente_destino VARCHAR2(30) := 'APEX_ANDERSON'; --INSIRA SEU AMBIENTE DE DESTINO
BEGIN
--Fornece permissão de leitura em todas as tabelas deste owner
FOR cur IN (SELECT * FROM USER_TABLES) LOOP
     v_comando := 'GRANT SELECT ON "'||cur.table_name||'" TO '||v_ambiente_destino;
     htp.p(v_comando);
     EXECUTE IMMEDIATE v_comando;
END LOOP;
END;
-----TERMINO SCRIPT-----

Passo 3) Clique em "Executar" ("Run" para versão em inglês) (1) e confirme que tudo ocorreu bem no painel inferior (2).



Passo 4) Entre no Comandos SQL do ambiente de destino onde os dados serão carregados. (ATENÇÃO para entrar no ambiente correto!)

Passo 5) Copie e cole o script abaixo no Comandos SQL e clique em "Executar" (ou "Run") para carregar os dados que se encontram no seu ambiente de origem. Não esqueça de trocar a variável "v_ambiente_origem" para o nome do seu ambiente de origem!

-----INICIO SCRIPT-----
DECLARE

v_comando VARCHAR2(200);

v_ambiente_origem VARCHAR2(30) := 'APEX_ANDERSON_DEV';--INSIRA SEU AMBIENTE DE ORIGEM DOS DADOS

BEGIN


--Primeiro desabilite todas as constraints 

FOR i IN (SELECT constraint_name, table_name FROM user_constraints WHERE constraint_type = 'R') LOOP

v_comando := 'alter table "'||i.table_name||'" disable constraint "'||i.constraint_name||'"';

htp.p(v_comando);

EXECUTE IMMEDIATE v_comando;


END LOOP;

--Para todas as tabelas do ambiente de origem serão carregadas as informações. Caso não queira que alguma tabela seja carregada, acrescente ao NOT IN

FOR cur IN (SELECT * FROM ALL_TABLES where owner = v_ambiente_origem AND upper(table_name) NOT IN ('HTMLDB_PLAN_TABLE', 'OUTRA_TABELA')) LOOP

     v_comando := 'INSERT INTO "'||cur.table_name||'" SELECT * FROM "'||v_ambiente_origem||'"."'||cur.table_name||'"';

     htp.p(v_comando);

     EXECUTE IMMEDIATE v_comando;

END LOOP;



--Ao final habilite novamente todas as constraints 


FOR i IN (SELECT constraint_name, table_name FROM user_constraints WHERE constraint_type = 'R') LOOP

v_comando := 'alter table "'||i.table_name||'" enable constraint '||i.constraint_name||'';

htp.p(v_comando);

EXECUTE IMMEDIATE v_comando;


END LOOP;

END;
-----TERMINO SCRIPT-----



Pronto! Seu novo ambiente está com os dados desejados.


Caso seu banco de origem e destino dos dados sejam diferentes, segue outro passo a passo.


MIGRAÇÃO DE DADOS COM AMBIENTES EM BANCOS DIFERENTES


Este procedimento apenas no Apex (sem utilizar ferramenta) com bancos diferentes utiliza um processo bem mais manual. Só vale a pena executá-lo caso você queira migrar um número pequeno de tabelas.

Outro detalhe é que caso sua tabela tenha milhões de registros, como a exportação é web, as vezes não funciona bem.

Ressalto que o procedimento é para bancos diferentes. Caso sua aplicação esteja em workspaces e esquemas diferentes, mas está no mesmo banco, o melhor procedimento é o descrito acima.

Passo 1) Logue no ambiente Apex que contém os dados que deseja exportar (ambiente de origem).

Passo 2) Acesse o Data Workshop. "SQL Workshop > Utilities > Data Workshop"

Passo 3) Na seção "Data Unload", você pode escolher entre gerar um arquivo TXT ou XML com os dados de uma tabela. Para este tutorial, vamos selecionar "to XML"
Nota: Este é um dos pontos ruins da descarga de dados, pois você tem que fazer tabela a tabela.



Passo 4) Selecione as informações que devem ser incluídas no arquivo: owner, nome da tabela e as colunas que serão incluídas.
Essa seleção das colunas é um dos pontos de dificuldade dos desenvolvedores. Caso queira selecionar todas as colunas, clique na primeira coluna, mantenha pressionado o "Shift" no teclado e clique na última coluna ou clique em qualquer coluna e pressione "Ctrl"+A. Caso queira colunas específicas, mantenha pressionado "Ctrl" e vá clicando sobre as colunas desejadas.
Ao final, caso queira que os dados sejam gerados de maneira condicional, adicione algum comando no campo "Where Clause". Por exemplo, podemos descarregar somente os dados que foram criados pelo login "ANDERSONRF" com o comando CREATED_BY = 'ANDERSONRF' conforme mostra a figura abaixo.




Passo 5) Pressione "Unload Data" e o arquivo (XML ou TXT) será gerado.
Nota: Essa ação pode demorar um pouco dependendo da quantidade de dados.


Passo 6) Logue no ambiente de destino dos dados. Fique atento para não errar o ambiente!


Passo 7) Acesse "SQL Scripts" > "Data Workshop"


Passo 8) Na seção "Data Load" escolha o mesmo tipo de arquivo selecionado no Passo 3). (Seguindo nosso tutorial, devemos selecionar "XML Data").


Passo 9) Selecione o esquema, tabela e o arquivo gerado no passo Passo 5) e pressione o botão "Load Data".




Pronto! Agora seus dados foram carregados.


Espero que tenha gostado.

Qualquer problema, poste nos comentários.

Até a próxima!

quarta-feira, 14 de março de 2018

Como apagar todos os objetos de um esquema utilizando o Comandos SQL

Olá pessoal,

este post é para apresentar um script muito interessante que apaga todos os objetos de um esquema, ou seja, deixa o esquema do seu espaço de trabalho vazio.

Lembro que ele não apaga as aplicações, mas apaga todos os objetos e dados do banco.

Passo 1: Logue no espaço de trabalho, entre no "SQL Workshop" > "Comandos SQL"


Passo 2: Copie o comando abaixo e cole na área de texto do Comandos SQL

------INÍCIO SCRIPT-----
--MUITO CUIDADO--
--Este script DROPA todos os objetos do banco de dados

DECLARE 
v_comando VARCHAR2(200);

BEGIN
--Primeiro dropamos as views materializadas, pois internamente o Oracle cria um objeto do tipo TABLE e só permite dropar esse objeto com o comando DROP MATERIALIZED VIEW.
FOR cur IN (SELECT * FROM USER_OBJECTS WHERE OBJECT_TYPE = 'MATERIALIZED VIEW') LOOP

     v_comando := 'DROP MATERIALIZED VIEW "'||cur.object_name||'"';
     htp.p(v_comando);
     EXECUTE IMMEDIATE v_comando;

END LOOP;

--Depois dropamos as tabelas, pois devemos utilizar o comando cascade constraints para excluir em cascata as constraints da tabela
FOR cur IN (SELECT * FROM USER_TABLES) LOOP

     v_comando := 'DROP TABLE "'||cur.table_name||'" cascade constraints';
     htp.p(v_comando);
     EXECUTE IMMEDIATE v_comando;

END LOOP;

--A seguir dropamos os outros objetos (lembrando que package body e jobs são dropados de outra maneira)
FOR cur IN (SELECT * FROM USER_OBJECTS WHERE OBJECT_TYPE NOT IN ('PACKAGE BODY', 'JOB', 'LOB')  ) LOOP

     v_comando := 'DROP ' || cur.object_type  || ' "'||cur.object_name||'"';
     htp.p(v_comando);
     EXECUTE IMMEDIATE v_comando;

END LOOP;

--Comando para dropar as jobs (scheduler jobs)
FOR cur IN (SELECT * FROM USER_scheduler_jobs ) LOOP

     v_comando := 'DBMS_SCHEDULER.drop_job(job_name =>''' ||cur.job_name||''')';
     htp.p(v_comando);
     DBMS_SCHEDULER.drop_job(job_name => cur.job_name);

END LOOP;

--Observação: Caso tenha jobs do tipo JOBS que estão deprecated, consulte a documentação de como dropá-las.

END;

------FIM  SCRIPT-----

Observação: Caso esteja utilizando colunas em tabela do tipo LOB, os objetos do tipo LOB continuarão ocupando espaço em disco. Caso queira liberar o espaço, a tabela que contém o objeto do tipo LOB deve ser "purgada" da lixeira (RECYCLE BIN) com o comando:

PURGE TABLE <<nome tabela>>

Passo 3) Clique no botão "Executar"

Passo 4) Confira o resultado da execução no painel de Resultados localizado na parte inferior. Caso tenha ocorrido algum problema, tente identificar o motivo.


Observação: Normalmente o feedback final do Apex é de "Tabela eliminada.". Esse feedback é incorreto, pois o Comandos SQL do Apex informa apenas o resultado do primeiro comando executado.

Espero que tenha gostado!
Qualquer dúvida ou, sugestão, deixe no comentário!

Até a próxima!

quarta-feira, 28 de fevereiro de 2018

Colocando uma aplicação Apex em operação apenas com o App Builder e SQL Commands

Olá pessoal,

muitos iniciantes tem dúvidas de como colocar uma aplicação em operação (produção) no Apex.

Observação: Em diversos lugares utiliza-se o termo em produção para as aplicações que o usuário final já está operando. Prefiro utilizar o termo em operação, pois está previsto no ITIL e não confunde. Muitas pessoas acham que um sistema em produção é um sistema que ainda está sendo produzido, mas no jargão da TI este termo na verdade significa um sistema já em operação/uso.

Primeiro, gostaria de ressaltar que na verdade toda aplicação Apex já é acessível pelo usuário final como se estivesse em operação (Talvez seja necessário criar um usuário para que ele possa autenticar/logar). Basta divulgar o link!

Segundo, este post e os subsequentes da série abordarão como realizar as operações utilizando apenas o App Builder e o SQL Commands do Apex. Sei que há maneiras melhores de se fazer essas operações utilizando ferramentas!

A boa prática preza que a aplicação deve ser desenvolvida em um ambiente diferente do ambiente de operação.

Portanto, quando você terminar de desenvolver e quiser colocar em operação basicamente deve executar 3 ações de cópia do ambiente de desenvolvimento para o de operação:

1) Copiar o DDL (Data definition language) dos objetos de banco

2) Copiar a aplicação

3) Copiar os dados

Até mais!