我有以下存储过程,我想在C#/ .NET中使用:
CREATE OR REPLACE
procedure contact_return(
v_urn IN VARCHAR2,
p_cursor OUT SYS_REFCURSOR )
AS
sql_statement VARCHAR2(4000) := '
SELECT URN,
FIRSTNAME,
LASTNAME,
TITLE,
MOBILE,
WORK,
EMAIL
FROM CONTACT
WHERE urn = NVL(:1,v_contact_urn)';
BEGIN
OPEN p_cursor FOR sql_statement USING v_urn;
使用此代码,我收到错误: PLS-00201:必须声明标识符'CONTACT_RETURN'
OracleCommand cmd = new OracleCommand();
cmd.Connection = conn;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "contact_return";
cmd.Parameters.Add("v_urn", OracleDbType.Int64).Value = null;
cmd.Parameters.Add("p_cursor", OracleDbType.RefCursor).Direction = ParameterDirection.Output;
据我所知,我已正确声明存储过程('contact_return'),因此无法弄清楚为什么我会收到此错误。
非常感谢任何帮助,谢谢:)
答案 0 :(得分:1)
不应该这个
CREATE OR REPLACE
procedure contact_return(
v_urn IN VARCHAR2,
p_cursor OUT SYS_REFCURSOR )
AS
sql_statement VARCHAR2(4000) := '
SELECT URN,
FIRSTNAME,
LASTNAME,
TITLE,
MOBILE,
WORK,
EMAIL
FROM CONTACT
WHERE urn = NVL(:1,v_contact_urn)';
BEGIN
OPEN p_cursor FOR sql_statement USING v_urn;
是
CREATE OR REPLACE
procedure contact_return(
v_urn IN VARCHAR2,
p_cursor OUT SYS_REFCURSOR )
AS
BEGIN
DECLARE sql_statement VARCHAR2(4000) := '';
SELECT URN,
FIRSTNAME,
LASTNAME,
TITLE,
MOBILE,
WORK,
EMAIL
FROM CONTACT
WHERE urn = NVL(:1,v_contact_urn)';
OPEN p_cursor FOR sql_statement USING v_urn;
END;
答案 1 :(得分:1)
要调用包含OUT
类型SYS_REFCURSOR
参数的Oracle商店过程,您需要使用ODP.NET。
模板解决方案将是这样的:
using Oracle.DataAccess;
using Oracle.DataAccess.Client;
public DataTable Call_contact_return(string v_urn_value)
{
using (OracleConnection cn = new OracleConnection(DatabaseHelper.GetConnectionString()))
{
OracleDataAdapter da = new OracleDataAdapter();
OracleCommand cmd = new OracleCommand();
cmd.Connection = cn;
cmd.InitialLONGFetchSize = 1000;
cmd.CommandText = DatabaseHelper.GetDBOwner() + "contact_return";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("v_urn", OracleDbType.Char).Value = v_urn_value;
cmd.Parameters.Add("p_cursor", OracleDbType.RefCursor).Direction = ParameterDirection.Output;
da.SelectCommand = cmd;
DataTable dt = new DataTable();
da.Fill(dt);
return dt;
}
}