Avançar para a área de conteúdo

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

A primeira vez que acessar o developerWorks, um perfil será criado para você. Informações do seu perfil (tais como: nome, país / região, e empresa) estarão disponíveis ao público, que poderá acompanhar qualquer conteúdo que você publicar. Seu perfil no developerWorks pode ser atualizado a qualquer momento.

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


Retornar para o artigo



Listagem 2. Código de exemplo

CONNECT TO test
/

CREATE USER TEMPORARY TABLESPACE usertemp
/

CREATE SEQUENCE seq_customer_id start WITH 1 INCREMENT BY 1 NO MAXVALUE NO CYCLE NO CACHE
/

CREATE TABLE customer(
	customer_id NUMBER(10) NOT NULL,
	first_name VARCHAR2(30) NOT NULL,
	last_name VARCHAR2(40) NOT NULL,
	email VARCHAR2(100) NOT NULL,
	phone_number char(14) NOT NULL,
	birth_date date NOT NULL,
	registration_time TIMESTAMP(0) DEFAULT SYSDATE NOT NULL)
	/

INSERT INTO CUSTOMER(customer_id, first_name, last_name, email, phone_number, birth_date, 
registration_time) VALUES
   (seq_customer_id.nextval, 'Mike',   'Smith' ,   'mikesmith@yahoo.com', '534-234-2323', 
	TO_DATE('1988-01-16','yyyy-mm-dd'), DEFAULT),
   (seq_customer_id.nextval, 'Joan',   'Jett' ,    'jjett@cardinal.net',  '585-245-1212', 
	TO_DATE('1960-02-02','yyyy-mm-dd'), DEFAULT),
   (seq_customer_id.nextval, 'Colin',  'Taylor' ,  'colin@yahoo.com',     '234-321-2341', 
	TO_DATE('1982-03-16','yyyy-mm-dd'), DEFAULT),
   (seq_customer_id.nextval, 'Graham', 'Norton' ,  'spider@gmail.com',    '416-683-1092', 
	TO_DATE('1985-04-24','yyyy-mm-dd'), DEFAULT),
   (seq_customer_id.nextval, 'Patsy' , 'Stone' ,   'patsy01@yahoo.ca',    '904-643-1432', 
	TO_DATE('1959-05-30','yyyy-mm-dd'), DEFAULT)
 /

CREATE SEQUENCE seq_product_id start WITH 1 INCREMENT BY 1 NO MAXVALUE NO CYCLE NO CACHE
/

CREATE TABLE product(                                                                                                                                            
	product_id NUMBER(10) NOT NULL,                                                                                                          
    category_name VARCHAR2(30) NOT NULL,                                                                                                                     
	product_name VARCHAR2(30) NOT NULL,                                                                                                                            
	product_price NUMBER(8,2) NOT NULL,                                                                                                                            
	inventory_quantity NUMBER default 0 NOT NULL)
/                                                                                                                                                              
                                                                                                                                                                 
INSERT INTO product (product_id, category_name, product_name, product_price, 
inventory_quantity) VALUES                                                                      
   (seq_product_id.nextval, 'Wild Rose',        'Flowers',     19.99, 20000),                                                                                                              
   (seq_product_id.nextval, 'Tulip',            'Flowers',     15.99, 30000),                                                                                                              
   (seq_product_id.nextval, 'Garden Rake',      'Hand Tools',  18.99, 5000),                                                                                                              
   (seq_product_id.nextval, 'Electric Trimmer', 'Power Tools', 68.99, 9000),                                                                                                              
   (seq_product_id.nextval, 'Air Freshener',    'Automotive',  5.99,  44000),                                                                                                              
   (seq_product_id.nextval, 'Wax',              'Automotive',  15.68, 100000),                                                                                                              
   (seq_product_id.nextval, 'Antifreeze',       'Automotive',  20.98, 150000)
/                                                                                                                                                      
                                                                                                                                                              
CREATE SEQUENCE seq_order_id start WITH 1 INCREMENT BY 1 NO MAXVALUE NO CYCLE NO CACHE
/                                                                                            

CREATE TABLE orders(                                                                                                                                             
	order_id NUMBER(10) NOT NULL,                                                                                                                                  
	customer_id NUMBER(10) NOT NULL,                                                                                                                               
	creation_time DATE default sysdate NOT NULL,                                                                                                           
	estimated_delivery_time date,                                                                                                                                  
	total_price NUMBER(8,2) NOT NULL,                                                                                                                              
	order_status VARCHAR2(15),                                                                                                                                     
	CONSTRAINT check_order_status CHECK (order_status IN ('PROCESSING','ENROUTE',
	  'COMPLETE')))
