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问题。抱歉,我更新了问题。