2

我正在.net 中运行一些代码,使用.net 中的oracleclient。SQL 代码可以使用 DBMS_PUT_LINE 函数输出许多响应,然后我通过调用 DBMS_GET_LINE 来检索这些响应。如果输出只是特定的文本行,即 'DBMS_OUTPUT.PUT_LINE('USER IS NOT AVAILABLE : PLEASE CONTACT SYSTEM ADMINISTRATOR');' 然后对 get_line 的调用工作正常,我得到了那个文本。但是,如果调用是输出 SQL 错误消息,'DBMS_OUTPUT.PUT_LINE(SQLERRM);' 然后我得到以下错误返回,'ORA-06502: PL/SQL: numeric or value error: hex to raw conversion error'

真正奇怪的是,如果我第二次运行完全相同的代码(包括关闭并重新连接到数据库),那么对 get_line 的调用将返回正在输出的实际错误消息。

我的代码基本上执行以下操作:

打开数据库连接 使用 executeNonQuery 运行 SQL 查询 创建输出参数,例如:

Dim anonymous_block = "begin dbms_output.get_line(:1, :2); end;"

aCmd.CommandText = anonymous_block
aCmd.Parameters.Add("1", OracleType.VarChar, 32000)
aCmd.Parameters("1").Direction = ParameterDirection.Output
aCmd.Parameters.Add("2", OracleType.Int32)
aCmd.Parameters("2").Direction = ParameterDirection.Output

然后运行另一个 executeNonQuery 以获取输出。

然后用 .close() 关闭数据库

但在第二次运行时,它得到了正确的输出。我可能有一些东西我第一次没有正确设置?

有什么想法吗?我总是可以只运行两次代码,但这似乎非常低效。

4

1 回答 1

1

首先,设计一个应用程序在客户端和服务器之间进行有意义的交互dbms_output是一种糟糕的方法。如果您的存储过程需要向调用者发送信息,则应通过OUT参数或异常来完成。让存储过程捕获异常,尝试将其写入dbms_output缓冲区,然后让应用程序尝试从dbms_output缓冲区读取以确定是否存在异常,这不是编写应用程序的可扩展方法。

也就是说,如果您要从dbms_output缓冲区中获取数据,则需要在循环中执行此操作。在您的特定情况下,错误堆栈包含多行数据(可能只有一次调用,dbms_output.put_line但文本包含内部换行符。您需要循环直到status(第二个参数)返回 1。

于 2013-04-25T16:13:32.247 回答