Avançar para a área de conteúdo

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

Na primeira vez que você efetua sign in no developerWorks, um perfil é criado para você. Informações selecionadas do seu perfil developerWorks são exibidas ao público, mas você pode editá-las a qualquer momento. Seu primeiro nome, sobrenome (a menos que escolha ocultá-los), e seu nome de exibição acompanharão o conteúdo que postar.

Todas as informações enviadas são seguras.

  • Fechar [x]

Ao se conectar ao developerWorks pela primeira vez, é criado um perfil para você e é necessário selecionar um nome de exibição. O nome de exibição acompanhará o conteúdo que você postar no developerWorks.

Escolha um nome de exibição de 3 - 31 caracteres. Seu nome de exibição deve ser exclusivo na comunidade do developerWorks e não deve ser o seu endereço de email por motivo de privacidade.

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

Todas as informações enviadas são seguras.

  • Fechar [x]

DB2 9.7: Usando blocos anônimos de PL/SQL no DB2 9.7

Saiba como usar os blocos anônimos de PL/SQL em um ambiente do DB2

Maksym Petrenko, DB2 Open Database Technologies, IBM  
Maksym Petrenko photo
Maksym Petrenko faz parte da equipe DB2 Beta Enablement no Laboratório da IBM em Toronto. Ele ajuda os primeiros usuários a mover seus aplicativos para o código base mais recente e superior do DB2. Maksym trabalha com o DB2 desde 2001 como desenvolvedor, analista de suporte técnico e consultor de serviços de laboratório. Sua experiência inclui suporte a clientes com problemas de instalação, configuração, desenvolvimento de aplicativo e desempenho relacionados a bancos de dados DB2 em plataformas Windows, Linux e UNIX. Maksym é DB2 Advanced Database Administrator e DB2 Application Developer certificado.
Maria Schwenger, DB2 Open Database Technologies, IBM
Photo of Maria Schwenger
Maria Schwenger passou a fazer parte da IBM em 2005 na equipe Entity Analytic Solutions quando já tinha mais de 10 anos de experiência em engenharia de desempenho, arquitetura de banco de dados, administração e desenvolvimento de banco de dados em servidor Oracle e MS SQL, além de ampla experiência em migração de bancos de dados de legado para relacionais. Atualmente, Maria trabalha em um modelo de envolvimento humano com participantes de release inicial para promover a adoção antecipada da DB2 Open Database Technology.

Resumo:  O IBM DB2® para Linux®, UNIX® e Windows® 9.7 passa a fornecer suporte para blocos anônimos de PL/SQL: um recurso que permite que os desenvolvedores de aplicativos PL/SQL testem, solucionem problemas e criem protótipos de novo código processual, simulem execuções de aplicativos e desenvolvam dinamicamente consultas e relatórios complexos ad hoc. Este artigo descreve o conceito de blocos anônimos no DB2 9.7 e ilustra o uso desse recurso utilizando cenários comuns de banco de dados.

Visualizar mais conteúdo nesta série

Data:  06/Fev/2012
Nível:  Introdutório
Atividade:  321 visualizações
Comentários:  


Introdução

Este artigo fornece orientação para o uso de blocos anônimos no DB2 9.7 nos seguintes cenários:

  • Teste, resolução de problemas e desenvolvimento de novos procedimentos armazenados de PL/SQL
  • Simulação de execuções de aplicativos em PL/SQL
  • Desenvolvimento de consultas e relatórios complexos ad hoc durante a execução com o PL/SQL

Revisão de pré-requisitos e requisitos do sistema

Este artigo foi escrito para desenvolvedores de aplicativos PL/SQL e administradores de banco de dados que estão migrando de Oracle para DB2. É necessário entender o conceito de linguagem processual de PL/SQL. Os desenvolvedores de SQL PL devem usar a função correspondente fornecida pelas instruções SQL compostas nativas do DB2.

