Oracle.DataAccess.Client.OracleException: ORA-00900: 无效的 SQL 语句
Posted
技术标签:
【中文标题】Oracle.DataAccess.Client.OracleException: ORA-00900: 无效的 SQL 语句【英文标题】:Oracle.DataAccess.Client.OracleException: ORA-00900: invalid SQL statement 【发布时间】:2021-01-11 19:24:35 【问题描述】:我使用以下代码创建了一个 Oracle SP。如果我从 SQL 开发人员那里执行它,那么它运行时不会出现任何错误/问题。但是,当我尝试从 .NET 代码调用同一个 SP 时,会引发异常并显示消息“Oracle.DataAccess.Client.OracleException: ORA-00900: invalid SQL statement”。
Oracle SP 代码:
PROCEDURE sp_UpdateLSR(
po_Info OUT VARCHAR2,
pi_gId IN VARCHAR2,
pi_cid IN VARCHAR2
) IS pragma autonomous_transaction;
BEGIN
UPDATE TableName
SET colName = 6603
WHERE colName21 = pi_gId AND COL2 = pi_cid;
COMMIT;
OPEN po_Info FOR SELECT pi_cid as MSG FROM dual;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
common.sp_InsertErrorLog('sp_Name', SQLCODE, SQLERRM); -- nothing gets logged
END;
我的 VB.NET 代码:
Public Function SetValues(ByVal gid As String, ByVal CId As String) As Boolean
Dim connection As OracleConnection = New OracleConnection(GetConnectionString())
Dim command As OracleCommand = connection.CreateCommand()
Dim parameters As OracleParameter = New OracleParameter
Dim dataAdapter As New OracleDataAdapter(command)
Dim rtnMsg As String
Dim ds As New DataSet
Try
connection.Open()
command.Parameters.Add("parameters", OracleDbType.RefCursor, DBNull.Value, ParameterDirection.Output)
command.Parameters.Add("pi_gId", OracleDbType.Varchar2, gid, ParameterDirection.Input)
command.Parameters.Add("pi_cid", OracleDbType.Varchar2, CId, ParameterDirection.Input)
command.CommandText = "sp_UpdateLSR"
dataAdapter.Fill(ds)
If ds.Tables(0).Rows.Count > 0 Then
rtnMsg = ds.Tables(0).Rows(0)(0).ToString()
End If
SetLIMSValues = rtnMsg.ToLower() = CharId.ToLower()
Catch ex As Exception
Throw New Exception("error", ex)
Finally
command.Dispose()
parameters.Dispose()
If Data.ConnectionState.Open Then
connection.Close() 'close the connection
End If
End Try
End Function
有什么想法吗?
谢谢。
【问题讨论】:
为什么要为单个静态值返回 RefCursor?为什么返回输入值pi_cid
?异常处理程序也是无用的。如果 UPDATE 失败,那么无论如何它都会回滚。如果错误出现在其他地方,那么回滚是没有用的,因为你已经发出了 COMMIT。
对于单个返回值,我更喜欢使用FUNCTION
而不是过程。
【参考方案1】:
当你对数据库执行存储过程时,你需要告诉命令对象,默认是CommandText
添加行:
command.CommandType = CommandType.StoredProcedure
在您设置 CommandText 之前或之后 - 只是一个方便记忆和靠近的地方。
【讨论】:
谢谢JayV。 [不知道我是怎么错过的,我真的不知道该说什么:)]以上是关于Oracle.DataAccess.Client.OracleException: ORA-00900: 无效的 SQL 语句的主要内容,如果未能解决你的问题,请参考以下文章
Oracle.DataAccess.Client.OracleConnection.Open()报错System. NullReferenceException
无法将“System.String”类型的对象转换为 C# 中的“Oracle.DataAccess.Client.OracleParameter”类型
Oracle.DataAccess.Client.OracleConnection”的类型初始值设定项引发异常
错误 47 存储区提供程序工厂类型“Oracle.DataAccess.Client.OracleClientFactory”未实现 IServiceProvi
Oracle.DataAccess.Client.OracleException ORA-06502:PL/SQL:数字或值错误:字符串缓冲区太小。 ExecuteReader 步骤出错
用iis发布应用连接oracle,系统报Oracle.DataAccess.Client.OracleConnection的类型初始值设定项引发异常