Oracle PL/SQL-如果在varchar2的表类型中存在,则不工作

Oracle PL/SQL-如果在varchar2的表类型中存在,则不工作,oracle,plsql,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_PRODU

我使用的是一个巨大的表,它在游标中循环,因此我认为,与其在每次迭代中查询,不如将特定的数据放在一个表类型中,然后检查循环中是否存在数据

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块内的函数,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;

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

    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;

在Oracle文档的一些挖掘和帮助下,我能够在没有FOR循环的情况下获得它

这里的帮助天使是:的成员

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;

谢谢你的回答,但是这个if块已经在游标循环中了,所以嵌套循环听起来不是个好主意。这只是一个如何测试if中的值的示例。把IF放在你需要的地方。我认为,根据测试值的来源,您可以使用IN或循环、隐式游标等。@Mohd.Umar请运行此代码。它应该可以正常工作。如果不是..那么我想您在查询中遗漏了一些信息。对不起,我的数据是5位数字,所以失败了。这应该解决什么业务问题?似乎您正在用PL/SQL(非常低效)做一些应该用普通SQL来做的事情。典型的XY问题。抱歉,我更新了问题。