SQL em PL / SQL

Neste tutorial, vamos aprender como usar o SQL em PL / SQL. O SQL é o componente atual que cuida da busca e atualização de dados no banco de dados, ao passo que PL / SQL é o componente que processa esses dados. Além disso, neste artigo, também discutiremos como combinar o SQL no bloco PL / SQL.

 

Neste tutorial, você aprenderá –

Transações DML em PL / SQL

CURSOR Concept em PL / SQL

Atributos do cursor

FOR Loop Cursor statement

BULK COLLECT em PL / SQL

Declarações TCL em PL / SQL

Transação Autônoma

Transações DML em PL / SQL

DML significa Idioma de Manipulação de Dados . Essas declarações são usadas principalmente para realizar a atividade de manipulação. Trata-se basicamente das operações abaixo.

Inserção de dados

Atualização de dados

Eliminação de dados

Projeção de dados / busca

Em PL / SQL, podemos fazer a manipulação de dados somente usando os comandos SQL.

Inserção de dados

Em PL / SQL, podemos inserir os dados em qualquer tabela usando o comando SQL INSERT INTO. Este comando levará o nome da tabela, a coluna da tabela e os valores das colunas como a entrada e insira o valor na tabela base.

O comando INSERT também pode levar os valores diretamente de outra tabela usando a instrução ‘SELECT’ ao invés de dar os valores para cada coluna. Através da instrução “SELECT”, podemos inserir tantas linhas como a tabela base contém.

SQL em PL / SQL

Sintaxe Explicação:

A sintaxe acima mostra o comando INSERT INTO. O nome e os valores da tabela são campos obrigatórios, enquanto os nomes das colunas não são obrigatórios se as instruções do inserto tiverem valores para toda a coluna da tabela.

A palavra-chave ‘VALORES’ é obrigatória se os valores forem dados separadamente, como mostrado acima.

SQL em PL / SQL

Sintaxe Explicação:

A sintaxe acima mostra o comando INSERT INTO que leva os valores diretamente do <table_name2> usando o comando SELECT.

A palavra-chave “VALORES” não deve estar presente neste caso, pois os valores não são fornecidos separadamente.

Atualização de dados

Atualização de dados simplesmente significa uma atualização do valor de qualquer coluna na tabela. Isso pode ser feito usando a instrução ‘UPDATE’. Esta declaração leva o nome da tabela, o nome da coluna e o valor como entrada e atualiza os dados.

SQL em PL / SQL

Sintaxe Explicação:

A sintaxe acima mostra a UPDATE. A palavra-chave ‘SET’ instrui esse mecanismo PL / SQL para atualizar o valor da coluna com o valor fornecido.

A cláusula “WHERE” é opcional. Se esta cláusula não for fornecida, o valor da coluna mencionada em toda a tabela será atualizado.

Eliminação de dados

A eliminação de dados significa excluir um registro completo da tabela do banco de dados. O comando ‘DELETE’ é usado para este propósito.

SQL em PL / SQL

Sintaxe Explicação:

A sintaxe acima mostra o comando DELETE. A palavra-chave ‘FROM’ é opcional e com ou sem a cláusula ‘FROM’ o comando se comporta da mesma forma.

A cláusula “WHERE” é opcional. Se esta cláusula não for fornecida, a tabela inteira será excluída.

Projeção de dados / busca

A projeção / busca de dados significa para recuperar os dados necessários da tabela do banco de dados. Isso pode ser alcançado usando o comando ‘SELECIONAR’ com a cláusula ‘INTO’. O comando ‘SELECT’ vai buscar os valores do banco de dados e cláusula de ‘INTO’ irá atribuir esses valores para a variável local do bloco PL / SQL.

Abaixo estão os pontos que precisam ser considerados na indicação “SELECIONAR”.

A instrução “SELECT” deve retornar apenas um registro enquanto usa a cláusula ‘INTO’, uma vez que uma variável pode conter apenas um valor. Se o ‘SELECT’ instrução retorna mais de um valor de exceção ‘TOO_MANY_ROWS’ será gerado.

A instrução “SELECT” atribuirá o valor à variável na cláusula ‘INTO’, por isso precisa obter pelo menos um registro da tabela para preencher o valor. Se não obteve nenhum registro, então a exceção ‘NO_DATA_FOUND’ é gerada.

O número de colunas e seu tipo de dados na cláusula ‘SELECIONAR’ devem corresponder com o número de variáveis ​​e seus tipos de dados na cláusula ‘INTO’.

Os valores são obtidos e preenchidos na mesma ordem mencionada na declaração.

A cláusula “WHERE” é opcional que permite ter mais restrição nos registros que serão obtidos.

A instrução “SELECT” pode ser usada na condição ‘WHERE’ de outras instruções DML para definir os valores das condições.

A instrução ‘SELECT’ ao usar as instruções ‘INSERT’, ‘UPDATE’, ‘DELETE’ não deve ter a cláusula ‘INTO’, uma vez que não irá preencher nenhuma variável nesses casos.

SQL em PL / SQL

Sintaxe Explicação:

A sintaxe acima mostra o comando SELECT-INTO. A palavra-chave ‘FROM’ é obrigatória que identifica o nome da tabela a partir do qual os dados precisam ser obtidos.

A cláusula “WHERE” é opcional. Se esta cláusula não for fornecida, os dados de toda a tabela serão obtidos.

Exemplo 1 : neste exemplo, vamos ver como executar operações DML em PL / SQL. Vamos inserir os seguintes 4 registros na tabela emp.

EMP_NAME EMP_NO SALÁRIO GERENTE
BBB 1000 25000 AAA
XXX 1001 10000 BBB
AAAA 1002 10000 BBB
ZZZ 1003 7500 BBB

Então, vamos atualizar o salário de ‘XXX’ para 15000, e vamos excluir o registro do funcionário ‘ZZZ’. Finalmente, vamos projetar os detalhes do “XXX” do empregado.

SQL em PL / SQL

SQL em PL / SQL

Explicação do código:

Código linha 2-5 : Declarando a variável.

Código linha 7-14 : Inserindo os registros na tabela emp.

Código linha 15 : Cometer as transações inserir.

Código linha 17-19 : atualizando o salário do empregado ‘XXX’ para 15000

Código linha 20 : Cometer a transação de atualização.

Código linha 22 : Excluindo o registro de ‘ZZZ’

Código linha 23 : Cometer a transação de exclusão.

  • Linha de código 25-27 : Selecionando a gravação de ‘XXX’ e preenchendo na variável l_emp_name, l_emp_no, l_salary, l_manager.

 

Linha de código 28-32 : exibindo o valor de registros obtidos.

CURSOR Concept em PL / SQL

O Oracle cria uma área de memória, conhecida como área de contexto, para processar uma instrução SQL, que contém todas as informações sobre a declaração, por exemplo, número de linhas processadas, etc. O cursor não é senão um ponteiro para essa área de contexto.

O PL / SQL permite ao programador controlar a área de contexto através do cursor. Um cursor contém as linhas retornadas pela instrução SQL. O conjunto de linhas que o cursor mantém é referido como conjunto ativo. Esses cursores também podem ser nomeados para que possam ser encaminhados a partir de outro local do código.

O cursor é de dois tipos.

Cursor implícito

Cursor explícito

Cursor implícito

Sempre que ocorrem operações DML no banco de dados, é criado um cursor implícito que contém as linhas afetadas, naquela operação específica. Esses cursores não podem ser nomeados e, portanto, não podem ser controlados ou encaminhados a partir de outro local do código. Podemos referir-se apenas ao cursor mais recente através dos atributos do cursor.

Cursor explícito

Os programadores podem criar área de contexto nomeada para executar suas operações DML para obter mais controle sobre isso. O cursor explícito deve ser definido na seção de declaração do bloco PL / SQL e é criado para a instrução ‘SELECT’ que precisa ser usada no código.

Abaixo estão as etapas que envolvem o trabalho com cursores explícitos.

Declarando o cursorDeclarar o cursor significa simplesmente criar uma área de contexto nomeada para a instrução ‘SELECIONAR’ que está definida na parte da declaração. O nome dessa área de contexto é o mesmo que o nome do cursor.

Cursor de aberturaAbrir o cursor instruirá o PL / SQL a alocar a memória para este cursor. Ele irá preparar o cursor para buscar os registros.

