我正在尝试在包的'body'部分中编译pl / sql中的函数。目的是在成功更新表列或返回与错误相关联的数字时返回数值:
FUNCTION chkMissingData RETURN NUMBER
IS
BEGIN
UPDATE ERRORS
SET ERRORDESC =
CASE
WHEN ERRVAL IS NULL THEN 'No data'
ELSE 'OK'
RETURN 0; -- ORA-00905 missing keyword
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
dbms_output.put_line('INSERT: Constraint violated ' || ERR_NUM || ', Msg:' || ERR_MSG);
RETURN ERR_NUM;
WHEN OTHERS THEN
dbms_output.put_line('Error ' || ERR_NUM || ', Msg:' || ERR_MSG);
RETURN ERR_NUM;
END chkMissingData;
我已经检查了类似问题的其他答案,但我没有看到我在语法上缺少什么。
答案 0 :(得分:1)
您应该使用包含自动格式化程序的IDE,例如SQL Developer。然后,在将示例加载到StackOverflow之前,您可以格式化并识别类似的常见语法问题。
您还可以使用livesql.oracle.com测试您的代码,确保至少编译,然后发布到此处。
SQL Developer和LiveSQL完全免费。
答案 1 :(得分:0)
好的,我忘了放一个'结束;'在CASE声明之后!
答案 2 :(得分:0)
如上所述,修正后的片段低于...
CREATE OR REPLACE
FUNCTION chkMissingData
RETURN NUMBER
IS
BEGIN
UPDATE ERRORS
SET ERRORDESC =
CASE
WHEN ERRVAL IS NULL
THEN 'No data'
ELSE 'OK'
END;
RETURN 0; -- ORA-00905 missing keyword
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
dbms_output.put_line('INSERT: Constraint violated ' || ERR_NUM || ', Msg:' || ERR_MSG);
RETURN ERR_NUM;
WHEN OTHERS THEN
dbms_output.put_line('Error ' || ERR_NUM || ', Msg:' || ERR_MSG);
RETURN ERR_NUM;
END chkMissingData;
答案 3 :(得分:0)
err_num和err_msg不是声明的变量。 我认为你的意思是SQLCODE和SQLERRM
(我猜测ERRVAL是你的表ERRORS的一列)