ตอนที่ 22 : Visual C# (C# .Net) เรียกใช้ Oracle Stored Procedure |
ตอนที่ 22 : Visual C# (C# .Net) เรียกใช้ Oracle Stored Procedure ในหัวข้อนี้เราจะมาเรียนรู้วิธีการใช้ Visual C# (C# .Net) บน .NET Application เรียกใช้งาน Stored Procedure ของ Oracle Database ซึ่งในการเรียกใช้งาน Stored Procedure สามารถใช้ได้กับ Connector ชื่อว่า Oracle.DataAccess ส่วน System.Data.OracleClient นั้นได้ถูกประกาศยกเลิกไปแล้ว ส่วนคำสั่งในการการเรียกนั้น เราสามารถใช้คำสั่งเรียกชื่อ Stored ได้เลย โดยใช้ชุดการทำงานของ CommandType.StoredProcedure ถ้าหากมีค่า Parameters ก็จะต้องทำการ Pass ในรูปแบบของ IN หรือ OUT ค่าไปกับ Query ด้วย และหลังจากที่ CALL แล้วก็สามารถที่จะอ่าน Result ที่ Stored Procedure นั้นได้ส่งกลับมาให้ในรูปแบบของ Parameters ที่เป็น OUT
Table : CUSTOMER

การ Add Library ของ Oracle.DataAccess

คลิกขวาที่ Project เลือก Add Reference

เลือก Oracle.DataAccess แต่ทั้งนี้จะต้องทำการติดตั้ง Oracle Instance Client ให้เรียบร้อยซะก่อน
Example 1 : การใช้ .NET เรียก Stored Procedure แบบ Query ข้อมูลออกมา
Stored Procedure Name : GET_CUSTOMER()
CREATE OR REPLACE PROCEDURE GET_CUSTOMER
(pCountryCode IN VARCHAR2, pRowFound OUT NUMBER, pCustomer OUT SYS_REFCURSOR)
AS
BEGIN
-- OUT pCustomer
OPEN pCustomer FOR
SELECT *
FROM CUSTOMER WHERE COUNTRY_CODE = pCountryCode;
-- OUT pRowFound
SELECT COUNT(*) INTO pRowFound
FROM CUSTOMER WHERE COUNTRY_CODE = pCountryCode;
END;
Call
VAR pRowFound NUMBER;
VAR pCustomer REFCURSOR;
EXEC GET_CUSTOMER('US',:pRowFound,:pCustomer)
PRINT pRowFound;
PRINT pCustomer;

Code (C#)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using Oracle.DataAccess.Client;
using Oracle.DataAccess.Types;
namespace MyApplication
{
class Program
{
static void Main(string[] args)
{
OracleConnection objConn = new OracleConnection();
OracleCommand objCmd = new OracleCommand();
OracleDataAdapter dtAdapter = new OracleDataAdapter();
DataSet ds = new DataSet();
DataTable dt;
String strConnString, strStored;
strConnString = "Data Source=TCDB;User Id=myuser;Password=mypassword;";
objConn.ConnectionString = strConnString;
objConn.Open();
string sCountryCode = "US";
strStored = "GET_CUSTOMER";
objCmd.Parameters.Add(new OracleParameter("pCountryCode", OracleDbType.Varchar2)).Value = sCountryCode; // IN
objCmd.Parameters.Add(new OracleParameter("pRowFound", OracleDbType.Int32)).Direction = ParameterDirection.Output; // OUT
objCmd.Parameters.Add(new OracleParameter("pCustomer", OracleDbType.RefCursor)).Direction = ParameterDirection.Output; // OUT
objCmd.Connection = objConn;
objCmd.CommandText = strStored;
objCmd.CommandType = CommandType.StoredProcedure;
// objCmd.Parameters["pCustomer"].Value (REF CURSOR)
dtAdapter.SelectCommand = objCmd;
dtAdapter.Fill(ds);
// Get Result
// objCmd.Parameters["pRowFound"].Value
Console.WriteLine(string.Format("pRowFound = {0}", objCmd.Parameters["pRowFound"].Value));
Console.WriteLine("");
// Loop Data Table
dt = ds.Tables[0]; // *** Cursor at 0 , 1 , 2, ...
Console.WriteLine("pCustomer");
for (int i = 0; i <= dt.Rows.Count - 1; i++)
{
Console.Write(dt.Rows[i]["CUSTOMER_ID"]);
Console.Write(" - ");
Console.Write(dt.Rows[i]["NAME"]);
Console.Write(" - ");
Console.Write(dt.Rows[i]["EMAIL"]);
Console.Write(" - ");
Console.Write(dt.Rows[i]["COUNTRY_CODE"]);
Console.Write(" - ");
Console.Write(dt.Rows[i]["BUDGET"]);
Console.Write(" - ");
Console.Write(dt.Rows[i]["USED"]);
Console.WriteLine("");
}
objConn.Close();
objConn = null;
}
}
}
Result

Example 2 : การใช้ .NET เรียก Stored Procedure แบบ Query เพื่อ Insert ข้อมูล
Stored Procedure Name : INSERT_CUSTOMER()
CREATE OR REPLACE PROCEDURE INSERT_CUSTOMER
(
pCustomerID IN VARCHAR2,
pName IN VARCHAR2,
pEmail IN VARCHAR2,
pCountryCode IN VARCHAR2,
pBudget IN DECIMAL,
pUsed IN DECIMAL,
pResult OUT NUMBER,
pMessage OUT VARCHAR2
)
AS
BEGIN
-- Insert Statement 1
INSERT INTO CUSTOMER (CUSTOMER_ID, NAME, EMAIL, COUNTRY_CODE, BUDGET, USED)
VALUES (pCustomerID, pName, pEmail, pCountryCode, pBudget, pUsed);
-- Return row effected
pResult := SQL%ROWCOUNT;
pMessage := 'Insert Data Successfully';
-- Return error exception
EXCEPTION
WHEN OTHERS THEN
BEGIN
pResult := 0;
pMessage := 'Error - ' || SQLERRM;
END;
END;
Call
VAR pResult NUMBER;
VAR pMessage VARCHAR2;
EXEC INSERT_CUSTOMER('C005','Fun Wipa','[email protected]','TH','100000','0',:pResult,:pMessage);
PRINT pResult;
PRINT pMessage;

Code (C#)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using Oracle.DataAccess.Client;
using Oracle.DataAccess.Types;
namespace MyApplication
{
class Program
{
static void Main(string[] args)
{
OracleConnection objConn = new OracleConnection();
OracleCommand objCmd = new OracleCommand();
String strConnString, strStored;
strConnString = "Data Source=TCDB;User Id=myuser;Password=mypassword;";
objConn.ConnectionString = strConnString;
objConn.Open();
string strCustomerID = "C005";
string strName = "Fun Wipa";
string strEmail = "[email protected]";
string strCountryCode = "TH";
decimal dBudget = 100000;
decimal dUsed = 0;
strStored = "INSERT_CUSTOMER";
objCmd.Parameters.Add(new OracleParameter("pCustomerID", OracleDbType.Varchar2, 4)).Value = strCustomerID; // IN
objCmd.Parameters.Add(new OracleParameter("pName", OracleDbType.Varchar2, 150)).Value = strName; // IN
objCmd.Parameters.Add(new OracleParameter("pEmail", OracleDbType.Varchar2, 150)).Value = strEmail; // IN
objCmd.Parameters.Add(new OracleParameter("pCountryCode", OracleDbType.Varchar2, 2)).Value = strCountryCode; // IN
objCmd.Parameters.Add(new OracleParameter("pBudget", OracleDbType.Varchar2)).Value = dBudget; // IN
objCmd.Parameters.Add(new OracleParameter("pUsed", OracleDbType.Varchar2)).Value = dUsed; // IN
objCmd.Parameters.Add(new OracleParameter("pResult", OracleDbType.Int32)).Direction = ParameterDirection.Output; // OUT
objCmd.Parameters.Add(new OracleParameter("pMessage", OracleDbType.Varchar2, 500)).Direction = ParameterDirection.Output; // OUT
objCmd.Connection = objConn;
objCmd.CommandText = strStored;
objCmd.CommandType = CommandType.StoredProcedure;
objCmd.ExecuteNonQuery();
// Get Result
// objCmd.Parameters["pResult"].Value
Console.WriteLine(string.Format("pResult = {0}", objCmd.Parameters["pResult"].Value));
// objCmd.Parameters["pMessage"].Value
Console.WriteLine(string.Format("pMessage = {0}", objCmd.Parameters["pMessage"].Value));
objConn.Close();
objConn = null;
}
}
}
Result

กรณีที่ Insert ข้อมูลสำเร็จ

กรณีที่ Insert ข้อมูลไม่สำเร็จ

ตอนที่ 20 : Visual Basic (VB.Net) เรียกใช้ Oracle Stored Procedure
|