create or replace PROCEDURE UPD_RELATEDPPS
IS


TYPE tp_tab_product IS  TABLE  OF  product_ranking.product_id%TYPE
   INDEX   BY   BINARY_INTEGER;
  
-- product array
tab_products   tp_tab_product;

--supplier cursor
CURSOR cur_supplier_id IS
    SELECT distinct(supplier_id)
    FROM product_ranking;
   
--v_supp_id  cur_supplier_id%ROWTYPE;
v_supp_id product_ranking.supplier_id%TYPE;
--supplier count
i BINARY_INTEGER := 0;

--product cursor
CURSOR cur_product_id (supp_id product_ranking.supplier_id%TYPE)IS
SELECT product_id
  FROM product_ranking
 WHERE supplier_id = supp_id;
v_pdt_id  product_ranking.product_id%TYPE;
--product count
j BINARY_INTEGER := 0;
pdt_cnt number default 0;

--key array for related PP (3 recs)
TYPE tp_pdt_key IS  TABLE  OF  number
   INDEX   BY   BINARY_INTEGER;
data_pdt_key tp_pdt_key;

--function to get relatedPP's key
FUNCTION getRelatePPKey(v_pdt_cnt number default 0,
                        pdt_k number default 0
                          ) RETURN tp_pdt_key AS

v_pdt_key tp_pdt_key;
BEGIN
v_pdt_key.delete;
IF  v_pdt_cnt = 2 THEN
   IF pdt_k =1 THEN
   v_pdt_key(1) := 2;
   ELSIF pdt_k = 2 THEN
   v_pdt_key(1) := 1;
   END IF;
END IF;

IF  v_pdt_cnt = 3 THEN
 IF pdt_k =1 THEN
   v_pdt_key(1) := 2;
   v_pdt_key(2) := 3;
   ELSIF pdt_k = 2 THEN
      v_pdt_key(1) := 3;
      v_pdt_key(2) := 1;
  ELSIF pdt_k = 3 THEN
      v_pdt_key(1) := 1;
      v_pdt_key(2) := 2;
   END IF;
END IF;

IF  v_pdt_cnt > 3 THEN
    IF pdt_k <= v_pdt_cnt - 3 THEN
      v_pdt_key(1) := pdt_k + 1 ;
      v_pdt_key(2) := pdt_k + 2 ;
      v_pdt_key(3) := pdt_k + 3 ;
    ELSIF pdt_k = v_pdt_cnt - 2 THEN
      v_pdt_key(1) := pdt_k + 1 ;
      v_pdt_key(2) := pdt_k + 2 ;
      v_pdt_key(3) := 1 ;
    ELSIF pdt_k = v_pdt_cnt - 1 THEN
      v_pdt_key(1) := pdt_k + 1 ;
      v_pdt_key(2) := 1 ;
      v_pdt_key(3) := 2 ;
    ELSIF pdt_k = v_pdt_cnt  THEN
      v_pdt_key(1) := 1 ;
      v_pdt_key(2) := 2 ;
      v_pdt_key(3) := 3 ;
    END IF;
   
END IF;

return v_pdt_key;
exception
  when others then
       return v_pdt_key;
END;

BEGIN

OPEN cur_supplier_id;
LOOP --supplier loop
   FETCH cur_supplier_id INTO v_supp_id;
   EXIT WHEN cur_supplier_id%NOTFOUND;
   --DBMS_OUTPUT.PUT_LINE('supplier_id: ' || v_supp_id);

   tab_products.delete;
   OPEN cur_product_id(v_supp_id);
   j := 0;
   LOOP
       FETCH cur_product_id INTO v_pdt_id;
       EXIT WHEN cur_product_id%NOTFOUND;
       --DBMS_OUTPUT.PUT_LINE('==product_id:  '||(j+1)  ||' ' || v_pdt_id);
       j := j+1;
       tab_products(j):= v_pdt_id;
   END LOOP;-- end of product loop
   CLOSE cur_product_id;

   pdt_cnt := tab_products.COUNT ;


/******************update related PPs**********************************/
    FOR k IN 1..pdt_cnt LOOP
       data_pdt_key.delete;
       data_pdt_key := getRelatePPKey (pdt_cnt,k);

         IF (data_pdt_key.COUNT = 3) THEN
         UPDATE product_ranking
           SET related_product_id1 = tab_products(data_pdt_key(1)),
               related_product_id2 = tab_products(data_pdt_key(2)),
               related_product_id3 = tab_products(data_pdt_key(3))
         WHERE supplier_id=v_supp_id
           AND product_id=tab_products(k);
         END IF;
        
         IF (data_pdt_key.COUNT = 2) THEN
         UPDATE product_ranking
           SET related_product_id1 = tab_products(data_pdt_key(1)),
               related_product_id2 = tab_products(data_pdt_key(2))
         WHERE supplier_id=v_supp_id
           AND product_id=tab_products(k);
         END IF;
        
         IF (data_pdt_key.COUNT = 1) THEN
         UPDATE product_ranking
            SET related_product_id1 = tab_products(data_pdt_key(1))
          WHERE supplier_id=v_supp_id
            AND product_id=tab_products(k);
         END IF;

    END LOOP;--end of pdt_cnt loop

COMMIT;
/****************update related PPs*****************/

END LOOP;-- end of supplier loop

CLOSE cur_supplier_id;

EXCEPTION
    WHEN NO_DATA_FOUND THEN
       DBMS_OUTPUT.PUT_LINE('End of updating related products in product_ranking');

END; -- Procedure


GRANT EXECUTE ON UPD_RELATEDPPS TO AAAA;

----------------------------------------------------------------------------------------

1.cursor : 
CURSOR cur_product_id (supp_id product_ranking.supplier_id%TYPE)IS
SELECT product_id
  FROM product_ranking
 WHERE supplier_id = supp_id;
----------
 OPEN cur_product_id(v_supp_id);
   LOOP
       FETCH cur_product_id INTO v_pdt_id;
       EXIT WHEN cur_product_id%NOTFOUND;
       DBMS_OUTPUT.PUT_LINE('---------snow ------------');
       tab_products(j):= v_pdt_id;
   END LOOP;
   CLOSE cur_product_id;

note : FETCH cur_product_id INTO v_pdt_id;
       EXIT WHEN cur_product_id%NOTFOUND; 这两句要挨在一起,否则cursor 会多一条记录,(最后一个记录重复出现两次)

2.funcion define :

 PROCEDURE FUNNEL_LOGIC_UPD_RELATEDPPS
 IS
  function ABC(){
  }
 BEGIN
 END

3.array define ,数组清空
 
 定义:
 TYPE tp_pdt_key IS  TABLE  OF  number
   INDEX   BY   BINARY_INTEGER;
 变量声明:
 data_pdt_key tp_pdt_key;

 数组传递:
 data_pdt_key := getRelatePPKey (pdt_cnt,k);

 数组清空:
data_pdt_key.delete;

4.procedure 结构:


create or replace PROCEDURE FUNNEL_LOGIC_UPD_RELATEDPPS
IS
--type definition
--variable declare
BEGIN

END;

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