繁体   English   中英

从具有输入参数的Oracle存储过程返回数据表到.NET应用程序

[英]Returning data table from Oracle stored procedure that has input parameters to a .NET application

我已经对我的问题进行了一些研究,但是由于缺乏Oracle方面的经验(仅来自SQL Server背景),所以我感到很挣扎。

我正在尝试从.NET应用程序调用Oracle存储过程,并将数据表返回给我的应用程序。 我收到“ ORA-00900:无效的SQL语句”错误。

伪代码背后:

OracleConnection conn = new OracleConnection("...");
OracleCommand cmd = new OracleCommand("sproc_name", conn);
cmd.Connection = conn;
cmd.Parameters.Add("Year", OracleDbType.Int16).Value = vYear
cmd.Parameters.Add("Name", OracleDbType.Varchar2).Value = vName;
cmd.Parameters.Add("ID", OracleDbType.Varchar2).Value = vID;
conn.Open();
DataTable dt = new DataTable();
dt.Load(cmd.ExecuteReader());

伪存储过程:

CREATE OR REPLACE
PROCEDURE sproc_name
(
  Year IN NUMBER
, Name IN VARCHAR2
, ID IN VARCHAR2
)
AS
BEGIN
SELECT *
FROM TABLE
WHERE TABLE.Year = Year AND
      TABLE.Name = Name AND
      TABLE.ID = ID
END sproc_name;

我已经阅读了有关参考游标的内容,并尝试重写我的程序,但是没有运气。 我应该如何进行?

尝试这个

using (var conn = new OracleConnection("..."))

using (var cmd = conn.CreateCommand())
{

cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "sproc_name";
cmd.BindByName = true;

// ...

回答有点老的问题,但是回答回答的问题总是好的,Oracle永远不会将您输出为sql。 为了获得结果集,您需要将sys_refcursor标识为Out参数。

因此,您的过程将类似于还尝试命名正确(只是一个建议):)

CREATE OR REPLACE PROCEDURE sproc_name (
  numYear IN NUMBER
, strName IN VARCHAR2
, numID IN VARCHAR2,
, cr_output out sys_refcursor
)
AS
BEGIN
open cr_output for
SELECT *
FROM TABLE
WHERE TABLE.Year = Year AND
      TABLE.Name = Name AND
      TABLE.ID = ID
END sproc_name;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM