c oracle存储过程,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

BEGIN

RETURN 'Hello World!';

END;

/

-- 測试存储过程

CREATE OR REPLACE PROCEDURE HelloWorld2 (

p_user_name IN     VARCHAR2,

p_out_val   OUT    VARCHAR2,

p_inout_val IN OUT VARCHAR2

) AS

BEGIN

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

function getHelloWorld return myrctype

IS

return_cursor myrctype;

BEGIN

OPEN return_cursor FOR 'SELECT ''Hello'' AS a, ''World'' AS B FROM dual';

return return_cursor;

END getHelloWorld;

end pkg_HelloWorld;

/

以上为数据库表、測试数据、存储过程脚本

下面为 C#样例代码

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Data;

using System.Data.OracleClient;

namespace A0170_Oracle.Sample

{

///

/// 用于 訪问 Oracle 数据库 存储过程与函数 的样例。

///

/// 注意:这个样例所使用的 表 和 数据, 请參考项目下的 Schema.sql 文件。

///

///

class CallOracleFuncProc

{

///

/// Oracle 的数据库连接字符串.

///

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 返回结果集的函数.

///

private void CallFuncWithTable(OracleConnection conn)

{

// 创建一个 Command.

OracleCommand testCommand = conn.CreateCommand();

// 定义须要运行的SQL语句.

testCommand.CommandText = "pkg_HelloWorld.getHelloWorld";

// 定义好,本次运行的类型,是存储过程.

testCommand.CommandType = CommandType.StoredProcedure;

// 定义好,我这个參数,是 游标 + 返回值.

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

para.Direction = ParameterDirection.ReturnValue;

testCommand.Parameters.Add(para);

// 运行SQL命令,结果存储到Reader中.

OracleDataReader testReader = testCommand.ExecuteReader();

// 处理检索出来的每一条数据.

while (testReader.Read())

{

// 将检索出来的数据,输出到屏幕上.

Console.WriteLine("调用函数:{0}; 返回:{1} - {2}",

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

);

}

// 关闭Reader.

testReader.Close();

}

///

/// 測试运行存储过程.

///

///

private void CallProcedure(OracleConnection conn)

{

// 创建一个 Command.

OracleCommand testCommand = conn.CreateCommand();

// 定义须要运行的SQL语句.

testCommand.CommandText = "HelloWorld2";

// 定义好,本次运行的类型,是存储过程.

testCommand.CommandType = CommandType.StoredProcedure;

// 定义要查询的參数.

// 第一个參数,是输入的.

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);

}

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值