2012-08-02 76 views
0

我已定义为一个简单的包如下:ODP.NET无法识别在Oracle包过程

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

END wvParty;

CREATE OR REPLACE PACKAGE BODY wvParty IS PROCEDURE proc_GetParties( p_party_name IN OUT VARCHAR2, x_party_info OUT refParties ) IS BEGIN p_party_name:= '%' || || p_party_name '%';

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; 

END wvParty;

它在oracle数据库中创建,没有错误。在我的代码,我试图用叫它:

 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作为包的一部分,我已经宣布了它,因为我相信我应该这样做,但我很少成功地解决这个问题。任何建议?

回答

1

我不能对事物的C#侧置评,但也有在甲骨文一侧的一些问题,如:

  1. proc_GetParties在包身上的定义,但在包没有声明规范。这意味着它在包体外面不可见。这解释了为什么你会收到PLS-00302错误。
  2. WHERE条款中不需要1=1条件。
  3. 您是否真的想要在程序中更改p_party_name的值,并将此更改显示给调用者?如果没有,最好不要将p_party_name保持不变,并将LIKE条件更改为party_name LIKE '%' || p_party_name || '%'