0

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') を正しく宣言しているため、このエラーが発生する理由がわかりません。

どんな助けでも大歓迎です、ありがとう:)

4

2 に答える 2

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;
于 2013-09-04T16:09:22.587 に答える
1

OUTタイプのパラメーターを含む Oracle ストア プロシージャを呼び出すには、ODP.NETSYS_REFCURSORを使用する必要があります。 テンプレート ソリューションは次のようになります。

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;
                }
            }
于 2013-09-04T17:12:00.993 に答える