I have an Oracle stored procedure which takes two parameters: a custom data type and a string.
Calling the stored procedure in Oracle, I would do the following:
EXECUTE MY_STORED_PROCEDURE(MYTYPE_T(99, 231), 'mystring')
How can I execute this using C#? I understand that I need to setup the command to be a stored procedure, but how do I specify the first parameter as custom data type?
MYTYPE_T
is TABLE OF NUMBER
created via
CREATE OR REPLACE TYPE mytype_t AS TABLE OF NUMBER ;
You won't be able to do this easily with the deprecated System.Data.OracleClient but you can utilize oracle's ODP with using UDTs. If that is not an option, I am unsure how you can do it via parameters in C# with System.Data.
ODP does come with a lot of examples and there are examples in the above links.
I am going to add some more links that will hopefully help:
It really pays to allow the ODT tools for Visual studio to create your classes for your UDTs for you (e.g. IOracleCustomType and such) . you can then go into them and amend them to suit your needs. then once all is said and done (snippet from 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);
also note that Person class must implement IOracleCustomType (which can be created by following the link in #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
The above is for a full custom type, but you are after an associative array ODP binding:
http://weblogs.asp.net/ricardoperes/archive/2009/05/14/odp-net-associative-arrays.aspx
you'll want to use
param1.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
and everything should fall into place
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With