Para usar os exemplos deste artigo, é preciso ter instalado o DB2 9.7 Workgroup ou Enterprise Edition para Linux, UNIX e Windows. Consulte a seção Recursos para fazer o download de uma versão de avaliação gratuita do DB2 9.7 para Linux, UNIX e Windows.

Uso dos exemplos

Pode-se executar os exemplos usando várias ferramentas, incluindo o processador da linha de comando (CLP) do DB2 e os utilitários de comando (CLPPLUS), ou ferramentas visuais, como o Optim Development Studio. Se planeja executar os exemplos no CLP, será preciso executar o comando SET SQLCOMPAT PLSQL para ativar o reconhecimento do caractere de barra (/) em uma nova linha como caractere de encerramento de instrução PL/SQL.

Para ativar o suporte a tipos de dados de PL/SQL e Oracle, seu banco de dados deve ser criado com a variável de registro DB2_COMPATIBILITY_VECTOR configurada para ORA, como mostra a Listagem 1.


Listagem 1. Configurando a variável de registro DB2_COMPATIBILITY_VECTOR
db2set DB2_COMPATIBILITY_VECTOR=ORA
db2stop
db2start
db2 create db test

Para este artigo, a Listagem 2 oferece um código para criar um aplicativo PL/SQL simples de e-commerce que gerencia os pedidos on-line após a criação de um banco de dados. Também preencheremos as tabelas com alguns dados de amostra.


Listagem 2. Código de exemplo

Acessar o código de exemplo
    

Entendendo blocos anônimos

Os blocos anônimos são estruturas de PL/SQL que fornecem o recurso de criar e executar código processual durante a execução sem o armazenamento persistente do código como objeto de banco de dados nos catálogos do sistema. O conceito de blocos anônimos é semelhante aos shell scripts do UNIX, que permitem que vários comandos inseridos manualmente sejam agrupados e executados como uma etapa. Como o nome indica, blocos anônimos não têm nome, e, por essa razão, não podem ser referenciados a partir de outros objetos. Embora sejam criados dinamicamente, os blocos anônimos podem ser facilmente armazenados como scripts nos arquivos do sistema operacional para execução repetitiva.

Os blocos anônimos são os blocos padrão de PL/SQL. Eles transportam a sintaxe e obedecem às regras que se aplicam a todos os blocos de PL/SQL, incluindo declaração e escopo de variáveis, execução, manipulação de exceção e uso de SQL e PL/SQL.

A compilação e execução de blocos anônimos são combinadas em uma única etapa, enquanto um procedimento armazenado de PL/SQL precisa ser redefinido antes do uso cada vez que sua definição é alterada. Essa é uma das vantagens significativas dos blocos anônimos sobre os objetos de banco de dados persistentemente nomeados, como procedimentos armazenados e funções definidas pelo usuário, pois reduzem o tempo entre a implementação das mudanças no código e a execução real. Isso torna os blocos anônimos muito úteis na solução de problemas, prototipagem e teste de código processual, porque essas são tarefas que normalmente requerem diversas execuções de mudança e execução.

Outro benefício dos blocos anônimos é que eles não criam dependências e não exigem privilégios especiais para criação de objeto, o que pode evitar complicações em um ambiente de produção. Os blocos anônimos oferecem a flexibilidade de executar qualquer sequência processual de ações com base em privilégios simples e selecionados, e permitem testar sem criar ou implicar objetos existentes do banco de dados.

Pode-se executar os blocos anônimos a partir de:

  • SQL (por exemplo, dentro de instruções EXECUTE IMMEDIATE)
  • APIs de DB2, como JDBC e ODBC
  • Várias ferramentas do DB2, incluindo CLP, CLPPlus, Optim Database Administrator e Optim Development Studio

Protótipos de código PL/SQL com blocos anônimos

