zoukankan      html  css  js  c++  java
  • 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);

            }

        }
    }

  • 相关阅读:
    Serverless Kubernetes入门:对kubernetes做减法
    Quick BI的宝藏工具——交叉表
    Quick BI的SQL传参建模可以用在什么场景
    Quick BI支持哪些数据源(配置操作篇)
    注册 asp.net IIS
    js Date 生成某年某月的天数
    IOC AOP 设计模式
    stuff for xml path
    使用Sencha Cmd创建脚本框架
    Extjs Ext.TreePanel
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/3774716.html
Copyright © 2011-2022 走看看