0

ここにはまったく同じ問題に関する質問が他にもいくつかあることは知っていますが、権限の問題はまったくないことを 100% 確信しています。プロシージャはクエリ エディタから正常に実行されますが、何らかの理由で、このプロシージャを非常に単純な ASP.net ページから実行することはできません。これは、Oracle Proc を作成する最初の試みであることに注意してください。

これがprocを呼び出す私のコードです(それを呼び出して結果をラベルに強制しようとしています)

    string oradb = "connection string here";

    OracleConnection conn = new OracleConnection(oradb);

    OracleCommand cmd = new OracleCommand();
    cmd.Connection = conn;
    cmd.CommandText = "x.GETCURSORS";
    cmd.CommandType = CommandType.StoredProcedure;

    OracleParameter ACTNUM = new OracleParameter();
    ACTNUM.OracleDbType = OracleDbType.Decimal;
    ACTNUM.Direction = ParameterDirection.Input;
    ACTNUM.Value ="12345";
    cmd.Parameters.Add(ACTNUM);

    OracleParameter REJECTS_C = new OracleParameter();
    REJECTS_C.OracleDbType = OracleDbType.RefCursor;
    REJECTS_C.Direction = ParameterDirection.Output;
    cmd.Parameters.Add(REJECTS_C);


    try
    {
        conn.Open();
        OracleDataReader objReader = cmd.ExecuteReader();
        Label3.Text = objReader.ToString();
    }
    catch (Exception ex)
    {
        Label3.Text = string.Format("Exception: {0}", ex.ToString());

    }

パッケージ仕様:

PACKAGE "x"."REJECTS_DATA" IS

PROCEDURE "GETCURSORS" (
"ACTNUM" IN NUMBER, 
"REJECTS_C" OUT SYS_REFCURSOR);

 END "REJECTS_DATA";

パッケージ本体:

PACKAGE BODY "x"."REJECTS_DATA" IS

PROCEDURE "GETCURSORS" (
"ACTNUM" IN NUMBER, 
"REJECTS_C" OUT SYS_REFCURSOR) IS

BEGIN

OPEN REJECTS_C FOR SELECT * FROM x.a
WHERE  x.a.ACCOUNT = ACTNUM;

END "GETCURSORS";

END "REJECTS_DATA";
4

2 に答える 2

1

スキーマ名がX、パッケージ名がREJECTS_DATA、プロシージャ名がGETCURSORSであるとすると、少なくとも、コマンドは次のようになる必要があります。

cmd.CommandText = "x.REJECTS_DATA.GETCURSORS";

PL/SQLで大文字と小文字を区別する識別子を実際に使用している場合(これは避けることを強くお勧めします)、プロシージャ名でも大文字と小文字を区別する識別子を使用する必要があります。

于 2013-01-15T20:28:58.107 に答える
0

コードで同じ問題に直面し、SCHEMA_NAME を C# の proc 呼び出し、つまり PACKAGE_NAME.PROC_NAME から除外する必要がありました。この問題は、SCHEMA_NAME を使用してデータベースにシノニムを作成することで解決しました

于 2014-09-12T07:30:39.407 に答える