Na Listagem 3, um desenvolvedor de aplicativos antecipa as necessidades de negócios de um mecanismo para se comunicar (por email) com os clientes definidos na tabela CUSTOMER. Para atender a essa necessidade de forma proativa, ele decide escrever um simples bloco anônimo PL/SQL de protótipo que envia um email com uma mensagem para os clientes na tabela CUSTOMER. Mais tarde, depois que a necessidade de negócios é finalizada, o bloco anônimo com protótipo pode ser aprimorado e facilmente transformado em um novo procedimento armazenado de PL/SQL. Observe que esse bloco anônimo usa novos pacotes integrados, incluindo UTL_SMTP (pacote para envio de emails) e DBMS_OUTPUT (pacote para escrever mensagens para a saída padrão), que fazem parte do DB2 9.7.


Listagem 3. Bloco anônimo PL/SQL simples de protótipo que envia um email com uma mensagem para os clientes na tabela CUSTOMER
SET SERVEROUTPUT ON
/

DECLARE
   conn UTL_SMTP.connection;
   reply UTL_SMTP.reply;
   msg VARCHAR2(1024);
   sender VARCHAR2(255) DEFAULT 'demo\@ca.ibm.com';
   recipients VARCHAR2(255);
   subject VARCHAR2(255) DEFAULT 'Quick notification';
   crlf VARCHAR2(2);

BEGIN
      
  crlf := UTL_TCP.CRLF;
  FOR row IN (SELECT first_name, email FROM customer) LOOP
      DBMS_OUTPUT.PUT_LINE('Sending test email to customer ' || row.first_name || '...');
      recipients := row.email;
      msg := 'FROM: ' || sender || crlf ||
                'TO: ' || recipients || crlf ||
                'SUBJECT: ' || subject || crlf ||
                crlf ||
                'Hi ' || row.first_name || ', this is a test notification.';

      UTL_SMTP.OPEN_CONNECTION('smtp_server.ibm.com', 25, conn, 10, reply );
      UTL_SMTP.HELO(conn, 'localhost');
      UTL_SMTP.MAIL(conn, sender);
      UTL_SMTP.RCPT(conn, recipients);
      UTL_SMTP.DATA(conn, msg);
      UTL_SMTP.QUIT(conn); 
   END LOOP;
END;
/

Output:
Sending test email to customer Mike...
Sending test email to customer Joan...
Sending test email to customer Colin...
Sending test email to customer Graham...
Sending test email to customer Patsy...


Simulando execuções de aplicativos com blocos anônimos

Como mencionado, um dos usos mais comuns dos blocos anônimos é chamar objetos de linguagem processual, em geral, para fins de teste. A Listagem 4 demonstra como simular uma execução de aplicativo com a ajuda de um bloco anônimo de PL/SQL. O código simula uma execução de aplicativo durante a captura de métricas de desempenho. O bloco anônimo simula a criação de 10 pedidos aleatórios para clientes aleatórios a partir da tabela CUSTOMER existente. Ele também imprime os horários de início e encerramento do teste, juntamente com os detalhes do pedido para cada execução. É fácil alterar o número de pedidos de 10 para 20 e então executar novamente esse bloco anônimo sem recompilar. Também é possível incluir mais métrica de desempenho para teste adicional.


Listagem 4. Aplicativo em execução com a ajuda de um bloco anônimo de PL/SQL
SET SERVEROUTPUT ON
/   

DECLARE
   v_customer_id customer.customer_id%TYPE; 
   product_id product.product_id%TYPE:=1;
   o_order_id orders.order_id%TYPE;
   v_test_start TIMESTAMP;
BEGIN
  SELECT CURRENT TIMESTAMP INTO v_test_start FROM dual;   
  FOR k IN 1..10 LOOP 
  	SELECT customer_id INTO v_customer_id FROM customer ORDER BY RAND() FETCH FIRST 1 
		ROW ONLY;                                                             
  	FOR i IN (
                  SELECT product_id, CAST(RAND()*50 as integer)+1 as quantity 
                  FROM product 
                  WHERE ROWNUM < CAST(RAND()*10 as integer)) 
        LOOP                 
      	      add_item_to_shopping_cart(i.product_id, i.quantity); 
        END LOOP;
        create_order(v_customer_id, o_order_id);  
        DBMS_OUTPUT.PUT_LINE('--------------------------------------------');  
  END LOOP; 
  DBMS_OUTPUT.PUT_LINE('Test start: ' || v_test_start);     
  DBMS_OUTPUT.PUT_LINE('Test end  : ' || CURRENT TIMESTAMP);

