摘自:http://www.c-sharpcorner.com/UploadFile/john_charles/CallingOraclestoredproceduresfromMicrosoftdotNET06222007142805PM/CallingOraclestoredproceduresfromMicrosoftdotNET.aspx
Introduction

This article is intended to illustrate how to illustrate how to call Oracle stored procedures and functions from Microsoft.NET through the Microsoft.NET Oracle provider and its object model residing in the namespace System.Data.OracleClient. I will cover several possible scenarios with advanced examples.

Executing a stored procedure

Let's begin with definitions. A procedure is a module that performs one or more actions. A function is a module that returns a value and unlike procedures a call to a function can exist only as part of an executable such as an element in an expression or the value assigned as default in a declaration of a variable.

The first example illustrates how to call an Oracle procedure passing input parameters and retrieving value by output parameters. For all the examples, we're going to use the default database ORCL which comes with the Oracle database installation. The following code in Listing 1 shows how to create a procedure named count_emp_by_dept which receives as its input parameter the department number and sends as its output parameter the number of employees in this department.

create or replace procedure count_emp_by_dept(pin_deptno number, pout_count out number)
is
begin
 select
count(*) into pout_count
 from scott.emp
 where deptno=pin_deptno;
end count_emp_by_dept;



Listing 1: Creating the procedure  count_emp_by_dept.

Now let's create a console Let's see the application code in Listing 10.

using System;

using System.Collections.Generic;

using System.Text;

using System.Data.OracleClient;

using System.Data;

 

namespace CallingOracleStoredProc

{

    class Program

    {

        private static void prvPrintReader(OracleDataReader objReader)

        {

            for (int i = 0; i < objReader.FieldCount; i++)

            {

                System.Console.Write("{0}\t",objReader.GetName(i));

            }

            System.Console.Write("\n");

 

            while (objReader.Read())

            {

                for (int i = 0; i < objReader.FieldCount; i++)

                {

                    System.Console.Write("{0}\t", objReader[i].ToString());

                }

                System.Console.Write("\n");

            }

        }

 

        static void Main(string[] args)

        {

            using (OracleConnection objConn = new OracleConnection("Data Source=ORCL; User ID=scott; Password=tiger"))

            {

                OracleCommand objCmd = new OracleCommand();

                objCmd.Connection = objConn;

                objCmd.CommandText = "human_resources.get_employee_department";

                objCmd.CommandType = CommandType.StoredProcedure;

                objCmd.Parameters.Add("cur_employees", OracleType.Cursor).Direction = ParameterDirection.Output;

                objCmd.Parameters.Add("cur_departments", OracleType.Cursor).Direction = ParameterDirection.Output;

 

                try

                {

                    objConn.Open();

                    OracleDataReader objReader = objCmd.ExecuteReader();

                    prvPrintReader(objReader);

                    objReader.NextResult();

                    prvPrintReader(objReader);

                }

                catch (Exception ex)

                {

                    System.Console.WriteLine("Exception: {0}",ex.ToString());

                }

 

                objConn.Close();

            }

        }

 

    }

}


Listing 10: The application code.

Working with DataSet and DataAdapter

The final example shows how to fill and update a DataSet object through a DataAdapter object.

The first thing to do is create four CRUD procedure to the emp table.  Listing 11 shows how to create the package header.

create or replace package human_resources
as
 
type t_cursor is ref cursor;
 procedure
select_employee(cur_employees out t_cursor);
 procedure insert_employee(p_empno number, p_ename varchar2, p_job varchar2, p_mgr number, p_hiredate date, p_sal number, p_comm number, p_deptno number);
 procedure update_employee(p_empno number, p_ename varchar2, p_job varchar2, p_mgr number, p_hiredate date, p_sal number, p_comm number, p_deptno number);
 procedure delete_employee(p_empno number);
end
human_resources;

Listing 11: The creation of the package header.

Now let's define the package body as shown in Listing 12

create or replace package body human_resources
as
 procedure
select_employee(cur_employees out t_cursor)
 is
 begin
   open
cur_employees for select empno, ename, job, mgr, hiredate, sal, comm, deptno from emp;
 end select_employee;
 procedure insert_employee(p_empno number, p_ename varchar2, p_job varchar2, p_mgr number, p_hiredate date, p_sal number, p_comm number, p_deptno number)
 is
 begin
   update
emp
   set ename=p_ename, job=p_job, mgr=p_mgr, hiredate=p_hiredate, sal=p_sal, comm=p_comm, deptno=p_deptno
   where empno=p_empno;
 end insert_employee;
 procedure update_employee(p_empno number, p_ename varchar2, p_job varchar2, p_mgr number, p_hiredate date, p_sal number, p_comm number, p_deptno number)
 is
 begin
   insert into
