动态 SQL 的 Oracle PL/SQL 异常

Posted

技术标签:

【中文标题】动态 SQL 的 Oracle PL/SQL 异常【英文标题】:Oracle PL/SQL Exception for Dynamic SQL 【发布时间】:2014-05-20 06:38:15 【问题描述】:

我的代码有问题(如下),假设路径 'E:\Oracle\test' 不存在(心理文件夹不存在),所以它应该转到错误异常处理程序和写一个错误日志,但它没有。相反,它成功创建了 Oracle 目录,为什么会发生这种情况?我的代码哪里出错了?

谁能帮帮我,非常感谢 数据库是Oracle 11g

DECLARE
var1 VARCHAR2(2000) := 'somepath';
var2 VARCHAR2(2000) := 'directoryname';
err  VARCHAR2(2000);

BEGIN
file_path_ := 'E:\Oracle\test\' || var1 || '\';
temp_dir_ := 'TEST_DIR_' || var2;
plsql_block_ := 'CREATE OR REPLACE DIRECTORY ' || temp_dir_ || ' AS ' || '''' ||file_path_ || '''';
EXECUTE IMMEDIATE plsql_block_;

SAVEPOINT Start_Trans;

<some code here>

EXCEPTION
WHEN OTHERS THEN
ROLLBACK TO Start_Trans;
err := substr(SQLERRM,1,2000);
Write_Log('ERROR', var1, err_);

END;

【问题讨论】:

【参考方案1】:

Oracle 数据库中创建的目录只是磁盘上真实事物的别名。 Oracle 不会验证您指定的目录是否确实存在。

【讨论】:

但是,当我简单地执行 CREATE OR REPLACE TEST_DIR AS 'E:\Oracle\Test\' (物理文件夹不存在)时,它会返回一个错误 奇怪,应该没什么区别。首次创建目录时是否发生异常(因此不替换)? @erwin 你能添加“坏”代码和它生成的错误消息吗?在我的测试数据库上,我当然可以创建一个路径错误的目录并且不会收到错误消息。

以上是关于动态 SQL 的 Oracle PL/SQL 异常的主要内容,如果未能解决你的问题,请参考以下文章

异常后停止 PL/SQL 代码(PL/SQL、ORACLE)

Oracle Apex 日期选择器行为异常

Oracle笔记4-pl/sql-分支/循环/游标/异常/存储/调用/触发器

Oracle的PL_SQL的异常处理

Oracle_PL/SQL 动态sql

Oracle:使用 SQL 或 PL/SQL 查找动态 SQL 中的错误位置