上周开始了这个Project的第一个task,整体逻辑简单来说就是从visit中取到三个字段的值,然后分别作为条件去Collection Plan中找到匹配的Code,把这些Code,再去gl_code_combination中获取ccid匹配Material Account,最后如果存在匹配的Accounting Class则做相应的处理,返回这个值,如果不存在则直接返回NULL。Task的逻辑比较清楚,细节也不详述,只是在coding的过程中碰到一个问题,在select into某个变量的时候,有时候select的column为null值,所以into的时候也是一个NULL,这时候如果不做处理,在compile 的时候就报ORA-01403 no data found的错误,为了处理这个自己试验过三个办法:
1.首先将某个column的count值活的,判断count的值是否为0,如果不为0,然后在执行execute的操作。
SELECT COUNT(wac.class_code)
INTO lc_wac_code_cnt
FROM wip_accounting_classes wac
WHERE organization_id = ln_org_id
AND material_account =
(SELECT gcc.code_combination_id
FROM gl_code_combinations gcc
WHERE segment2 = lc_account_code
AND segment3 = lc_visit_dept_code
AND segment4 = lc_cust_code);
IF lc_wac_code_cnt <> 1 THEN
SELECT wac.class_code
INTO lc_wac_code
FROM wip_accounting_classes wac
WHERE organization_id = ln_org_id
AND material_account =
(SELECT gcc.code_combination_id
FROM gl_code_combinations gcc
WHERE segment2 = lc_account_code
AND segment3 = lc_visit_dept_code
AND segment4 = lc_cust_code);
END IF;
这种方法其实用的挺多的,这样的判断有时候除了这样的情况,还有其他的情况需要判断。不过不足就是这样会增加code的数量,不是最简便的。而且,如果需要多处判断的话,不是很方便。
2.针对多处可能出现判断null值的情况,于是写了一个简单的判断函数。
FUNCTION getvalue(p_strsql IN VARCHAR2) RETURN VARCHAR2 AS
/*
* Name : getvalue
* Description : Get the value after executing a sql statment
* and return the value
* Parameters :
p_visit_id varhcar2,
*
* Returns : varchar2
*
*/
lc_value VARCHAR2(200);
BEGIN
dbms_output.put_line(p_strsql);
EXECUTE IMMEDIATE p_strsql
INTO lc_value;
RETURN lc_value;
EXCEPTION
WHEN OTHERS THEN
RETURN NULL;
END getvalue;
这个函数在以一条sql语句作为参数传入,返回的是sql语句执行的结果,如果没有查到值,那么会返回null,当把null值赋给了变量,那么接下来就可以直接判断变量是否为null,这样做可以做到多处需要判断的时候重复使用这段函数,但是不足是,在构造sql的时候,因为一些变量问题,单引号变得很繁琐
3.在声明变量的时候直接先赋予初始值NULL,这个我没有在我这次写的程序里面,但是做过测试,好像也是没有问题的。
declare
lc_test varchar2(10) := NULL;
begin
select aaa into lc_test from test where rec_id = 1;
if lc_test is null then
dbms_output.put_line ('aaaaaaaaaa');
else
dbms_output.put_line ('bbbbbbbbbb');
end if;
end;
在整个程序的实现过程中,还碰到很多小的问题。此篇就仅对null的处理进行总结。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。