Obtendo Dados do CursorNeste processo, a instrução ‘SELECT’ é executada e as linhas obtidas são armazenadas na memória alocada. Estes são agora chamados de conjuntos ativos. Obter dados do cursor é uma atividade de nível recorde, o que significa que podemos acessar os dados de maneira recorde por gravação.Cada instrução fetch buscará um conjunto ativo e contém as informações desse registro específico. Esta declaração é a mesma que a instrução “SELECIONAR” que obtém a gravação e atribua à variável na cláusula ‘INTO’, mas não lançará nenhuma exceção.

Fechar o cursorUma vez que todos os registros são buscados, precisamos fechar o cursor para que a memória alocada para essa área de contexto seja lançada.

SQL em PL / SQL

Sintaxe Explicação:

  • Na sintaxe acima, a parte de declaração contém a declaração do cursor e a variável de cursor na qual os dados obtidos serão atribuídos.
  • O cursor é criado para a instrução ‘SELECT’ que é dada na declaração do cursor.
  • Na parte de execução, o cursor declarado é aberto, recuperado e fechado.

Atributos do cursor

Tanto o cursor implícito como o cursor explícito possuem certos atributos que podem ser acessados. Esses atributos fornecem mais informações sobre as operações do cursor. Abaixo estão os diferentes atributos do cursor e seu uso.

Atributo do Cursor Descrição
%ENCONTRADO Retorna o resultado booleano ‘VERDADEIRO’ se a operação de busca mais recente forçou uma gravação com sucesso, caso contrário, ela retornará FALSA
%NÃO ENCONTRADO Isso funciona da maneira oposta ao% FOUND retornará ‘TRUE’ se a operação de busca mais recente não puder obter qualquer registro.
%ESTÁ ABERTO Retorna o resultado booleano ‘TRUE’ se o cursor já estiver aberto, caso contrário ele retorna ‘FALSE’
%CONTAGEM DE LINHAS Ele retorna o valor numérico. Ele fornece a contagem real de registros que foram afetados pela atividade DML.

Exemplo 1 : neste exemplo, vamos ver como declarar, abrir, buscar e fechar o cursor explícito.

Vamos projetar todos os funcionários nome da tabela emp usando um cursor. Nós também usaremos o atributo do cursor para definir o loop para buscar toda a gravação a partir do cursor.

SQL em PL / SQL

Explicação do código:

  • Código linha 2 : Declarando o cursor guru99_det para a instrução ‘SELECT emp_name FROM emp’.
  • Código linha 3 : Declaração variável lv_emp_name.
  • Código linha 5 : abrindo o cursor guru99_det.
  • Código linha 6: Configurando a instrução do loop básico para buscar todos os registros na tabela ‘emp’.
  • Código linha 7: Obtém os dados guru99_det e atribua o valor a lv_emp_name.
  • Código linha 9: Usando o atributo do cursor ‘% NOTFOUND’ para descobrir se toda a gravação no cursor é buscada. Se for obtido, ele retornará ‘VERDADEIRO’ e o controle sairá do loop, senão o controle continuará comprando os dados do cursor e imprimindo os dados.
  • Código linha 11: condição EXIT para a instrução loop.
  • Linha de código 12: Imprima o nome do funcionário buscado.
  • Linha de código 14: Usando o atributo de cursor ‘% ROWCOUNT’ para encontrar o número total de registros que foram afetados / recuperados no cursor.
  • Código linha 15: Depois de sair do loop, o cursor é fechado e a memória alocada está livre.

FOR Loop Cursor statement

A indicação “PARA LOOP” pode ser usada para trabalhar com cursores. Podemos dar o nome do cursor em vez do limite de intervalo na instrução FOR loop para que o loop funcione a partir da primeira gravação do cursor para a última gravação do cursor. A variável do cursor, a abertura do cursor, a busca e o fechamento do cursor serão realizadas de forma implícita pelo loop FOR.

SQL em PL / SQL

Sintaxe Explicação:

  • Na sintaxe acima, a parte de declaração contém a declaração do cursor.
  • O cursor é criado para a instrução ‘SELECT’ que é dada na declaração do cursor.
  • Na parte de execução, o cursor declarado é configurado no loop FOR e a variável de loop ‘I’ se comportará como variável de cursor neste caso.

Exemplo 1 : neste exemplo, vamos projetar todo o nome do empregado da tabela emp usando um cursor-FOR loop.

SQL em PL / SQL

Explicação do código:

  • Código linha 2 : Declarando o cursor guru99_det para a instrução ‘SELECT emp_name FROM emp’.
  • Linha de código 4 : Construindo o loop ‘FOR’ para o cursor com a variável de loop lv_emp_name.
  • Código linha 5: Imprimir o nome do funcionário em cada iteração do loop.
  • Código linha 8: Sair do loop

