- 浏览: 329061 次
- 性别:
- 来自: 西安
文章分类
最新评论
-
hufangxian:
估计面试官都被你的回答搞晕了。
抽象类和接口的理解 -
alvin198761:
需要了解多态和设计模式,了解一些框架的原理,你就知道这东东真正 ...
抽象类和接口的理解 -
sangei:
谢谢楼上提醒,希望慢慢能有所进步。
抽象类和接口的理解 -
jackra:
书背的不错可以看看设计模式如何使用抽象类
抽象类和接口的理解 -
ptsd:
lag(column_x,number1,XX)用来返回当前数 ...
【转】oracle的LAG和LEAD分析函数
1.OracleParameterpout1=OracleDbType.Varchar2,50);3.数组的参数类型为OracleCollectionType.PLSQLAssociativeArray,且必须明确指定数据元素的个数。如:OracleParameterv_OIDS=newOracleParameter("v_OIDS",OracleDbType.Int64);v_OIDS.Direction=ParameterDirection.Output;v_OIDS.Size=10;v_OIDS.CollectionType=OracleCollectionType.PLSQLAssociativeArray;4.当参数类型是ParameterDirection.Output,调用存储过程后,判定输出参数值是否为null以及转化成c#数据类型的注重事项:OracleParameterpout1=newOracleParameter("v_reason",OracleDbType.varchar2,50);pout1.Direction=ParameterDirection.Output;DataBaseHelper.RunProcedure("PRC_CON_sysuserlogin",newIDataParameter[]{pin1,pin2},pout1);直接用pout1.Value==null是无效的,必须先将其转化为Oracle.DataAccess.Types中的数据类型,然后用Oracle.DataAccess.Types中的数据类型的IsNull属性来判定。如:boolbIsnull=((Oracle.DataAccess.Types.OracleString)pout1.Value).IsNull;转化成c#的数据类型时不能直接用Convert方法和Parase方法,必须转化成Oracle.DataAccess.Types中的数据类型,然后调用向对应的房发.Toxxxx()或者先ToString(),然后在转化。如OracleParameterpout3=newOracleParameter("age",OracleDbType.Int32,ParameterDirection.Output);...intage=((Oracle.DataAccess.Types.OracleDecimal)pout3.Value).ToInt32();或者intage=int.Parase(pout3.Value.ToString());5.输出数组的遍历方法:假如输出参数类型是数组类型,遍历数组中各个元素的方法:OracleParameterv_OIDS=newOracleParameter("v_OIDS",OracleDbType.Int64);v_OIDS.Direction=ParameterDirection.Output;v_OIDS.Size=10;v_OIDS.CollectionType=OracleCollectionType.PLSQLAssociativeArray;for(inti=0;i<10;i ){longa=((Oracle.DataAccess.Types.OracleDecimal[])v_OIDS.Value)[i].ToInt64();}或者for(inti=0;i<10;i ){longa=((Oracle.DataAccess.Types.OracleDecimal)(v_OIDS.ValueasArray).GetValue(i)).ToInt64();}6.在调用存储过程时,假如输入参数为数组,则长度不能为0,数组也不能为null
这里主要想归纳一下通过OracleCommand调用存储过程的方法。
首先设置CommandText属性为存储过程的名称。注意带package名
其次将CommandType 属性设为System.Data.CommandType.StoredProcedure
然后填入相应的参数。参数可以为oracle的各种类型。
通过下面例子说明如何调用oracle的数组参数和cursor参数。
//PL/SQL
//--------------------------------------------------------
//Oracle服务器上 存储过程
//包含三个参数。
//I_ID 输入参数 VARCHAR2 类型
//I_TBL 输入参数 VARCHAR(10) 型的数组
//O_CUR 输出参数 cursor 类型
CREATE OR REPLACE PACKAGE JK_WAIN_0203.PKG_TEST IS
TYPE TYPE_TAB_111 IS TABLE OF VARCHAR(10) INDEX BY BINARY_INTEGER;
PROCEDURE PROC_GET_DATA(
I_ID IN VARCHAR2, //
I_TBL IN TYPE_TAB_111,
O_CUR OUT SYS_REFCURSOR);
END PKG_TEST;
/
CREATE OR REPLACE PACKAGE BODY JK_WAIN_0203.PKG_TEST IS
PROCEDURE PROC_GET_DATA(
I_ID IN VARCHAR2,
I_TBL IN TYPE_TAB_111,
O_CUR OUT SYS_REFCURSOR)
IS
V_INDEX NUMBER := 0;
V_INDEX_MAX NUMBER := 0;
V_DATA VARCHAR(10);
BEGIN
V_INDEX := I_TBL.FIRST;
V_INDEX_MAX := I_TBL.LAST;
WHILE V_INDEX <= V_INDEX_MAX LOOP
V_DATA := I_TBL(V_INDEX);
V_INDEX := V_INDEX + 1;
END LOOP;
OPEN O_CUR FOR SELECT * FROM TAB WHERE ROWNUM < 10;
END PROC_GET_DATA;
END PKG_TEST;
/
---------------------------------------------------------------------------
//C#例
public void Get_PrecedureData()
{
OracleConnection connection = null;//Connection
OracleCommand oraCommand = new OracleCommand();
OracleParameter paramId = null;
OracleParameter paramTbl = null;
OracleParameter paramCur = null;
OracleRefCursor pInfoCur = null;
DataSet dtRtn = new DataSet();
//数据库连接
connection = new OracleConnection("User Id=scott;Password=tiger;Data Source=oracle");
connection.Open();
oraCommand.Connection = connection;
oraCommand.Parameters.Clear();
// 存储过程 设定
oraCommand.CommandText = "PKG_TEST.PROC_GET_DATA";
oraCommand.CommandType = System.Data.CommandType.StoredProcedure;
// 输入输出参数设定
// Varchar2型
paramId = oraCommand.Parameters.Add( "I_ID", OracleDbType.Varchar2, ParameterDirection.Input );
// 数组类型参数设定
paramTbl = oraCommand.Parameters.Add( "I_TBL", OracleDbType.Varchar2, ParameterDirection.Input );
// 将CollectionType 设为 PLSQLAssociativeArray
paramTbl.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
//cursor 类型参数设定
paramCur = oraCommand.Parameters.Add("O_CUR", OracleDbType.RefCursor, ParameterDirection.Output );
//设置参数数组的大小
//注意:参数的Value 属性和ArrayBindSize 属性必须为元素个数相同的数组,且个数等于参数的Size 属性
int[] bindSize = new int[10];
string[] tblData = new string[10];
for(int ii = 0; ii < 10; ii++)
{
tblData[ii] = ii.ToString();//数值
bindSize[ii] = 10;//数值的大小
}
//数组参数设定
paramTbl.Value = tblData;
paramTbl.Size = 10;
paramTbl.ArrayBindSize = bindSize;
//存储过程执行
oraCommand.ExecuteNonQuery();
//out的cursor值的读取
using(OracleDataAdapter da = new OracleDataAdapter())
{
if(paramCur.Value != System.DBNull.Value)
{
pInfoCur = (OracleRefCursor)paramCur.Value;
da.Fill(dtRtn, pInfoCur);
}
//取得记录数
Console.WriteLine("the number of record count is {0}", dtRtn.Tables[0].Rows.Count);
}
oraCommand.Dispose();
connection.Close();
connection.Dispose();
}
发表评论
-
SQL中on条件与where条件的区别
2016-02-17 10:26 679/* 标题:SQL中 -
mysql update注意
2016-01-18 16:16 559drop table a; CREATE TABLE IF ... -
Oracle中JOB的创建方法以及一个细节的探究(转)
2012-10-15 16:35 1235在Oracle中可以使用JOB来实现一些任务的自动化执行,类似 ... -
oracle里的job和schedule有什么区别(转)
2012-10-15 16:31 1296510g 中新推出的SCHEDULER可能确实会让很多初接触的朋 ... -
procedure的加密
2012-08-06 14:34 744wrap iname=eptapi.pac oname=ept ... -
sql plus中执行pl/sql
2012-03-23 00:18 0declare v_string varc ... -
(转)oracle 带输出参数存储过程
2012-03-23 00:13 0执行带输出参数的存储过程 SQL> var c v ... -
(转)Oracle:Authid Current_User的使用
2012-03-22 23:53 0我们知道,用户拥有的role权限在存储过程是不可用的。遇 ... -
在pl/sql里select dba_jobs为什么不成功
2012-03-22 23:52 0PROCEDURE TEST1 ( PROCEDR ... -
(转)Oracle 中的exception——(Raise)
2012-03-22 23:30 15051.GOTO,主要用于跳转,但会打乱我们的程序逻辑,一般不使用 ... -
(转)批量绑定—BULK COLLECT
2012-03-22 23:26 2868在 PL/SQL 编码中,经常会从表中获取结果集,然后进行一些 ... -
(转)PL/SQL --> 动态SQL的常见错误
2012-03-22 18:31 1395--============================ ... -
Oracle SELECT with an array using an IN
2012-01-18 17:03 1282Oracle SELECT with an ... -
pl/sql 实现类似于split 的分割字符串的功能
2012-01-12 23:55 61031、先建立一个包,定义数组类型:CREATE OR REP ... -
execute immediate
2012-01-12 21:41 1203EXECUTE IMMEDIATE Statement ... -
【实验】【PROCEDURE】一个最简单的oracle存储过程"proc_helloworld"
2011-08-08 09:51 1219本文通过一个最简单的oracle存储过程"proc_ ... -
创建oracle job
2011-07-27 17:20 844oracle job简介 主要的使用情景 定时在后台执行 ...
相关推荐
向DLL传递数组参数的实现方法。@易语言代码编写例子。
C#将字符串数组传递给C++ DLL(MFC),VS2010
附件是一套C#调用C++dll时,传递数组参数的示例,亲测可用。。。。。。。。。。。。。。。。。。。。。。。
C# 数组与序列化C# 数组与序列化C# 数组与序列化C# 数组与序列化C# 数组与序列化C# 数组与序列化C# 数组与序列化
资源代码演示的是c#代码调用c++ DLL 的方式。该演示为原创,绝非搬砖。解决了c# 调用 C++ Dll获取相关信息之如何传递结构体数组引用以及如何处理获取到的结构体数组数据的问题。
主要介绍了C#调用C++DLL传递结构体数组的终极解决方案的相关资料,需要的朋友可以参考下
C#调用C++的dll实例,回调函数,string和int数组参数传递,在vs2010下调试通过,总结在这里,供大家参考。
C#向C++封送结构体数组[归类].pdf
c#调用c++DLL,DLL里是二维数组 ,c#里如何调用二维数组
C# 读取序列化后的数组C# 读取序列化后的数组C# 读取序列化后的数组C# 读取序列化后的数组C# 读取序列化后的数组
主要介绍了vue中get请求如何传递数组参数的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
c#字符数字转换为int数组
当C#调用C++dll时,需要传递自定义结构的数组,该怎么办? 示例给出了方案
MWNumericArray是MWArray和c#中数据的中间类,怎么用?怎样在C#与matlab间传递参数?
c#学习体会使用 ref 和 out 传递数组
C#可以通过P/Invoke调用C/C++写的DLL,一般在从DLL接收字符串时比较麻烦,本人在某个项目中遇到这个问题, 从DLL收读取字符串时遇到中文...C#需要使用byte[] 数组来表示字节缓冲, 注意C#中char 是占用两个字节的。
C# 将两个整型数组的元素相加。别忘给评分!
C#调Native CPP 类 的DLL文件 首先C++/CLI过度对Navive CPP类的调用 其次C#调用C++/CLI转化后的类 经测试效率还是很高的
C#数组集合C#数组集合C#数组集合C#数组集合C#数组集合C#数组集合