Oracle dotnet DBMS输出查询

时间:2013-04-25 15:16:27

标签: .net oracle dbms-output

我在.net中运行一些代码,使用oracleclient in,net。 SQL代码可以使用DBMS_PUT_LINE函数输出许多响应,然后我通过调用DBMS_GET_LINE来检索它。如果输出只是一个特定的文本行,即'DBMS_OUTPUT.PUT_LINE('用户不可用:请联系系统管理员');'然后调用get_line工作正常,我得到了那个文本。但是,如果调用是输出SQL错误消息,'DBMS_OUTPUT.PUT_LINE(SQLERRM);'然后我得到以下错误返回,'ORA-06502:PL / SQL:数字或值错误:十六进制到原始转换错误'

真正奇怪的是,如果我第二次运行完全相同的代码(包括关闭并重新连接到数据库),那么对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()

关闭数据库

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

有什么想法?我总是可以运行两次代码,但这看起来非常低效。

1 个答案:

答案 0 :(得分:1)

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

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