Nota: No cursor Cursor-FOR, os atributos do cursor não podem ser usados, pois a abertura, a busca eo fechamento do cursor são feitos de forma implícita pelo loop FOR.

BULK COLLECT em PL / SQL

O Oracle PL / SQL fornece a funcionalidade de buscar os registros em massa em vez de buscar um a um. Este BULK COLLECT pode ser usado na instrução ‘SELECT’ para preencher os registros em massa ou em busca do cursor em massa. Uma vez que BULK COLLECT obtém o registro em BULK, a cláusula INTO deve sempre conter uma variável de tipo de coleção. A principal vantagem de usar BULK COLLECT é aumentar o desempenho, reduzindo a interação entre o banco de dados eo mecanismo PL / SQL.

SQL em PL / SQL

Sintaxe Explicação:

  • Na sintaxe acima, BULK COLLECT é usado para coletar os dados da indicação ‘SELECT’ e ‘FETCH’.

Cláusula FORALL

O FORALL permite executar as operações DML em dados a granel. É semelhante ao da declaração FOR loop, exceto no FOR loop coisas acontecem no nível recorde, enquanto que no FORALL não existe um conceito LOOP. Em vez disso, todos os dados presentes no intervalo especificado são processados ​​ao mesmo tempo.

SQL em PL / SQL

Sintaxe Explicação:

  • Na sintaxe acima, a operação DML dada será executada para todos os dados que estão presentes entre um intervalo mais baixo e mais alto.

Cláusula de Limite

O conceito de coleta em massa carrega todos os dados na variável de coleta de destino como um volume, ou seja, todos os dados serão preenchidos na variável de coleta em uma única etapa. Mas isso não é aconselhável quando o registro total que precisa ser carregado é muito grande, porque quando o PL / SQL tenta carregar todos os dados, ele consome mais memória de sessão. Por isso, é sempre bom limitar o tamanho desta operação de coleta em massa.

No entanto, esse limite de tamanho pode ser facilmente alcançado através da introdução da condição ROWNUM na instrução ‘SELECT’, enquanto que no caso do cursor isso não é possível.

Para superar este Oracle forneceu uma cláusula ‘LIMIT’ que define o número de registros que precisam ser incluídos no volume.

SQL em PL / SQL

Sintaxe Explicação:

  • Na sintaxe acima, a instrução de busca do cursor usa a instrução BULK COLLECT juntamente com a cláusula LIMIT.

BULK COLLECT Atributos

Semelhante aos atributos do cursor BULK COLLECT tem% BULK_ROWCOUNT (n) que retorna o número de linhas afetadas na n ª declaração DML da instrução FORALL, ou seja, dará a contagem de registros afetados na declaração FORALL para cada valor da coleção variável. O termo ‘n’ indica a seqüência de valor na coleção, para a qual a contagem de linhas é necessária.

Exemplo 1 : neste exemplo, vamos projetar todo o nome do empregado da tabela emp usando BULK COLLECT e também aumentaremos o salário de todos os funcionários em 5000 usando o FORALL.

SQL em PL / SQL

Explicação do código:

  • Código linha 2 : Declarando o cursor guru99_det para a instrução ‘SELECT emp_name FROM emp’.
  • Código linha 3 : Declarando lv_emp_name_tbl como tipo de tabela do VARCHAR2 (50)
  • Código linha 4 : Declarando lv_emp_name como lv_emp_name_tbl tipo.
  • Código linha 6: abrindo o cursor.
  • Código linha 7: Preenchendo o cursor usando BULK COLLECT com o tamanho LIMIT como 5000 intl lv_emp_name variável.
  • Código da linha 8-11: Configurando FOR loop para imprimir toda a gravação na coleção lv_emp_name.
  • Código linha 12: Usando FORALL atualizando o salário de todo o empregado em 5000.
  • Linha de código 14: Comprometer a transação.

Declarações TCL em PL / SQL

O TCL significa declarações de controle de transações. Ele irá salvar as transações pendentes ou reverter a transação pendente. Essas declarações desempenham o papel vital porque, a menos que a transação seja salva, as alterações por meio de instruções DML não serão salvas no banco de dados. Abaixo estão as diferentes declarações TCL.