emp
   values(p_empno,p_ename,p_job,p_mgr,p_hiredate,p_sal,p_comm,p_deptno);
 end update_employee;
 procedure delete_employee(p_empno number)
 is
 begin
    delete from
emp
    where empno=p_empno;
 end delete_employee;
end human_resources;

Listing 12: The package body creation.

And finally, let's see the application code in Listing 13. As you can see, to fill the data table, we need to define the CRUD (create, read, update, delete) operations through the OracleCommand and associate it to the DataAdapter. I fill the data table, and print out a message with the number of employees so far, and then add a new row representing one employee entity.

using System;

using System.Collections.Generic;

using System.Text;

using System.Data.OracleClient;

using System.Data;

 

namespace CallingOracleStoredProc

{

    class Program

    {

        static void Main(string[] args)

        {

            using (OracleConnection objConn = new OracleConnection("Data Source=ORCL; User ID=scott; Password=tiger"))

            {

                OracleDataAdapter objAdapter = new OracleDataAdapter();

 

                OracleCommand objSelectCmd = new OracleCommand();

                objSelectCmd.Connection = objConn;

                objSelectCmd.CommandText = "human_resources.select_employee";

                objSelectCmd.CommandType = CommandType.StoredProcedure;

                objSelectCmd.Parameters.Add("cur_employees", OracleType.Cursor).Direction = ParameterDirection.Output;

                objAdapter.SelectCommand = objSelectCmd;

 

                OracleCommand objInsertCmd = new OracleCommand();

                objInsertCmd.Connection = objConn;

                objInsertCmd.CommandText = "human_resources.insert_employee";

                objInsertCmd.CommandType = CommandType.StoredProcedure;

                objInsertCmd.Parameters.Add("p_empno", OracleType.Number, 4, "empno");

                objInsertCmd.Parameters.Add("p_ename", OracleType.VarChar, 10, "ename");

                objInsertCmd.Parameters.Add("p_job", OracleType.VarChar, 9, "job");

                objInsertCmd.Parameters.Add("p_mgr", OracleType.Number, 4, "mgr");

                objInsertCmd.Parameters.Add("p_hiredate", OracleType.DateTime,12, "hiredate");

                objInsertCmd.Parameters.Add("p_sal", OracleType.Number, 7, "sal");

                objInsertCmd.Parameters.Add("p_comm", OracleType.Number, 7, "comm");

                objInsertCmd.Parameters.Add("p_deptno", OracleType.Number, 7, "deptno");

                objAdapter.InsertCommand = objInsertCmd;

 

                OracleCommand objUpdateCmd = new OracleCommand();

                objUpdateCmd.Connection = objConn;

                objUpdateCmd.CommandText = "human_resources.update_employee";

                objUpdateCmd.CommandType = CommandType.StoredProcedure;

                objUpdateCmd.Parameters.Add("p_empno", OracleType.Number, 4, "empno");

                objUpdateCmd.Parameters.Add("p_ename", OracleType.VarChar, 10, "ename");

                objUpdateCmd.Parameters.Add("p_job", OracleType.VarChar, 9, "job");

                objUpdateCmd.Parameters.Add("p_mgr", OracleType.Number, 4, "mgr");

                objUpdateCmd.Parameters.Add("p_hiredate", OracleType.DateTime, 10, "hiredate");

                objUpdateCmd.Parameters.Add("p_sal", OracleType.Number, 7, "sal");

                objUpdateCmd.Parameters.Add("p_comm", OracleType.Number, 7, "comm");

                objUpdateCmd.Parameters.Add("p_deptno", OracleType.Number, 7, "deptno");

                objAdapter.UpdateCommand = objUpdateCmd;

 

                OracleCommand objDeleteCmd = new OracleCommand();

                objDeleteCmd.Connection = objConn;

                objDeleteCmd.CommandText = "human_resources.delete_employee";

                objDeleteCmd.CommandType = CommandType.StoredProcedure;

                objDeleteCmd.Parameters.Add("p_empno", OracleType.Number, 4, "empno");

                objAdapter.DeleteCommand = objDeleteCmd;

 

                try

                {

                    DataTable dtEmp = new DataTable();

                    objAdapter.Fill(dtEmp);

 

                    System.Console.WriteLine("Employee count = {0}", dtEmp.Rows.Count );

                    dtEmp.Rows.Add(7935, "John", "Manager", 7782, DateTime.Now,1300,0,10);

 

                    objAdapter.Update(dtEmp);

 

                }

                catch (Exception ex)

                {

                    System.Console.WriteLine("Exception: {0}",ex.ToString());

                }

 

                objConn.Close();

            }

        }

 

    }

}

Listing 12: The application code.

相关文章: