0

次のように定義された単純なパッケージがあります。

CREATE OR REPLACE PACKAGE wvParty IS
TYPE refParties IS REF CURSOR;

終了 wvParty;

パッケージ本体の作成または置換

    OPEN x_party_info FOR
    SELECT party_id, party_number, party_type, party_name, 
        person_first_name, person_middle_name, person_last_name,
        known_as, known_as2, known_as3, known_as4, known_as5
    FROM hz_parties
    WHERE 1=1
    AND party_name LIKE p_party_name; 
END;

終了 wvParty;

エラーなしでOracle dbに作成されます。私のコードでは、次を使用して呼び出そうとしています:

      try
  {
    OracleConnection conn = new OracleConnection(_connStr);
    conn.Open();
    OracleCommand cmd = conn.CreateCommand();
    cmd.CommandText = "wvParty.proc_GetParties";
    cmd.CommandType = CommandType.StoredProcedure;

    OracleParameter partyName = new OracleParameter();
    partyName.ParameterName = "p_party_name";
    partyName.OracleDbType = OracleDbType.Varchar2;
    partyName.Direction = ParameterDirection.InputOutput;
    partyName.Value = "Bubba";
    cmd.Parameters.Add(partyName);

    OracleParameter refParties = new OracleParameter();
    refParties.ParameterName = "x_party_info";
    refParties.OracleDbType = OracleDbType.RefCursor;
    refParties.Direction = ParameterDirection.Output;
    cmd.Parameters.Add(refParties);

    OracleDataReader rdr = cmd.ExecuteReader();

それでも、私がそうすると、エラーが発生します:

PLS-00302: コンポーネント'PROC_GETPARTIES'を宣言する必要があります。

だから私は途方に暮れています。私はパッケージの一部として proc を作成しました。そうすべきだと信じているので宣言しましたが、これを解決することにほとんど成功していません。なにか提案を?

4

1 に答える 1

1

C# 側についてコメントすることはできませんが、Oracle 側には次のようないくつかの問題があります。

  1. proc_GetPartiesはパッケージ本体で定義されていますが、パッケージ仕様では宣言されていません。これは、パッケージ本体の外では見えないことを意味します。これは、エラーが発生する理由を説明していPLS-00302ます。
  2. 1=1条件はWHERE句では必要ありません。
  3. p_party_nameプロシージャ内での値を変更し、その変更が呼び出し元に表示されるようにしますか? そうでない場合は、そのままにして条件を にp_party_name変更した方がよいかもしれません。LIKEparty_name LIKE '%' || p_party_name || '%'
于 2012-08-03T01:28:18.670 に答える