END;
/  


Output:

Customer           : Mike, Smith
Order creation     : 07-06-2009
Estimated Delivery : 07-09-2009
Status             : Shipped  
Total price        : $ 150,615.44
--------------------------------------------
Customer           : Joan, Jett
Order creation     : 07-06-2009
Estimated Delivery : 07-09-2009
Status             : Shipped  
Total price        : $ 159,445.77
...
...
...
Customer           : Colin, Taylor
Order creation     : 07-06-2009
Estimated Delivery : 07-09-2009
Status             : Shipped  
Total price        : $ 266,242.78
--------------------------------------------
Test start: 2009-07-06-11.10.11.500000
Test end  : 2009-07-06-11.10.11.546000


Gerando relatórios ad hoc com blocos anônimos

Um requisito do relatório comum é concatenar dados de mais de uma coluna em uma única cadeia de caractere. É possível escrever instruções SQL puras com recursão complexa para fazer isso. Em vez disso, porém, é possível usar blocos anônimos para concluir rapidamente essa tarefa com opções de formatação dinâmica e fluxo de lógica simples.

A Listagem 5 mostra como criar um relatório ad hoc com a ajuda de blocos anônimos. O código recupera a lista de todos os clientes que fizeram pedidos de produtos da loja e o valor total de todos os pedidos do mês passado. Os nomes são exibidos em uma linha e são separados por vírgulas.


Listagem 5. Criando um relatório ad hoc com a ajuda de blocos anônimos
SET SERVEROUTPUT ON
/

DECLARE 
     v_customer_names VARCHAR2(4000);
     v_total_sales NUMBER(19,2);
BEGIN
     DBMS_OUTPUT.PUT_LINE('           Last Month Sales Report     ');

     DBMS_OUTPUT.PUT_LINE('---------------------------------------');
     DBMS_OUTPUT.PUT('Customer List: ');
     FOR row IN 
       (SELECT distinct(a.customer_id),first_name, last_name FROM customer a, orders b 
		WHERE a.customer_id=b.order_id AND b.creation_time>CURRENT DATE -1 month)
     LOOP
      v_customer_names := v_customer_names || '"' || row.first_name || ' ' || 
		row.last_name || '", '; 
     END LOOP;
     IF(LENGTH(v_customer_names) > 0) THEN
        v_customer_names := SUBSTR(v_customer_names,1, LENGTH(v_customer_names)-2);
     ELSE
        v_customer_names := 'None';
     END IF; 
     DBMS_OUTPUT.PUT_LINE(v_customer_names); 
     SELECT NVL(SUM(total_price),0) INTO v_total_sales FROM orders WHERE creation_time>
	 CURRENT DATE - 1 month;
     DBMS_OUTPUT.PUT_LINE('---------------------------------------');
     DBMS_OUTPUT.PUT_LINE('Total Sales: ' || TO_CHAR(v_total_sales, '$99,999,999.99')); 
END;
/

Output:

          Last Month Sales Report     ---------------------------------------
Customer List: "Mike Smith", "Joan Jett", "Colin Taylor", "Graham Norton", "Patsy Stone"
---------------------------------------
Total Sales: $ 49,772.56


Conclusão

Este artigo apresentou o seguinte:

  • O recurso de blocos anônimos de PL/SQL apresentado no DB2 9.7.

  • O conceito de blocos anônimos.

  • Como os blocos anônimos podem facilitar o processo de teste, prototipagem e resolução de problemas de código processual.

  • Como os blocos anônimos podem simular execuções de aplicativos.

  • Como usar os blocos anônimos para geração de relatórios ad hoc eficientes.

Com o suporte a blocos anônimos do PL/SQL, é possível ativar rapidamente soluções de PL/SQL no ambiente DB2 usando os scripts de PL/SQL existentes ou usando instruções individuais de PL/SQL e SQL que funcionam com outros sistemas de gerenciamento de banco de dados.


