-- 建表

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 存储过程样例代码的更多相关文章

  1. MyBatis调用Oracle存储过程

    MyBatis调用Oracle存储过程 1.无输入和输出参数的存储过程 2.带有输入和输出参数的存储过程 3.返回游标的存储过程 mybatis中的配置文件代码 <resultMap type= ...

  2. 使用ffmpeg实现转码样例(代码实现)

    分类: C/C++ 使用ffmpeg实现转码样例(代码实现) 使用ffmpeg转码主要工作如下: Demux -> Decoding -> Encoding -> Muxing 其中 ...

  3. java 线程、线程池基本应用演示样例代码回想

    java 线程.线程池基本应用演示样例代码回想 package org.rui.thread; /** * 定义任务 * * @author lenovo * */ public class Lift ...

  4. ECharts组件应用样例代码

    一.从Echarts官网上下载最新版本组件 Echarts是百度开发的开源Web图表组件,界面美观,使用简单.组件下载地址:http://echarts.baidu.com/echarts2/doc/ ...

  5. Java调用oracle存储过程通过游标返回临时表数据

    注:本文来源于 <  Java调用oracle存储过程通过游标返回临时表数据   > Java调用oracle存储过程通过游标返回临时表数据 项目开发过程中,不可避免的会用到存储过程返回结 ...

  6. java 又一次抛出异常 相关处理结果演示样例代码

    java 又一次抛出异常 相关处理结果演示样例代码 package org.rui.ExceptionTest; /** * 又一次抛出异常 * 在某些情况下,我们想又一次掷出刚才产生过的违例,特别是 ...

  7. C#调用Oracle存储过程

    C#调用Oracle存储过程的代码如下所示: using System; using System.Collections.Generic; using System.Collections.Obje ...

  8. java I/O进程控制,重定向 演示样例代码

    java I/O进程控制,重定向 演示样例代码 package org.rui.io.util; import java.io.*; /** * 标准I/O重定向 */ public class Re ...

  9. 123 c#调用oracle存储过程返回数据集 --通过oracle存储过程返回数据集

    c#调用oracle存储过程返回数据集 2008-12-20 10:59:57|  分类: net|字号 订阅   CREATE OR REPLACE PACKAGE pkg_tableTypeIS  ...

随机推荐

  1. 序列化 json和pickle

    序列化 1. 什么叫序列化 将原本的字典.列表等内容转换成一个字符串的过程就叫做序列化. 2.  json dumps loads    一般对字典和列表序列化 dump load       一般对 ...

  2. CF 579A (二进制拆分)

    在培养皿中,每个细胞每天会繁殖,数量*2 我们可以在任意天加入任意数量的细胞入培养皿中. 想要知道最少加入多少个细胞,可以使得有一天,培养皿中细胞的数量会恰好为x 其实就是输出X的二进制中有多少个1 ...

  3. day4作业模拟实现一个ATM + 购物商城程序

    作业需求: 模拟实现一个ATM + 购物商城程序 1.额度 15000或自定义: 2.实现购物商城,买东西加入 购物车,调用信用卡接口结账: 3.可以提现,手续费5%: 4.每月22号出账单,每月10 ...

  4. Observer 观察者

    意图 定义对象间的一种一对多的依赖关系 ,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新. 动机 一致性,松耦合 需要维护相关对象间的一致性.我们不希望为了维持一致性而使各类紧 ...

  5. python 字符串截断

    >>> s = '%20and%201=2%20union%20select%201,group_concat%28table_name%29,3,4,5,6,7,8,9,10,11 ...

  6. python IDE之sublime真是个好东东

    简捷轻爽,代码自动补齐.很好用. python3 { "shell_cmd": "python3 -u \"$file\"", " ...

  7. thinkphp5.0与thinkphp3.2之间的区别

    5.0版本和之前版本的差异较大,本篇对熟悉3.2版本的用户给出了一些5.0的主要区别. URL和路由 5.0的URL访问不再支持普通URL模式,路由也不支持正则路由定义,而是全部改为规则路由配合变量规 ...

  8. MyISAM InnoDB 区别(转载)

    MyISAM 和 InnoDB 讲解 InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定.基本的差别为:MyISAM类型不支持事务处理等高级处 ...

  9. 异步任务 -- FutureTask

    任务提交 之前在分析线程池的时候,提到过 AbstractExecutorService 的实现: public Future<?> submit(Runnable task) { if ...

  10. Netty堆外内存泄露排查与总结

    导读 Netty 是一个异步事件驱动的网络通信层框架,用于快速开发高可用高性能的服务端网络框架与客户端程序,它极大地简化了 TCP 和 UDP 套接字服务器等网络编程. Netty 底层基于 JDK ...