我在这里有一个验证初学者的问题:
我有一个选择列表项,选项:产品SKU
如果用户选择SKU选项,则会显示一个新的文本字段Item,供客户记下SKU编号。然后,我的验证会尝试阻止插入无效的SKU。这就是我目前所拥有的:
declare
v_rows_approved_min number;
v_rows_approved_max number;
err varchar2(300);
begin
if :P8_PRODUCT_OR_SKU = 'SKU' -- THIS IS MY SELECT LIST ITEM
then
err := 'Not a valid SKU';
v_rows_approved_min := 1;
select count(*) into v_rows_approved_max from SKU_TABLE;
for cur_a in (select SKU from SKU_TABLE)
loop
exit when v_rows_approved_min > v_rows_approved_max;
if :P8_SKU = cur_a.SKU
then return err;
else null;
end if;
v_rows_approved_min := v_rows_approved_min + 1;
end loop;
else null;
end if;
end;
不知道这里发生了什么,有人能帮忙吗?
谢谢!
此代码过于复杂。它检查表中是否存在页面项值,如果找到匹配项,则返回错误。这是通过一个带有一些额外逻辑的循环来完成的,以在迭代次数达到选择计数时退出循环。最后一个逻辑是不需要的。如果一个表包含5行,那么循环将有5次迭代。无需从表(v_rows_approved_max(中执行SELECT count
,然后检查每个迭代(如果尚未达到该数字(。。。
此外,如果发现不匹配,就没有RETURN
语句,所以它被添加到末尾。
这里有一个重写的尝试:
DECLARE
---- not needed
-- v_rows_approved_min NUMBER;
-- v_rows_approved_max NUMBER;
err VARCHAR2(300) := 'Not a valid SKU';
BEGIN
IF :P8_PRODUCT_OR_SKU = 'SKU' -- THIS IS MY SELECT LIST ITEM
THEN
---- err can be defaulted in declaration
--err := 'Not a valid SKU';
--v_rows_approved_min := 1;
---- not needed see below
--SELECT COUNT(*) INTO v_rows_approved_max FROM sku_table;
FOR cur_a IN ( SELECT sku FROM sku_table ) LOOP
---- not needed. You're looping through the table, v_rows_approved_min will be > than v_rows_approved_max
--EXIT WHEN v_rows_approved_min > v_rows_approved_max;
IF :P8_SKU = cur_a.sku THEN
RETURN err;
---- not needed
-- ELSE
-- NULL;
END IF;
---- not needed
-- v_rows_approved_min := v_rows_approved_min + 1;
END LOOP;
---- not needed
-- ELSE
-- NULL;
END IF;
-- you need to return something whenever the function ends...
RETURN NULL;
END;
/
然而。。。这可以大大简化。
创建类型为"的验证;返回的行数;
来源:
SELECT
1
FROM
sku_table WHERE sku = :P8_SKU
错误消息:不是有效的SKU
服务器端条件(类型项=值(:项:P8_PRODUCT_OR_SKU;价值:SKU
这做了完全相同的事情。