/                                                                                                                                                              
                                                                                                                                                                                                                                                                             
CREATE GLOBAL TEMPORARY TABLE shopping_cart (                                                                                                                    
	product_id NUMBER(10),                                                                                                                                         
	product_quantity NUMBER                                                                                                                                        
) ON COMMIT PRESERVE ROWS
/                                                                                                                                    
                                                                                                                                                                                                                                                                                                                                  
CREATE OR REPLACE PROCEDURE add_item_to_shopping_cart(p_product_id 
shopping_cart.product_id%TYPE, p_product_quantity shopping_cart.product_quantity%TYPE) IS  
       v_total_quantity NUMBER := p_product_quantity;                                                                                                            
       product_exists_in_cart BOOLEAN :=FALSE;                                                                                                                   
       CURSOR test_existence IS SELECT product_quantity FROM shopping_cart 
		WHERE product_id=p_product_id;                                                        
   BEGIN                                                                                                                                                         
       OPEN test_existence;                                                                                                                                      
       FETCH test_existence INTO v_total_quantity;                                                                                                               
       IF(test_existence%FOUND) THEN                                                                                                                             
          UPDATE shopping_cart SET product_quantity=v_total_quantity+p_product_quantity;                                                                         
       ELSE                                                                                                                                                      
          INSERT INTO shopping_cart VALUES(p_product_id, v_total_quantity);                                                                                      
       END IF;                                                                                                                                                   
   END;
/                                                                                                                                                          
	                                                                                                                                                               
CREATE OR REPLACE PROCEDURE create_order (p_customer_id customer.customer_id%TYPE,
o_order_id OUT orders.order_id%TYPE) IS                                    
    CURSOR c_get_shopping_cart IS SELECT product_id, product_quantity FROM shopping_cart;                                                                      
    i INTEGER := 1;                                                                                                                                            
    v_total_price orders.total_price%TYPE := 0;                                                                                                                
    v_product_price product.product_price%TYPE;                                                                                                                
    v_customer customer%ROWTYPE;                                                                                                                               
    v_order orders%ROWTYPE;                                                                                                                                    
  BEGIN                                                                                                                                                         
      FOR shopping_cart_rec IN c_get_shopping_cart LOOP                                                                                                          
          SELECT product_price INTO v_product_price FROM product WHERE product_id=
	  	shopping_cart_rec.product_id;                                                  
          v_total_price := v_total_price + 
		v_product_price*shopping_cart_rec.product_quantity;                                                                   
          i := i + 1;                                                                                                                                            
      END LOOP;                                                                                                                                                  
                                                                                                                                                                 
      IF(i < 1) THEN 
         DBMS_OUTPUT.PUT_LINE('You need to have at least 1 product in your shopping cart');                                                                     
      ELSE
          INSERT INTO orders VALUES(seq_order_id.NEXTVAL, p_customer_id, sysdate, sysdate 
		+ 3.5, v_total_price, 'PROCESSING');                                   
          SELECT * INTO v_customer FROM customer WHERE customer_id=p_customer_id;                                                                                
          SELECT * INTO v_order FROM orders WHERE order_id=seq_order_id.CURRVAL;                                                                                 
          DBMS_OUTPUT.PUT_LINE('Customer           : ' || v_customer.first_name || ', ' || 
		v_customer.last_name);                                                
          DBMS_OUTPUT.PUT_LINE('Order creation     : ' || TO_CHAR(v_order.creation_time,
		'MM-DD-YYYY'));                                                          
          DBMS_OUTPUT.PUT_LINE('Estimated Delivery : ' || TO_CHAR(
		v_order.estimated_delivery_time,'MM-DD-YYYY'));                                                
          DBMS_OUTPUT.PUT_LINE('Status             : ' || DECODE(v_order.order_status,'D', 
		'Delivered', 'Shipped'));                                             
          DBMS_OUTPUT.PUT_LINE('Total price        : ' || TO_CHAR(v_order.total_price , 
		'$999,999.99'));                                                         
      END IF;                                                                                                                                                    
                                                                                                                                                                 
   END create_order;
/  
     

Retornar para o artigo