天天看點

C#調用 Oracle 存儲過程樣例代碼

-- 建表

CREATE TABLE sale_report (

     sale_date

DATE NOT NULL ,

     sale_item VARCHAR(2) NOT NULL ,

     sale_money DECIMAL(10,2) NOT NULL,

     PRIMARY KEY(sale_date, sale_item)

);

-- 測試資料

DECLARE

v_begin_day DATE;

v_end_day DATE;

BEGIN

v_begin_day := TO_DATE(‘2009-01-01‘, ‘YYYY-MM-DD‘);

v_end_day   :=

TO_DATE(‘2010-01-01‘, ‘YYYY-MM-DD‘);

WHILE v_begin_day < v_end_day LOOP

    INSERT INTO

SALE_REPORT VALUES(v_begin_day, ‘A‘,   1 );

INSERT INTO SALE_REPORT VALUES(v_begin_day, ‘B‘,   2 );

    INSERT INTO SALE_REPORT VALUES(v_begin_day, ‘C‘,  

3 );

    v_begin_day := v_begin_day + 1;

END LOOP;

END;

/

-- 測試函數

CREATE OR REPLACE FUNCTION HelloWorldFunc

RETURN VARCHAR2

AS

RETURN ‘Hello World!‘;

-- 測試存儲過程

CREATE OR REPLACE PROCEDURE HelloWorld2 (

p_user_name

IN     VARCHAR2,

p_out_val  

OUT    VARCHAR2,

p_inout_val IN OUT VARCHAR2

) AS

   dbms_output.put_line(‘Hello ‘ || p_user_name ||

p_inout_val || ‘!‘);

   p_out_val := ‘A‘;

p_inout_val := ‘B‘;

END HelloWorld2;

-- 測試傳回結果集的函數

create or replace package pkg_HelloWorld as

-- 定義ref

cursor類型

type myrctype is ref cursor;

--函數申明

function getHelloWorld

return myrctype;

end pkg_HelloWorld;

CREATE OR REPLACE package body pkg_HelloWorld as

return myrctype

IS

    return_cursor myrctype;

    OPEN return_cursor FOR ‘SELECT ‘‘Hello‘‘ AS a, ‘‘World‘‘ AS B

FROM dual‘;

    return return_cursor;

END

getHelloWorld;

以上為資料庫表、測試資料、存儲過程腳本

下面為 C#樣例代碼

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Data;

using System.Data.OracleClient;

namespace A0170_Oracle.Sample

{

    /// <summary>

    /// 用于 訪問

Oracle 資料庫 存儲過程與函數 的樣例。

    ///

注意:這個樣例所使用的 表 和 資料, 請參考項目下的 Schema.sql 檔案。

    /// </summary>

    class

CallOracleFuncProc

    {

        /// <summary>

        /// Oracle 的資料庫連接配接字元串.

        /// </summary>

        private const String connString =

            @"Data

Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.210)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCL)));User

Id=TEST;Password=TEST123";

        public void

TestCallFuncProc()

        {

            //

建立資料庫連接配接.

OracleConnection conn = new OracleConnection(connString);

打開連接配接.

conn.Open();

            // 調用

Oracle 函數.

CallFunc(conn);

Oracle 傳回結果集的函數

CallFuncWithTable(conn);

調用存儲過程

CallProcedure(conn);

關閉資料庫連接配接.

conn.Close();

        }

        /// 測試 調用 Oracle 函數.

        private void

CallFunc(OracleConnection conn)

            // 建立一個

Command.

OracleCommand testCommand = conn.CreateCommand();

定義須要運作的SQL語句.

testCommand.CommandText = "SELECT HelloWorldFunc() FROM dual";

運作SQL指令,結果存儲到Reader中.

OracleDataReader testReader = testCommand.ExecuteReader();

處理檢索出來的每一條資料.

            while

(testReader.Read())

            {

// 将檢索出來的資料,輸出到螢幕上.

Console.WriteLine("調用函數:{0}; 傳回:{1}",

testCommand.CommandText, testReader[0]

            }

關閉Reader.

testReader.Close();

        /// 測試 調用 Oracle 傳回結果集的函數.

CallFuncWithTable(OracleConnection conn)

testCommand.CommandText = "pkg_HelloWorld.getHelloWorld";

定義好,本次運作的類型,是存儲過程.

testCommand.CommandType = CommandType.StoredProcedure;

定義好,我這個參數,是 遊标 + 傳回值.

OracleParameter para = new OracleParameter("c", OracleType.Cursor);

para.Direction = ParameterDirection.ReturnValue;

testCommand.Parameters.Add(para);

Console.WriteLine("調用函數:{0}; 傳回:{1} - {2}",

testCommand.CommandText, testReader[0], testReader[1]

        /// 測試運作存儲過程.

        /// <param

name="conn"></param>

private void CallProcedure(OracleConnection conn)

testCommand.CommandText = "HelloWorld2";

定義要查詢的參數.

// 第一個參數,是輸入的.

testCommand.Parameters.Add(new OracleParameter("p_user_name", "HeiHei"));

第2個參數,是輸出的.

OracleParameter para2 = new OracleParameter("p_out_val", OracleType.VarChar,

10);

para2.Direction = ParameterDirection.Output;

testCommand.Parameters.Add(para2);

第3個參數,是既輸入又輸出的.

OracleParameter para3 = new OracleParameter("p_inout_val", OracleType.VarChar,

20);

para3.Direction = ParameterDirection.InputOutput;

            para3.Value =

"HAHA";

testCommand.Parameters.Add(para3);

ExecuteNonQuery 方法,表明本次操作,不是一個查詢的操作。将沒有結果集合傳回.

            // 傳回的資料,将是

被影響的記錄數.

int insertRowCount = testCommand.ExecuteNonQuery();

存儲過程運作完成後,取得 output 出來的資料.

            String pa2 =

testCommand.Parameters["p_out_val"].Value.ToString();

            String pa3 =

testCommand.Parameters["p_inout_val"].Value.ToString();

Console.WriteLine("調用 {0} 存儲過程之後, p_out_val={1}; p_inout_val={2}",

testCommand.CommandText, pa2, pa3);

    }

}