我不能让这个功能按照我的意愿行事.任何人都可以指出为什么它总是返回null而不是CURRENT_TIMESTAMP?
CREATE OR REPLACE FUNCTION nowts RETURN TIMESTAMP IS
vTimestamp TIMESTAMP;
BEGIN
SELECT type_date
INTO vTimestamp
FROM param_table
WHERE param_table = 3
AND exists (
SELECT *
FROM param_table
WHERE param_table = 2
);
IF vTimestamp IS NULL THEN
vTimestamp := CURRENT_TIMESTAMP;
END IF;
return vTimestamp;
END nowts;
Run Code Online (Sandbox Code Playgroud)
现在,名为param_table的表中没有任何内容.
如果没有行,则select into将引发NO_DATA_FOUND异常.
在END现在之前添加
exception
when no_data_found then
return CURRENT_TIMESTAMP;
Run Code Online (Sandbox Code Playgroud)
如果您从SQL调用函数,并且该函数引发NO_DATA_FOUND,则会得到NULL。
来自NO_DATA_FOUND的SQLCODE为+100,而PL / SQL代码为-1403。参考
正数不是错误,SQL不会将NO_DATA_FOUND的概念视为异常。SQL将其视为“无值”,该值为空。
create or replace function ret_dt return date is
begin
raise no_data_found;
end;
/
Elapsed: 00:00:00.26
> select rownum ,ret_dt from user_tables where rownum < 5;
ROWNUM RET_DT
--------------- -----------------
1.00
2.00
3.00
4.00
Run Code Online (Sandbox Code Playgroud)
您可能想捕获它并返回一个特定值,或者捕获它并引发用户定义的异常(取决于您要发生的情况)。