我有一个函数,它在打开游标之前有三个If / Then语句. If / Then语句在打开游标之前检查有效性.
我想再添加一个If / Then有效性检查,但是,它比其他更复杂一点.下面是一个示例,我有块评论我想添加的内容:
begin if not procedure.validation_function (<variable>,<condition>=TRUE) then return variable2; end if; /* if not exists ( SELECT 'x' FROM table1 WHERE table1_id = variable1_id AND trunc(sysdate) < trunc(table1_date + 60) ) then return variable2; end if; */ open cursor(<argument>); fetch cursor into <variable>; close cursor; return <variable>; end;
我的问题是我来自一个T-sql世界,而我在PL / sql中发现if not exists命令不起作用.有没有办法,我可以在函数中有一个If NO_DATA_FOUND语句,我使用SELECT?
有没有办法在其中嵌套另一个函数,所以我可以:
begin SELECT .... FROM .... WHERE .... if NO_DATA_FOUND then return variable2; end if; end;
解决方法
Exists条件只能在sql语句中使用,不能直接在PL / sql中使用.有几种选择:
>在select语句中使用带有exists条件的case表达式:
sql> declare 2 l_exists number(1); 3 begin 4 select case 5 when exists(select 1 6 from employees 7 where department_id = 1) 8 then 1 9 else 0 10 end into l_exists 11 from dual; 12 13 if (l_exists = 1) 14 then 15 dbms_output.put_line('exists'); 16 else 17 dbms_output.put_line(q'[doesn't exist]'); 18 end if; 19 end; 20 / doesn't exist PL/sql procedure successfully completed
>或者(如果有多条记录符合匹配条件,则需要rownum来保证只返回一条记录):
sql> declare 2 l_exists number; 3 begin 4 5 select 1 6 into l_exists 7 from employees 8 where department_id = 100 9 and rownum = 1; 10 11 dbms_output.put_line('exists'); 12 13 exception 14 when no_data_found 15 then dbms_output.put_line(q'[doesn't exist]'); 16 end; 17 / exists PL/sql procedure successfully completed