Хранимая процедура Oracle возвращает RefCursor без строк

1

В настоящее время я использую Proof of Concept (WinForms) для тестирования вызовов хранимых процедур Oracle.

Окружающая среда :

  • Windows x64
  • .NET Framework: 4.0
  • Oracle Client установлен (v11.2), но не нужен
  • Oracle Data Provider.NET: Oracle.ManagedDataAccess(v121.1.2)

Ну, я уверен, что моя хранимая процедура должна вернуть 7 строк. Платформа (x86 или x64 не является проблемой, поскольку она работает на обеих платформах).

Некоторый код:

private void btnExecuteODP_Click(object sender, EventArgs e){
    string _connectionString = 
        String.Format("Data Source={0};User Id={1};Password={2};",
            tbDataSource.Text, tbUser.Text, tbPassword.Text);

try{
    using (OracleConnection conn = new OracleConnection(_connectionString)){
        using (OracleCommand cmd = new OracleCommand()){
            cmd.CommandText = "XXCOOT_QUERIES.getWarehouses";
            cmd.CommandType = CommandType.StoredProcedure;

            // Parameters
            OracleParameter p1 = new OracleParameter();
            p1.ParameterName = "inumActivityId";
            p1.OracleDbType = OracleDbType.Varchar2;
            p1.Direction = ParameterDirection.Input;
            p1.Size = 10;
            p1.Value = 108;
            cmd.Parameters.Add(p1);

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

            OracleParameter p2 = new OracleParameter();
            p2.ParameterName = "ostrErrCode";
            p2.OracleDbType = OracleDbType.Varchar2;
            p2.Direction = ParameterDirection.Output;
            p2.Size = 2000;
            cmd.Parameters.Add(p2);

            DataTable dt = new DataTable();
            OracleDataReader reader = null;

            conn.Open();
            cmd.Connection = conn;

            using (reader = cmd.ExecuteReader()){
                dt.Load(reader);
                this.tbResult.Text = "Rows Count : " +
                    dt.Rows.Count.ToString(); // Returns: "Rows Count : 0"

                this.dataGridView1.DataSource = dt.DefaultView;
                // Returns : " | Column1 | Column2 | "
                //             |-------- | --------|
            }
        }
    }
}
finally{}
}

Моя сохраненная процедура:

PROCEDURE getWarehouses
     ( inumActivityId   in   varchar2
     , ocursWarehouses  out  grefCursorType
     , ostrErrCode      out  varchar2
 )
IS
    lextorg varchar2(150);
BEGIN
    FND_CLIENT_INFO.Set_Org_Context(inumActivityId);
   lextorg := null;

   SELECT b.GENERIC_EXTERNAL_ORGANIZATION
   INTO   lextorg
   FROM   HR_ORGANIZATION_INFORMATION a
   ,      HR_ORGANIZATION_INFORMATIO_DFV b
   WHERE  a.organization_id = to_number(inumActivityId)
   AND    a.ORG_INFORMATION_CONTEXT = 'Operating Unit Information'
   AND    a.rowid = b.rowid;

IF lextorg is null THEN

    OPEN ocursWarehouses FOR
        SELECT ood.organization_code  organization_code
         ,      ood.organization_name  name
         FROM   org_organization_definitions  ood
         ,      mtl_parameters                mp
         ,      mtl_parameters_dfv            mp_dfv
         WHERE ood.operating_unit = to_number(inumActivityId)
         AND   sysdate <= nvl(disable_date,sysdate)
         AND   ood.organization_id = mp.organization_id
         AND   mp.rowid = mp_dfv.row_id
         AND   upper(mp_dfv.warehouse_type) in ('INTERNAL','EXTERNAL')
         ORDER by organization_name;

ELSE

    OPEN ocursWarehouses FOR
        SELECT ood.organization_code  organization_code
        ,      ood.organization_name  name
        FROM   org_organization_definitions  ood
        ,      mtl_parameters                mp
        ,      mtl_parameters_dfv            mp_dfv
        WHERE -ood.operating_unit = to_number(inumActivityId)
        AND sysdate <= nvl(disable_date,sysdate)
        AND   ood.organization_id = mp.organization_id
        AND   mp.rowid = mp_dfv.row_id
        AND   upper(mp_dfv.warehouse_type) in ('INTERNAL','EXTERNAL')
        ORDER by organization_name;
END/

При выполнении: никаких предупреждений, ошибок нет (все параметры являются валидами)

Моя проблема: все строки возвращаются (вместо 7 ожидаемых строк), но я извлекаю схему (имена столбцов верны).

==> Если кто-то видит, где мой код ошибочен? Или чтение?

Теги:
stored-procedures
odp.net-managed

2 ответа

0
Лучший ответ

Ну, после нескольких месяцев и месяцев я нашел причину своей проблемы:

Моя хранимая процедура использует вид в предложении FROM. Эти (эти) представления используют тип данных LOB (я нашел эту проблему из-за ошибки, полученной Oracle).

0

То же самое происходило со мной, и моя проблема была в моей строке подключения и что я не открывал соединение...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню