PL / SQL - 如果varchar2的表类型不存在

时间:2017-06-20 01:39:59

标签: oracle plsql

我正在使用一个在游标内部循环的巨大表,所以我想而不是在每次迭代时查询,将特定数据放在表类型中,然后检查循环中是否存在数据。

declare
 type type_product_list is table of varchar(6);
 product_list type_product_list;
begin

SELECT distinct(PRODUCT_NUMBER) 
    BULK COLLECT INTO product_list
    FROM WEB_PRODUCTS web WHERE some conditions;


    FOR i IN 1..product_list.COUNT LOOP
        DBMS_OUTPUT.PUT_LINE(product_list(i)); -- This line printing properly.
    END LOOP;

    IF product_list.EXISTS('00029') THEN  -- This condition always fails
        DBMS_OUTPUT.PUT_LINE('Found');
    ELSE
        DBMS_OUTPUT.PUT_LINE('Not Found');   
    END IF;
end;

输出

00029

00030

00031

00032

.....其他数据

未找到

请帮忙,我怎样才能执行IF块。

*更新

这个问题的主要目的是调用IF块内的函数,如果块本身将在每个迭代中给出动态产品id的游标循环内,即如果产品id存在则调用该函数。

begin

SELECT distinct(PRODUCT_NUMBER) 
        BULK COLLECT INTO product_list
        FROM WEB_PRODUCTS web WHERE some conditions;

OPEN cur_cms_scriptdtl();
    LOOP
        FETCH cur_cms_scriptdtl INTO productId, productName;
        EXIT WHEN cur_cms_scriptdtl%notfound;

        IF product_list.EXISTS(productId) THEN  
           -- Function call
        END IF;

END LOOP;
CLOSE cur_cms_scriptdtl;

2 个答案:

答案 0 :(得分:1)

在集合中,存在方法接收索引作为参数,而不是值。

    IF product_list(i) = '00029' THEN

试试这个:

DECLARE
    type type_product_list is table of varchar(6);
    product_list type_product_list;
    vFound BOOLEAN := false;
BEGIN
    FOR i IN 1..product_list.COUNT LOOP
        dbms_output.put_line(product_list(i));
        IF product_list(i) = '00029' THEN
           vFound := true;
           exit;
        END IF;
    END LOOP;       

    IF vFound THEN
        dbms_output.put_line('Found');
    ELSE
        dbms_output.put_line('Not Found');   
    END IF;
END LOOP;

答案 1 :(得分:1)

经过Oracle文档的一些挖掘和帮助后,我能够在没有FOR LOOP的情况下获得它。

这里的帮助天使是:

的成员
BEGIN

SELECT distinct(PRODUCT_NUMBER) 
        BULK COLLECT INTO product_list
        FROM WEB_PRODUCTS web WHERE some conditions;

OPEN cur_cms_scriptdtl();
    LOOP
        FETCH cur_cms_scriptdtl INTO productId, productName;
        EXIT WHEN cur_cms_scriptdtl%notfound;

        IF productId member of product_list THEN
           -- Function call
        END IF;

END LOOP;
CLOSE cur_cms_scriptdtl;
相关问题