我已经对我的问题进行了一些研究,但我认为由于缺乏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;
我已阅读参考游标,我试图重写我的程序,没有运气。我该怎么办?
答案 0 :(得分:0)
试试这个
using (var conn = new OracleConnection("..."))
using (var cmd = conn.CreateCommand())
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "sproc_name";
cmd.BindByName = true;
// ...
答案 1 :(得分:0)
回答一些老问题,但回答回答问题总是好的, 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;