COMMIT Salva toda a transação pendente
ROLLBACK Descarte toda a transação pendente
SAVEPOINT Cria um ponto na transação até que o retorno pode ser feito mais tarde
ROLLBACK TO Descarte toda a transação pendente até o especificado <save point>

A transação será completa nos seguintes cenários.

  • Quando qualquer uma das declarações acima é emitida (exceto SAVEPOINT)
  • Quando as declarações DDL são emitidas. (DML são declarações de confirmação automática)
  • QUANDO as declarações DCL são emitidas. (DCL são declarações de confirmação automática)

Transação Autônoma

Em PL / SQL, todas as modificações feitas em dados serão denominadas como uma transação. Uma transação é considerada completa quando o save / descarte é aplicado a ele. Se não for salvo / descartar, a transação não será considerada como completa e as modificações feitas nos dados não serão tornadas permanentes no servidor.

Independentemente de uma série de modificações feitas durante uma sessão, PL / SQL tratará toda a modificação como uma única transação e salvar / descartar essa transação afeta todas as mudanças pendentes naquela sessão. A Transação Autônoma fornece uma funcionalidade para o desenvolvedor em que permite fazer alterações em uma transação separada e salvar / descartar essa transação específica sem afetar a transação da sessão principal.

  • Essa transação autônoma pode ser especificada no nível do subprograma.
  • Para fazer qualquer subprograma para funcionar em uma transação diferente, a palavra-chave ‘PRAGMA AUTONOMOUS_TRANSATION’ deve ser fornecida na seção declarativa desse bloco.
  • Ele instruirá esse compilador a tratar isso como a transação separada e salvar / descartar dentro deste bloco não refletirá na transação principal.
  • Emitir COMMIT ou ROLLBACK é obrigatório antes de sair desta transação autônoma para a transação principal porque, em qualquer momento, apenas uma transação pode estar ativa.
  • Então, uma vez que fizemos uma transação autônoma, precisamos salvá-la e concluir a transação, então só podemos voltar para a transação principal.

SQL em PL / SQL

Sintaxe Explicação:

  • Na sintaxe acima, o bloco foi feito como uma transação autônoma.

Exemplo 1 : neste exemplo, vamos entender como a transação autônoma está funcionando.

SQL em PL / SQL

SQL em PL / SQL

Explicação do código:

  • Código linha 2 : declarando l_salary como NUMBER.
  • Código linha 3 : declarando procedimento de bloqueio aninhado
  • Código linha 4 : Fazendo o procedimento nested_block como ‘AUTONOMOUS_TRANSACTION’.
  • Código linha 7-9: aumentando o salário para o empregado número 1002 em 15000.
  • Código linha 10: Comprometer a transação.
  • Código linha 13-16: Imprimir os detalhes salariais dos funcionários 1001 e 1002 antes das alterações.
  • Código linha 17-19: aumentando o salário para o empregado número 1001 em 5000.
  • Código linha 20: Chamando o procedimento aninhado_block;
  • Código linha 21: descartar a transação principal.
  • Código linha 22-25: Imprimindo os detalhes do salário dos empregados 1001 e 1002 após as mudanças.
  • O aumento de salário para o empregado número 1001 não é refletido porque a principal transação foi descartada. O aumento de salário para o empregado número 1002 é refletido porque esse bloco foi feito como uma transação separada e salvo no final.
  • Portanto, independentemente da gravação / descarte na transação principal, as alterações na transação autônoma foram salvas sem afetar as principais alterações de transação.

Resumo

Neste tutorial, aprendemos a combinar o SQL em PL / SQL para manipulação de dados, Cursor Concepts, Cursor-FOR loop e Bulk collect usages. Nós também discutimos as declarações da TCL e como salvar / descartar transações separadamente.

Fonte

https://www.guru99.com/sql-pl-sql.html

Anúncios

Transaction Autonomous – O Que, Quando, Onde e Por Que

Do que se trata o artigo:

Neste artigo será apresentada a utilização do pragma autonomous Transaction para escrita de códigos autônomos em rotinas PL/SQL, as quais são executadas e commitadas na base independentemente do resultado da transação master que invocou essa rotina.


Em que situação o tema é útil:

Esta funcionalidade é bastante utilizada para geração de logs de erro de transação, onde a transação master sofre rollback depois de uma falha, mas é possível gerar um log contento os dados da transação que resultaram no erro.

Um subprograma normalmente tem suas operações salvas ou não no banco de dados de acordo com o que acontece com o programa principal onde ele está inserido. Isso quer dizer que, se uma procedure chama uma função e a procedure falha, nem as alterações feitas pela procedure nem as alterações feitas pela função são salvas na base, afinal trata-se da mesma transação, a qual é atômica (indivisível, ou seja, ou ela toda é commitada ou ela toda sofre rollback). No entanto, se a função contiver o pragma autonomous_transaction, ela se comporta como uma segunda transação, que é isolada e independente, e suas alterações na base podem ser salvas ou não independentemente da transação master que a originou.

A diretiva AUTONOMOUS_TRANSACTION altera a forma com que a transação trata a um subprograma. Um pragma na verdade é uma diretiva de compilação e os subprogramas marcados com este pragma são processados em tempo de compilação e não em tempo de execução, e passam informações diretamente ao compilador.

O termo AUTONOMOUS_TRANSACTION se refere à habilidade do PL/SQL temporariamente suspender a transação corrente e iniciar uma nova transação, totalmente independente, que funciona de forma autônoma com relação à transação original.

Imagine a seguinte situação: Para fins de auditoria, criamos uma tabela de log que contém os dados referentes a todas as alterações feitas nos dados de 5 tabelas críticas do banco de dados da empresa, armazenando o IP da máquina que originou a transação, qual tabela sofreu alteração, o que foi feito, etc, e um trigger é responsável por inserir tais dados nessa tabela. Pois bem, vamos supor então que por um motivo ou outro essa transação tenha falhado. Não desejamos que os logs de auditoria também sofram rollback, pois estaremos perdendo dados preciosos de tentativas frustradas de acesso não autorizado.

Neste caso, o trigger deve disparar um subprograma autônomo, cujo sucesso da transação não dependa do resultado da transação principal que o originou.

A utilização em tratativas de logs de auditoria são comuns e não causam nenhum tipo de problema ao banco de dados, uma vez que não está lidando com tabelas de negócio, ou seja, que guardam dados essenciais para o negócio. Por este motivo a transação autônoma é segura, pois a integridade do banco de dados está resguardada.

Digo isso porque já vi muitos códigos resolvendo regras de negócio com transações autônomas, o que pode gerar um problema grande para o banco de dados. Imagine que a alteração de um valor em uma tabela deve causar alterações em outras tabelas. Se a primeira alteração falha, o ideal é que as demais alterações não ocorram… neste caso o procedimento que faria as demais alterações não poderia jamais ser autônomo!

Qualquer subprograma, como procedures, funções ou até mesmo blocos anônimos PL/SQL podem conter este pragma. No entanto, se for utilizado dentro de pacotes, o pragma deve ser declarado para as funções e procedures que fazem parte do pacote, e não para o pacote em si.

Exemplo de Utilização

Como um exemplo de utilização da transação autônoma, vamos assumir que precisamos gravar logs de erro em uma tabela do banco de dados. Precisamos fazer rollback da transação principal porque ela resultaria em um erro, mas não queremos perder o log do que aconteceu nessa transação. A tabela que conterá os logs de erro possui a seguinte estrutura:

CREATE TABLE tb_log_erros(

  codigo integer,

  msg varchar2(2000),

  data date,

  usuario varchar2(50),

  nm_mach varchar2(100),

  prog varchar2(100)

);

O procedimento que deve ser invocado para inserir o log do erro na tabela é:

CREATE OR REPLACE PROCEDURE grava_log_erros(

   log_codigo IN INTEGER,

   log_msg IN VARCHAR2) IS

PRAGMA AUTONOMOUS_TRANSACTION;

CURSOR cur_erro IS

SELECT machine, program

FROM v$session

WHERE audsid = USERENV(‘SESSIONID’);

PT = Parent Transaction;

CT = Child Autonomous Transaction;

rec cur_erro%ROWTYPE;

BEGIN

   —

   OPEN cur_erro;

   FETCH cur_erro INTO rec;

   CLOSE cur_erro;

   —

   INSERT INTO tb_log_erros values (

       log_codigo,

       log_msg,

       SYSDATE,

       USER,

       rec.machine,

       rec.program

   );

   COMMIT;

EXCEPTION

   WHEN OTHERS THEN

       ROLLBAACK;

END;

/

Para testar o código acima, podemos executar o seguinte bloco anônimo PL/SQL:

BEGIN

    INSERT INTO HR.EMPLOYEES (first_name) VALUES (‘Maria’);

    COMMIT;

EXCEPTION

    WHEN OTHERS THEN

         grava_log_erros(SQLCODE,SQLERRM);

    ROLLBACK;

    RAISE;

END;

Ao executar o código acima, basta verificar nas tabelas EMPLOYEES e TB_LOG_ERROS as linhas inseridas, como segue:

SQL> select * from employees where first_name = ‘Maria’;

no rows selected.

SQL> select codigo, msg from tb_log_erros;

CODIGOMSG

——————————————————————————————————–

-1400ORA-01400: cannot insert NULL into (“HR”.”EMPLOYEES”.”EMPLOYEE_ID”)

Referências

BURLESON CONSULTING. PL/SQL Autonomous Transaction Tips. Burleson Consulting, 2015. Disponivel em: http://www.dba-oracle.com/t_autonomous_transaction.htm

ORACLE HELP CENTER. Autonomous_transaction Pragma. Database PL/SQL User’s Guide and Reference, 2017. Disponivel em: https://docs.oracle.com/cd/B19306_01/appdev.102/b14261/autonotransaction_pragma.htm

14 Comandos SQL – Administrando seu Site WordPress

Uma maneira prática de executar comandos SQL é através do phpMyAdmin. Até a hospedagem mais básica dá acesso à ferramenta de banco de dados, então não há dificuldades nisso. Uma vez no sistema, você deve selecionar aba “SQL” e escrever/colar a instrução SQL que deseja executar.

Importante

Os comandos SQL para WordPress a seguir são para o prefixo padrão do WordPress “wp_”. Caso o prefixo de suas tabelas seja diferente (o que é recomendado, por questões de segurança), faça os devidos complementos necessários às queries.

×

Importante

Lembre-se: é sempre bom fazer um backup completo de seu banco de dados antes de executar queries SQL (principalmente se você não souber muito bem o que está fazendo)!

1. Alterar siteurl e homeurl

WordPress armazena o caminho absoluto da URL do site (“siteurl”) e URL da home (“homeurl”) no banco de dados. Portanto, se você transferir o seu site WordPress do localhost para o servidor, por exemplo, o site não vai carregar! Isso ocorre porque o caminho absoluto ainda está apontando para o seu localhost. Você vai precisar executar um comando para resolver isso.

1
2
3
4
UPDATE wp_options
 SET option_value = replace(option_value, 'http://www.enderecoantigo.com', 'http://www.endereconovo.com')
 WHERE option_name = 'home'
 OR option_name = 'siteurl';

2. Alterar GUID

Depois de migrar seu blog a partir de, por exemplo, localhost, para o servidor ou de um outro domínio para um novo domínio, você terá que corrigir as URLs para o campo GUID na tabela wp_posts. Isto é crucial, porque GUID é usado para montar o slug de seu post do caminho absoluto do artigo correto.

1
2
UPDATE wp_posts

3. Alterar URL no conteúdo

O WordPress utiliza caminhos absolutos no URL ao invés de um caminho relativo quando vai armazená-los no banco de dados. Dentro do conteúdo de cada registro de artigo, ele armazena todas as URLs antigas referenciando as fontes antigas. Portanto, você precisará alterar todas essas URLs com o endereço do novo domínio.

1
2
UPDATE wp_posts
SET post_content = REPLACE (post_content, 'http://www.enderecoantigo.com', 'http://www.endereconovo.com');

4. Alterar apenas o caminho das imagens

Caso seja preciso alterar o domínio das imagens inseridas nas páginas e artigos, esta solução vai ajudar você a fazer isso de forma simples.

1
2
UPDATE wp_posts
SET post_content = REPLACE (post_content, 'src="http://www.enderecoantigo.com', 'src="http://www.endereconovo.com');

Também é preciso atualizar o GUID para o tipo “attachment” com a seguinte instrução SQL:

1
2
UPDATE wp_posts
SET guid = REPLACE (guid, 'http://www.enderecoantigo.com', 'http://www.endereconovo.com') WHERE post_type = 'attachment';

5. Atualizar Post Meta

Atualizar Post Meta funciona quase da mesma maneira como atualizar a URL no conteúdo do post. Se você tiver dados extras para cada post, você pode usar a seguinte instrução para alterar todos eles.