Recursos

Aprender

Obter produtos e tecnologias

Discutir

Sobre os autores

Maksym Petrenko photo

Maksym Petrenko faz parte da equipe DB2 Beta Enablement no Laboratório da IBM em Toronto. Ele ajuda os primeiros usuários a mover seus aplicativos para o código base mais recente e superior do DB2. Maksym trabalha com o DB2 desde 2001 como desenvolvedor, analista de suporte técnico e consultor de serviços de laboratório. Sua experiência inclui suporte a clientes com problemas de instalação, configuração, desenvolvimento de aplicativo e desempenho relacionados a bancos de dados DB2 em plataformas Windows, Linux e UNIX. Maksym é DB2 Advanced Database Administrator e DB2 Application Developer certificado.

Photo of Maria Schwenger

Maria Schwenger passou a fazer parte da IBM em 2005 na equipe Entity Analytic Solutions quando já tinha mais de 10 anos de experiência em engenharia de desempenho, arquitetura de banco de dados, administração e desenvolvimento de banco de dados em servidor Oracle e MS SQL, além de ampla experiência em migração de bancos de dados de legado para relacionais. Atualmente, Maria trabalha em um modelo de envolvimento humano com participantes de release inicial para promover a adoção antecipada da DB2 Open Database Technology.

Ajuda para Relatar Abuso

Relatar abuso

Obrigado. Esta entrada foi sinalizada para atenção do moderador.


Ajuda para Relatar Abuso

Relatar abuso

Falha no envio do Relatório de abuso. Tente novamente mais tarde.


developerWorks: Registre-se


Precisa de um ID IBM?
Esqueceu seu ID IBM?


Esqueceu sua senha?
Alterar sua senha

Ao clicar em Enviar, você concorda com os termos de uso do developerWorks.

 


Na primeira vez que você efetua sign in no developerWorks, um perfil é criado para você. Informações selecionadas do seu perfil developerWorks são exibidas ao público, mas você pode editá-las a qualquer momento. Seu primeiro nome, sobrenome (a menos que escolha ocultá-los), e seu nome de exibição acompanharão o conteúdo que postar.

Selecione seu nome de exibição

Ao se conectar ao developerWorks pela primeira vez, é criado um perfil para você e é necessário selecionar um nome de exibição. O nome de exibição acompanhará o conteúdo que você postar no developerWorks.

Escolha um nome de exibição de 3 - 31 caracteres. Seu nome de exibição deve ser exclusivo na comunidade do developerWorks e não deve ser o seu endereço de email por motivo de privacidade.

(Deve possuir de 3 a 31 caracteres.)


Ao clicar em Enviar, você concorda com os termos de uso do developerWorks.

 


Classificar este artigo

Comentários

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=Information Management
ArticleID=789927
ArticleTitle=DB2 9.7: Usando blocos anônimos de PL/SQL no DB2 9.7
publish-date=02062012

Conheça a IBM da sua cidade

Virtual Branch Office Brasil

A IBM está mais perto do que você imagina!


Tags

Help
Use o campo de pesquisa para encontrar todos os tipos de conteúdo no My developerWorks com essa tag.

Use a barra de rolagem para ver mais ou menos tags.

Tags populares mostra as principais tags para esta zona de conteúdo em particular (por exemplo, Java technology, Linux, WebSphere).

Minhas tags mostra suas tags para esta zona de conteúdo em particular (por exemplo, Java technology, Linux, WebSphere).

Use o campo de pesquisa para localizar todos os tipos de conteúdo no Meu developerWorks com essa tag. Tags populares mostra as tags principais para essa zona de conteúdo particular (por exemplo, tecnologia Java, Linux, WebSphere). My tags shows your tags for this particular content zone (for example, Java technology, Linux, WebSphere). Minhas tags mostra as suas tags para essa zona de conteúdo em particular (por exemplo, tecnologia Java, Linux, WebSphere).