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
{


    /// <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();
        }

        /// <summary>
        /// 測试 调用 Oracle 函数.
        /// </summary>
        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();
        }


        /// <summary>
        /// 測试 调用 Oracle 返回结果集的函数.
        /// </summary>
        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();
        }

        /// <summary>
        /// 測试运行存储过程.
        /// </summary>
        /// <param name="conn"></param>
        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);

        }

    }
}

C# 访问Oracle示例+PL/SQL+存储过程+触发器 完整示例 测试可用 --PL/SQL基础1 declare begin dbms_output.('不输出不换行'); dbms_output.put_line('输出并换行'); end; --PL/SQL基础2 declare dig number(20,2); begin select avg(price) into dig from products; dbms_output.put_line('电子产品的平均价格是'||dig); end; --PL/SQL基础3 根据产品编号获得产品对象 --pname products.name%type; pname变量的类型与products.name列的类型一样 declare pid constant products.id%type:=1; --定义常量,初值1 pname products.name%type; pdate products.adddate%type; begin --pid:=1; select name,adddate into pname,pdate from products where id=pid; dbms_output.put_line('产品名称是:'||pname||',日期'||pdate); end; --PL/SQL基础4 根据产品编号获得产品对象 --obj products%rowtype; obj与products表的单行类型一样,可以通过点运算取值obj.price declare obj products%rowtype; begin select * into obj from products where id=&编号; dbms_output.put_line('产品名称是:'||obj.name||',价格:'||obj.price); end; --PL/SQL基础5 条件if declare vid products.id%type; vprice products.price%type; begin vid:=&编号; select price into vprice from products where id=vid; if vprice100 and vprice<=1000 then dbms_output.put_line('价格在100—1000之间'); else dbms_output.put_line('价格在1000以上'); end if; end; --PL/SQL基础5 多条件case begin case '&等级' when 'A' then dbms_output.put_line('优秀'); when 'B' then dbms_output.put_line('合格'); when 'C' then dbms_output.put_line('不合格'); end case; end; select id, name, typeid, price, adddate from products create table students( Id int primary key, sex int ) insert into students select 1,1 from dual union select 2,0 from dual union select 3,1 from dual union select 4,0 from dual union select 5,1 from dual insert into students(Id) values(6) select * from students; select translate(translate('1心1意 3心2意','1','一'),'3','三') from dual; select id,nvl(translate(translate(sex,1,'女'),0,'男'),'未知') from students; select id,case as 性别 from( sele
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值