Хранимая процедура Oracle и пользовательский тип данных - PullRequest
7 голосов
/ 04 ноября 2010

У меня есть хранимая процедура Oracle, которая принимает два параметра: пользовательский тип данных и строку.

Вызывая хранимую процедуру в Oracle, я бы сделал следующее:

EXECUTE MY_STORED_PROCEDURE(MYTYPE_T(99, 231), 'mystring')

Как я могу выполнить это с помощью C #? Я понимаю, что мне нужно настроить команду как хранимую процедуру, но как мне указать первый параметр как пользовательский тип данных?

Обновление:

MYTYPE_T - это TABLE OF NUMBER, созданный с помощью

CREATE OR REPLACE TYPE mytype_t AS TABLE OF NUMBER ; 

Ответы [ 2 ]

4 голосов
/ 04 ноября 2010

Вы не сможете сделать это легко с устаревшим System.Data.OracleClient но вы можете использовать ODP от Oracle * Oracle * с использованием UDT. Если это не вариант, я не уверен, как вы можете сделать это через параметры в C # с System.Data.

ODP содержит множество примеров, и в приведенных выше ссылках есть примеры.

Я собираюсь добавить еще несколько ссылок, которые, надеюсь, помогут:

  1. Индекс ODP для визуальной студии
  2. это показывает, как именно использовать ODT, чтобы создать свой кастом Обертки класса и назовите их (сделать обратите внимание, что это на полпути, они проходят через инструмент, чтобы создать пользовательские типы над ним в пример - это прохождение довольно тщательно и должен получить вас прямо там, где нужно быть)
  3. Скачать : теперь этот парень тоже устанавливает образцы файлов, это еще один потрясающий пример именно что нужно сделать: после установки Перейти к [путь к каталогу вы установка] .. \ продукт \ 11.2.0 \ client_1 \ odp.net \ Samples \ 4 \ UDT \ object1.cs

Действительно стоит позволить инструментам ODT для Visual studio создавать ваши классы для ваших UDT для вас (например, IOracleCustomType и тому подобное). затем вы можете перейти к ним и изменить их в соответствии с вашими потребностями. затем, когда все сказано и сделано (фрагмент из object1.cs):

    Person p1   = new Person();
p1.Name     = "John";
p1.Address  = "Address1";
p1.Age = 20;

// Establish a connection to Oracle
OracleConnection con = new OracleConnection(constr);
con.Open();

// Update Person object and insert it into a database table
OracleCommand cmd = new OracleCommand(sql1, con);
cmd.CommandType = CommandType.StoredProcedure;
OracleParameter param1 = new OracleParameter();

param1.OracleDbType   = OracleDbType.Object;
param1.Direction      = ParameterDirection.InputOutput;

// Note: The UdtTypeName is case-senstive
param1.UdtTypeName     = "SCOTT.ODP_OBJ1_SAMPLE_PERSON_TYPE";   
param1.Value           = p1;

cmd.Parameters.Add(param1);

также обратите внимание, что класс Person должен реализовывать IOracleCustomType (который может быть создан по ссылке в # 2)

/* Person Class
   An instance of a Person class represents an ODP_OBJ1_SAMPLE_PERSON_TYPE object
   A custom type must implement INullable and IOracleCustomType interfaces
*/
public class Person : INullable, IOracleCustomType

Выше приведен полный пользовательский тип, но после привязки ODP к ассоциативному массиву:

http://weblogs.asp.net/ricardoperes/archive/2009/05/14/odp-net-associative-arrays.aspx

вы захотите использовать

param1.CollectionType = OracleCollectionType.PLSQLAssociativeArray;

и все должно встать на свои места

0 голосов
/ 05 ноября 2010

Пользовательский тип данных из C # можно передать в процедуру Oracle, только если этот тип данных определен в DB. Посмотрите на эту статью , это должно помочь вам начать работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...