最近老总让使用存储过程,说这个比较好用,抓起本oracle书看了看,写存储过程不是很难,但是写了存储过程调用的时候遇到许多问题,经过一天时间,把各种能遇到i的问题基本总结了下,跟大家分享。

照例画了张图,先了解下各种调用oracle存储过程的情形:

(这里自己创建了一个sqlhelper类,C#调用的时候用到了这个,这个类放到了末尾)

一、非查询存储过程

1、无参数

创建存储过程

CREATE OR REPLACE
PROCEDURE "USP_XCY" AS
BEGINUPDATE T_CITY set F_INFO='info' WHERE F_ID='140100';
END;

调用存储过程

            string proName = "usp_xcy";int result = SQLHelper.ExcuteProc(proName);

2、输入参数

创建存储过程

CREATE OR REPLACE
PROCEDURE "USP_SELECT" (parm_id  VARCHAR2)
AS
BEGINUPDATE T_CITY set F_INFO='info' WHERE F_ID=parm_id;
END;

调用存储过程

            string input = "140200";string proName = "USP_SELECT";OracleParameter[] param = new OracleParameter[1];param[0] = new OracleParameter("parm_id", OracleDbType.Varchar2, input, ParameterDirection.Input);int result = SQLHelper.ExcuteProc(proName, param);

3、输出参数

创建存储过程

CREATE OR REPLACE
PROCEDURE "USP_OUT" (parm_name IN VARCHAR2,parm_count OUT NUMBER )
AS
BEGIN-- routine body goes here, e.g.-- DBMS_OUTPUT.PUT_LINE('Navica t for Oracle');SELECT COUNT(*) INTO parm_count FROM T_CITY WHERE T_CITY.F_NAME like '%'||parm_name||'%';END ;

调用存储过程

            string input = "市";string output = "";string proName = "USP_OUT";OracleParameter[] param = new OracleParameter[2];param[0] = new OracleParameter("parm_name", OracleDbType.Varchar2, input, ParameterDirection.Input);param[1] = new OracleParameter("parm_count", OracleDbType.Int32, output, ParameterDirection.Output);int result = SQLHelper.ExcuteProc(proName, param);output = param[1].Value.ToString();

二、查询存储过程

1、返回datatable

创建存储过程

CREATE OR REPLACE
PROCEDURE "USP_RESULT" (parm_cursor OUT sys_refcursor)AS
BEGIN-- routine body goes here, e.g.-- DBMS_OUTPUT.PUT_LINE('Navicat for Oracle');
open parm_cursor FORSELECT * FROM T_CITY;
END;

调用存储过程

            string procName = "USP_RESULT";OracleParameter[] param = new OracleParameter[1];param[0] = new OracleParameter("parm_cursor", OracleDbType.RefCursor, ParameterDirection.Output);DataSet ds = SQLHelper.getDataSetProc(procName, param);DataTable dt = ds.Tables[0];

2、返回datareader

创建存储过程

CREATE OR REPLACE
PROCEDURE "USP_RESULT" (parm_cursor OUT sys_refcursor)AS
BEGIN-- routine body goes here, e.g.-- DBMS_OUTPUT.PUT_LINE('Navicat for Oracle');
open parm_cursor FORSELECT * FROM T_CITY;
END;

调用存储过程

            string procName = "USP_RESULT";OracleParameter[] param = new OracleParameter[1];param[0] = new OracleParameter("parm_cursor", OracleDbType.RefCursor, ParameterDirection.Output);OracleDataReader reader = SQLHelper.GetReaderByProc(procName, param);while (reader.Read()){string s = reader[0].ToString();}

最后备注下,调用oracle中的存储过程,oracle必须把存储过程名称大写,C#查询时自动会把查询名改为大写,so不然一直报错==

最后献上历经一个月改造,超级无敌sqlhelper类,不喜勿喷:

/*xcy于11.09修改,原sqlserver的DBHelper*/
using Oracle.ManagedDataAccess.Client;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;namespace JGS.Utility
{public class SQLHelper{//连接字符串static string strConn = ConfigurationManager.ConnectionStrings["xcyCon"].ToString();#region 执行查询,返回DataTable对象-----------------------public static DataTable GetTableProc(string procName){return (GetTable(procName, null, CommandType.StoredProcedure));}public static DataTable GetTableProc(string procName, OracleParameter[] pas){return (GetTable(procName, pas, CommandType.StoredProcedure));}public static DataTable GetTable(string strSQL){return GetTable(strSQL, null);}public static DataTable GetTable(string strSQL, OracleParameter[] pas){return GetTable(strSQL, pas, CommandType.Text);}/// <summary>/// 执行查询,返回DataTable对象/// </summary>/// <param name="strSQL">sql语句</param>/// <param name="pas">参数数组</param>/// <param name="cmdtype">Command类型</param>/// <returns>DataTable对象</returns>public static DataTable GetTable(string strSQL, OracleParameter[] pas, CommandType cmdtype){DataTable dt = new DataTable(); ;using (OracleConnection conn = new OracleConnection(strConn)){OracleDataAdapter da = new OracleDataAdapter(strSQL, conn);da.SelectCommand.CommandType = cmdtype;if (pas != null){da.SelectCommand.Parameters.AddRange(pas);}da.Fill(dt);}return dt;}#endregion#region 执行查询,返回DataSet对象-------------------------public static DataSet getDataSetProc(string procName){return (GetDataSet(procName,null,CommandType.StoredProcedure));}public static DataSet getDataSetProc(string procName,OracleParameter[]pas){return (GetDataSet(procName, pas, CommandType.StoredProcedure));}public static DataSet GetDataSet(string strSQL){return GetDataSet(strSQL, null);}public static DataSet GetDataSet(string strSQL, OracleParameter[] pas){return GetDataSet(strSQL, pas, CommandType.Text);}/// <summary>/// 执行查询,返回DataSet对象/// </summary>/// <param name="strSQL">sql语句</param>/// <param name="pas">参数数组</param>/// <param name="cmdtype">Command类型</param>/// <returns>DataSet对象</returns>public static DataSet GetDataSet(string strSQL, OracleParameter[] pas, CommandType cmdtype){DataSet dt = new DataSet();using (OracleConnection conn = new OracleConnection(strConn)){OracleDataAdapter da = new OracleDataAdapter(strSQL, conn);da.SelectCommand.CommandType = cmdtype;if (pas != null){da.SelectCommand.Parameters.AddRange(pas);}da.Fill(dt);}return dt;}#endregion#region 执行非查询存储过程和SQL语句-----------------------------public static int ExcuteProc(string ProcName){return ExcuteSQL(ProcName, null, CommandType.StoredProcedure);}public static int ExcuteProc(string ProcName, OracleParameter[] pars){return ExcuteSQL(ProcName, pars, CommandType.StoredProcedure);}public static int ExcuteSQL(string strSQL){return ExcuteSQL(strSQL, null);}public static int ExcuteSQL(string strSQL, OracleParameter[] paras){return ExcuteSQL(strSQL, paras, CommandType.Text);}/// 执行非查询存储过程和SQL语句/// 增、删、改/// </summary>/// <param name="strSQL">要执行的SQL语句</param>/// <param name="paras">参数列表,没有参数填入null</param>/// <param name="cmdType">Command类型</param>/// <returns>返回影响行数</returns>public static int ExcuteSQL(string strSQL, OracleParameter[] paras, CommandType cmdType){int i = 0;using (OracleConnection conn = new OracleConnection(strConn)){OracleCommand cmd = new OracleCommand(strSQL, conn);cmd.CommandType = cmdType;if (paras != null){cmd.Parameters.AddRange(paras);}conn.Open();i = cmd.ExecuteNonQuery();conn.Close();}return i;}#endregion#region 执行查询返回第一行,第一列---------------------------------public static int ExcuteScalarSQL(string strSQL){return ExcuteScalarSQL(strSQL, null);}public static int ExcuteScalarSQL(string strSQL, OracleParameter[] paras){return ExcuteScalarSQL(strSQL, paras, CommandType.Text);}public static int ExcuteScalarProc(string strSQL, OracleParameter[] paras){return ExcuteScalarSQL(strSQL, paras, CommandType.StoredProcedure);}/// <summary>/// 执行SQL语句,返回第一行,第一列/// </summary>/// <param name="strSQL">要执行的SQL语句</param>/// <param name="paras">参数列表,没有参数填入null</param>/// <returns>返回影响行数</returns>public static int ExcuteScalarSQL(string strSQL, OracleParameter[] paras, CommandType cmdType){int i = 0;using (OracleConnection conn = new OracleConnection(strConn)){OracleCommand cmd = new OracleCommand(strSQL, conn);cmd.CommandType = cmdType;if (paras != null){cmd.Parameters.AddRange(paras);}conn.Open();i = Convert.ToInt32(cmd.ExecuteScalar());conn.Close();}return i;}#endregion#region 查询获取单个值------------------------------------/// <summary>/// 调用不带参数的存储过程获取单个值/// </summary>/// <param name="ProcName"></param>/// <returns></returns>public static object GetObjectByProc(string ProcName){return GetObjectByProc(ProcName, null);}/// <summary>/// 调用带参数的存储过程获取单个值/// </summary>/// <param name="ProcName"></param>/// <param name="paras"></param>/// <returns></returns>public static object GetObjectByProc(string ProcName, OracleParameter[] paras){return GetObject(ProcName, paras, CommandType.StoredProcedure);}/// <summary>/// 根据sql语句获取单个值/// </summary>/// <param name="strSQL"></param>/// <returns></returns>public static object GetObject(string strSQL){return GetObject(strSQL, null);}/// <summary>/// 根据sql语句 和 参数数组获取单个值/// </summary>/// <param name="strSQL"></param>/// <param name="paras"></param>/// <returns></returns>public static object GetObject(string strSQL, OracleParameter[] paras){return GetObject(strSQL, paras, CommandType.Text);}/// <summary>/// 执行SQL语句,返回首行首列/// </summary>/// <param name="strSQL">要执行的SQL语句</param>/// <param name="paras">参数列表,没有参数填入null</param>/// <returns>返回的首行首列</returns>public static object GetObject(string strSQL, OracleParameter[] paras, CommandType cmdtype){object o = null;using (OracleConnection conn = new OracleConnection(strConn)){OracleCommand cmd = new OracleCommand(strSQL, conn);cmd.CommandType = cmdtype;if (paras != null){cmd.Parameters.AddRange(paras);}conn.Open();o = cmd.ExecuteScalar();conn.Close();}return o;}#endregion#region 查询获取DataReader------------------------------------/// <summary>/// 调用不带参数的存储过程,返回DataReader对象/// </summary>/// <param name="procName">存储过程名称</param>/// <returns>DataReader对象</returns>public static OracleDataReader GetReaderByProc(string procName){return GetReaderByProc(procName, null);}/// <summary>/// 调用带有参数的存储过程,返回DataReader对象/// </summary>/// <param name="procName">存储过程名</param>/// <param name="paras">参数数组</param>/// <returns>DataReader对象</returns>public static OracleDataReader GetReaderByProc(string procName, OracleParameter[] paras){return GetReader(procName, paras, CommandType.StoredProcedure);}/// <summary>/// 根据sql语句返回DataReader对象/// </summary>/// <param name="strSQL">sql语句</param>/// <returns>DataReader对象</returns>public static OracleDataReader GetReader(string strSQL){return GetReader(strSQL, null);}/// <summary>/// 根据sql语句和参数返回DataReader对象/// </summary>/// <param name="strSQL">sql语句</param>/// <param name="paras">参数数组</param>/// <returns>DataReader对象</returns>public static OracleDataReader GetReader(string strSQL, OracleParameter[] paras){return GetReader(strSQL, paras, CommandType.Text);}/// <summary>/// 查询SQL语句获取DataReader/// </summary>/// <param name="strSQL">查询的SQL语句</param>/// <param name="paras">参数列表,没有参数填入null</param>/// <returns>查询到的DataReader(关闭该对象的时候,自动关闭连接)</returns>public static OracleDataReader GetReader(string strSQL, OracleParameter[] paras, CommandType cmdtype){OracleDataReader sqldr = null;OracleConnection conn = new OracleConnection(strConn);OracleCommand cmd = new OracleCommand(strSQL, conn);cmd.CommandType = cmdtype;if (paras != null){cmd.Parameters.AddRange(paras);}conn.Open();//CommandBehavior.CloseConnection的作用是如果关联的DataReader对象关闭,则连接自动关闭sqldr = cmd.ExecuteReader(CommandBehavior.CloseConnection);return sqldr;}#endregion/*#region 批量插入数据---------------------------------------------/// <summary>/// 往数据库中批量插入数据/// </summary>/// <param name="sourceDt">数据源表</param>/// <param name="targetTable">服务器上目标表</param>public static void BulkToDB(DataTable sourceDt, string targetTable){OracleConnection conn = new OracleConnection(strConn);SqlBulkCopy bulkCopy = new SqlBulkCopy(conn);   //用其它源的数据有效批量加载sql server表中bulkCopy.DestinationTableName = targetTable;    //服务器上目标表的名称bulkCopy.BatchSize = sourceDt.Rows.Count;   //每一批次中的行数try{conn.Open();if (sourceDt != null && sourceDt.Rows.Count != 0)bulkCopy.WriteToServer(sourceDt);   //将提供的数据源中的所有行复制到目标表中}catch (Exception ex){throw ex;}finally{conn.Close();if (bulkCopy != null)bulkCopy.Close();}}#endregion*/}}

SQL那些事儿(十四)--C#调用oracle存储过程(查询非查询and有参无参)深度好文相关推荐

  1. php oracle 存储过程 返回值,PHP 调用 Oracle 存储过程 之 查询

    在网上找了很久都没找到结果,今天看帮助,结合JAVA程序中的一个实例,写出了这个PHP调用Oracle存储过程的例子,也许有人会说PHP调用存储过程是很简单的,但在这里我还是想把这点小成就拿来共享一下 ...

  2. python数据挖掘学习笔记】十四.Scipy调用curve_fit实现曲线拟合

    #2018-03-28 10:02:08 March Wednesday the 13 week, the 087 day SZ SSMR python数据挖掘学习笔记]十四.Scipy调用curve ...

  3. C#调用Oracle存储过程分页

    直接调用Oracle中的存储过程完成对表的分页,对代码封闭程度高,执行高效.以下为C#分页类代码,包括Oracle数据库 端存储过程PLSQL代码. //    程序调用示例: // int tota ...

  4. spring+springMvc+mybatis 调用oracle 存储过程

    最近在项目中遇到在mybatis中调用oracle存储过程的问题,网上各种查询,最终解决了问题,在我们项目中我只需要oracle 的存储过程返回一个字符串用来存入数据库作为表数据的主键, 接下来整理代 ...

  5. 关于调用Oracle存储过程时发生“BCD Overflow”错误的处理

    笔者最近在使用TSQLStoredProc调用Oracle存储过程时发现,即使存储过程体为空时,都会发生 BCD Overflow 错误,该表部分定义如下: PLANE_ALL_PARAMETER表: ...

  6. python调用oracle存,Python使用cx_Oracle调用Oracle存储过程的方法示例

    本文实例讲述了Python使用cx_Oracle调用Oracle存储过程的方法.分享给大家供大家参考,具体如下: 这里主要测试在Python中通过cx_Oracle调用PL/SQL. 首先,在数据库端 ...

  7. java c3p0 存储过程_JAVA Spring 连接池 调用 Oracle 存储过程的问题?

    求助,JAVA Spring 连接池 调用 Oracle 存储过程的问题?在Spring中配置了c3P0的连接池,在调用Oracle的存储过程时,报错[code]java.lang.ClassCast ...

  8. C语言/C++常见习题问答集锦(六十四) 之兔子繁殖(递归与非递归)

    C语言/C++常见习题问答集锦(六十四) 之兔子繁殖(递归与非递归) 程序之美 1.C语言,计算1乘以3×5*-乘n的积,并输出结果,n值由键盘接收. #include<stdio.h>v ...

  9. java调用oracle过程,JAVA调用ORACLE存储过程报错

    当前位置:我的异常网» Java Web开发 » JAVA调用ORACLE存储过程报错 JAVA调用ORACLE存储过程报错 www.myexceptions.net  网友分享于:2015-07-1 ...

最新文章

  1. c语言 宏 变长参数,科学网—C/C++中处理变长参数函数(Variadic Function)的几个宏 - 彭彬的博文...
  2. Nginx配置——防盗链
  3. AutoMySQLBackup 3.0 Bug:du: WARNING: use --si, not -H
  4. 大数据时代 我们还有隐私吗?
  5. 有人顶贴,是对你的肯定
  6. mybatis的延迟加载
  7. Volley简单学习使用五—— 源代码分析三
  8. 笔记 | 《机器学习》中主成分分析与度量学习
  9. MySQL数据库常用命令汇总
  10. 区块链2.0——以太坊
  11. 从Linux服务用命令直接拿文件保存到本机
  12. java 网吧管理系统_java网吧信息管理系统
  13. 简述四代计算机网络及特点,简述四代电子计算机及主要特点
  14. CentOS下载安装
  15. 金龄会为中老年群体搭建展现风采的舞台
  16. 聚焦数智化,企企通亮相2023中山市工业互联网数智化大会
  17. 开源许可违反:案例说明(Apache License 2.0)
  18. MODBUS通信协议代码
  19. 【转】SCI论文写作全攻略
  20. 高效的敏捷测试第十课 BDD实践和深化

热门文章

  1. Java set的区别_Java Set集合详解及Set与List的区别
  2. 洛谷——P2550 [AHOI2001]彩票摇奖
  3. HoloLens 2开发:关闭性能分析窗口
  4. [导入]Mobile Media API概述
  5. 4. Jmeter主界面的介绍
  6. Swift之UITextField+富文本+代理传值
  7. tomcat https 启用8443加证书
  8. Scala 学习之面向对象(3)
  9. 《SEO的艺术(原书第2版)》——3.3 理解搜索引擎流量和用户意图
  10. 【Computer Organization笔记25】I/O:程序直接控制,程序中断方式,直接存储访问(DMA),通道控制方式