帮助使用Dynamic PL/SQL,函数抛出异常

Posted

技术标签:

【中文标题】帮助使用Dynamic PL/SQL,函数抛出异常【英文标题】:Help using Dynamic PL/SQL, function throwing exception 【发布时间】:2011-06-09 14:59:48 【问题描述】:

我是 PL/SQL 的新手(尤其是使用动态 SQL),我创建了这个函数,它运行/编译时没有任何错误或警告,但是当我运行该函数时......

SELECT schema.fa_awd_for_term('0000000','2003SPRING',NULL,NULL)
FROM DUAL;

....它抛出一个异常

【问题讨论】:

【参考方案1】:

删除 EXCEPTION 处理程序,您会发现错误实际上是什么。您不应显式处理意外异常。

最好使用绑定变量,例如改变这个:

    || 'substr(ta_xxxx_id,1,7) = ''sssssss'' '
    || 'and substr(ta_xxxx_id,instr(ta_xxxx_id,''*'',1,2)+1) = ''aaaa'' '

    || 'substr(ta_xxxx_id,1,7) = :sssssss '
    || 'and substr(ta_xxxx_id,instr(ta_xxxx_id,''*'',1,2)+1) = :aaaa '

然后在 OPEN 语句中添加一个 USING 子句:

OPEN CUR_faawards FOR thequery USING id, v_year;

并删除这些的替换代码。恐怕你会因为糟糕的表格设计而被“xxxx”困住 - 每年都有一列?!?!

【讨论】:

是的,我知道 :( 设计不佳。我会尝试这些建议,然后回复您。感谢您的提示。 好的,我尝试移动底部异常(它返回'ER2'),我得到一个ora-06512,未处理的异常,上面的错误是“表或视图不存在(我已经仔细检查了我的表名的准确性)这是否暗示了问题? 它可以是任何表,但我的怀疑将从 ta_xxxx 表开始。尝试添加一些调试消息,例如使用 dbms_output.put_line。 好吧,愚蠢的菜鸟问题。我可以使用 dbms_output.put_line();打印出一个变量?所以例如我可以做 dbms_output.put_line(v_year);并在函数运行时输出? 是的,但仅当在 SQL Plus、SQL Developer 或 Toad 等开发环境中运行该函数时。如果您从应用程序调用该函数,则无法轻松访问该函数的输出。一种常见的替代方法是使用自治事务将调试消息写入表 - 请参阅***.com/questions/1568166/…

以上是关于帮助使用Dynamic PL/SQL,函数抛出异常的主要内容,如果未能解决你的问题,请参考以下文章

使用 jOOQ 执行 PL/SQL 函数时的 Java 空指针

PL/SQL 引发处理异常

Oracle中RAISE异常

PL/SQL 函数在执行时抛出进程内存错误

C++ 动态转换异常

plsql里面的raise是啥意思