1
2
UPDATE wp_postmeta
SET meta_value = REPLACE (meta_value, 'http://www.enderecoantigo.com','http://www.endereconovo.com');

6. Alterar o nome usuário padrão “admin”

Apesar de que na versão 3 do WordPress o usuário “admin” poderá ser alterado no momento da instalação, não custa deixar para a posteridade a dica de como alterar o nome do “admin”.

1
2
3
UPDATE wp_users
SET user_login = 'nomequevocequiser'
WHERE user_login = 'Admin';

7. Resetar password

Já quis resetar sua senha no WordPress mas, por algum motivo, não conseguiu usar a seção para resetar o password? Eis a solução:

1
2
3
UPDATE wp_users
SET user_pass = MD5('senha')
WHERE user_login = 'login';

8. Transferir artigos de um autor para outro

Para transferir os artigos de um autor para outro, você gasta um tempo enorme se fizer isso manualmente. Com o comando SQL a seguir, é possível fazer isso facilmente. Para a dica, é preciso saber o ID dos autores.

1
2
3
UPDATE wp_posts
SET post_author = 'id_novo_autor'
WHERE post_author = 'id_autor_antigo';

9. Apagar revisões

Quando se está editando um artigo no WordPress, é comum cópias de segurança serem feitas para garantir o trabalho feito. São as chamadas “revisões”. Com o tempo, o número de registros de revisões fica grande e isso pode comprometer a performance do banco de dados. Para apagar todas as revisões de artigos, dê o seguinte comando SQL:

1
2
3
4
DELETE a,b,c FROM wp_posts a
LEFT JOIN wp_term_relationships b ON (a.ID = b.object_id)
LEFT JOIN wp_postmeta c ON (a.ID = c.post_id)
WHERE a.post_type = 'revision'

Lembrando que este é o comando para apagar revisões já feitas. Caro queira desativar o recurso (ou limitar o número de revisões), saiba como neste artigo sobre como limitar e desativar revisões de posts no WordPress.

10. Apagar post meta

Instalar e remover plugins é algo corriqueiro quando se trabalha com WordPress. Alguns plugins precisam de criar alguns post meta para funcionarem corretamente e, para esses casos, não é raro o acontecimento de, mesmo depois de o plugin ser desinstalado, algum “garbage meta” ficar enchendo o BD desnecessariamente. Uma limpeza em algum valor de post meta, às vezes, se faz necessária.

1
2
DELETE FROM wp_postmeta
WHERE meta_key = 'nome-chave-meta';

11. Exportar todos os e-mails de comentários

Quanto mais tempo seu blog/site fica no ar, é provável que mais comentários receba nos artigos publicados. Se, por algum motivo, for preciso uma listagem com e-mail de todas as pessoas que já comentaram até então, basta executar o seguinte comando:

1
2
SELECT DISTINCT comment_author_email
FROM wp_comments;

12. Apagar todos pingbacks

A medida que o site/blog fica no ar – e se você tiver bom conteúdo a oferecer – o número de pingbacks começa a influenciar a qualidade do banco de dados. Para apagar todos pingbacks, proceda da seguinte maneira:

1
DELETE FROM wp_comments WHERE comment_type = 'pingback';

13. Apagar todos comentários de SPAM

Sem maiores explicações, eis a maneira de deletar todos os comentários marcados como SPAM:

1
2
DELETE FROM wp_comments
WHERE comment_approved = 'spam';

14. Identificar tags não usadas

Num banco de dados WordPress, se você executar alguma query SQL para apagar posts, as tags relacionadas não serão apagadas e continuarão aparecendo na nuvem de sugestão de tags e listagem de tags. Para identificar esse tipo de tag, execute a seguinte instrução SQL:

1
2
3
4
5
SELECT * From wp_terms wt
INNER JOIN wp_term_taxonomy wtt
ON wt.term_id=wtt.term_id
WHERE wtt.taxonomy='post_tag'
AND wtt.count=0;

 

Fonte: Este é um artigo traduzido do original “13 Useful WordPress SQL Queries You Wish You Knew Earlier“, do blog Onextrapixel, e sofreu algumas adaptações, tradução por Tárcio Zemel do DPW.

http://pixelproject.com.br/15-fantasticos-comandos-sql-para-wordpress/