200分求助!!occi动态调用oracle存储过程问题

livpu 2009-01-19 04:10:43
假设存储过程如下:
string sqlProc = "begin TEST_QUERY_USERS(:1,:2,:3);end;";
这个存储过程实现查询的功能,其中4个参数的类型分别为:
参数1:OUT,游标类型,作为返回值
参数2:IN,string类型
参数3:IN,int类型

我自定义了一个接口函数:ResultSet* ExecuteSQL(string strProc)
这个函数的功能就是执行存储过程,返回ResultSet

我现在只知道在执行sql语句之前,需要给Statement邦定存储过程的参数
代码如下:
ResultSet* ExecuteSQL(string strProc)
{
Statement *stmt = con->createStatement();
try
{
stmt->setSQL(strProc);
stmt->registerOutParam(1,OCCICURSOR);
stmt->setString(2,"");//------------------------------1
stmt->setInt(3,""); //------------------------------2
stmt->execute();
....//省略
}
....//省略
}


很明显,这个函数完全依赖于我的存储过程。
如果存储过程中的参数个数和类型发生变化,那这个函数的1、2句将发生错误。

那么,我该怎么写,让这个函数能适应于所有的存储过程?
不胜感激!!!
暂时不能发200分,之后会另加
...全文
325 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
livpu 2009-01-22
  • 打赏
  • 举报
回复
多谢各位的热情帮助
现在采用了一种比较恶心的解决方法,程序跟数据库的耦合性很高。
yang79tao的说法给了我一种新思路,考虑尝试下。
结贴,顺预祝各位新年快乐!
youngwolf 2009-01-21
  • 打赏
  • 举报
回复
方法一:
对于你的这个接口,要求调用者除了传入一个SQL语句之外,再传入一个数组,这个数组里面是一些枚举值,代表参数化查询语句里面的参数的类型;
方法二:
存储过程也是一个对象,不管什么数据库,应该都会有一张预先生成好了的表(比如叫SysInfo),用来保存后来用户创建的对象(比如自定义函数,存储过程等)的属性,你查询这张表,就可以知道存储过程(存储过程名字从SQL语句里面动态获取)的参数类型了。
ltc_mouse 2009-01-20
  • 打赏
  • 举报
回复
函数ExecuteSQL(string strProc)中的参数是存储过程字符串,例如有一个存储过程表示为:
string sqlProc = "begin TEST_QUERY_USERS(:1,:2,:3);end;";
TEST_QUERY_USERS(:1,:2,:3)中的1、2、3表示的就是参数,具体类型是在存储过程中指定的
=================================
假如有另一个存储过程,表示为 string sqlProc2 = "begin TEST_QUERY_USERS2(:1,:2,:3);end;";
即,也是3个参数,那是否能保证里面的3个参数与sqlProc一样呢?
函数ExecuteSQL(string strProc)的设计最大的弊端应该就在于此,它只能做到很有限的扩展~
我上面提到的参数个数就是这个意思,假如调用者保证了:只要参数个数一样,参数类型就一样,那还能勉强着用,呵呵
我没用过数据库,有理解错的地方,还请lz见谅,^_^
mabo321 2009-01-20
  • 打赏
  • 举报
回复
友情帮顶……
xuruichen 2009-01-20
  • 打赏
  • 举报
回复
没接触过数据库,
帮楼主顶一下
livpu 2009-01-20
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 ltc_mouse 的回复:]
很明显,这个函数完全依赖于我的存储过程。
如果存储过程中的参数个数和类型发生变化,那这个函数的1、2句将发生错误。

----------------------
用字符串查找等,应该容易知道SQL语句strProc中含有几个参数,如果参数个数确定的时候,对应的每个参数类型也是固定的,那分支判断就可以了;否则,还是考虑参数数组比较好吧
有点疑惑,函数ExecuteSQL(string strProc),并没有指定具体参数,即这个函数中的setString,setInt等,设置的参…
[/Quote]
多谢关注
函数ExecuteSQL(string strProc)中的参数是存储过程字符串,例如有一个存储过程表示为:
string sqlProc = "begin TEST_QUERY_USERS(:1,:2,:3);end;";
TEST_QUERY_USERS(:1,:2,:3)中的1、2、3表示的就是参数,具体类型是在存储过程中指定的
ltc_mouse 2009-01-19
  • 打赏
  • 举报
回复
很明显,这个函数完全依赖于我的存储过程。
如果存储过程中的参数个数和类型发生变化,那这个函数的1、2句将发生错误。

----------------------
用字符串查找等,应该容易知道SQL语句strProc中含有几个参数,如果参数个数确定的时候,对应的每个参数类型也是固定的,那分支判断就可以了;否则,还是考虑参数数组比较好吧
有点疑惑,函数ExecuteSQL(string strProc),并没有指定具体参数,即这个函数中的setString,setInt等,设置的参数是固定的?
ltc_mouse 2009-01-19
  • 打赏
  • 举报
回复
很明显,这个函数完全依赖于我的存储过程。
如果存储过程中的参数个数和类型发生变化,那这个函数的1、2句将发生错误。

----------------------
用字符串查找等,应该容易知道SQL语句strProc中含有几个参数,如果参数个数确定的时候,对应的每个参数类型也是固定的,那分支判断就可以了;否则,还是考虑参数数组比较好吧
有点疑惑,函数ExecuteSQL(string strProc),并没有指定具体参数,即这个函数中的setString,setInt等,设置的参数是固定的?
waizqfor 2009-01-19
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 livpu 的回复:]
5楼:这段代码跟occi的不同
你这儿只用一句:m_cmd.Parameters.Add(coll[i]);
就可以把所有的参数绑定
但是,我的是根据参数类型去绑定,比如string类型,调用stmt->setString();int类型,调用stmt->setInt()

另外,原文没有说清楚,因为遗留代码的缘故,我的那个ExecuteSQL()函数的参数已经不能改变
再给他加个数组参数,或者加个结构体,在函数中判断参数的类型,都不能解决我现在的问题。

anyway,还是要感谢你
[/Quote]
http://www.itpub.net/thread-1057913-1-1.htmlLZ看看这例子
没接触过oracle 无奈了 呵呵
  • 打赏
  • 举报
回复
帮up先,去sql区发啊
livpu 2009-01-19
  • 打赏
  • 举报
回复
5楼:这段代码跟occi的不同
你这儿只用一句:m_cmd.Parameters.Add(coll[i]);
就可以把所有的参数绑定
但是,我的是根据参数类型去绑定,比如string类型,调用stmt->setString();int类型,调用stmt->setInt()

另外,原文没有说清楚,因为遗留代码的缘故,我的那个ExecuteSQL()函数的参数已经不能改变
再给他加个数组参数,或者加个结构体,在函数中判断参数的类型,都不能解决我现在的问题。

anyway,还是要感谢你
OenAuth.Core 2009-01-19
  • 打赏
  • 举报
回复

/// <summary>
/// 返回SqlDataReader的存储过程,一定不要忘记关闭DataReader对象
/// </summary>
/// <param name="procName">存储过程名</param>
/// <param name="coll">存储过程参数</param>
/// <returns>SqlDataReader</returns>
public static DataTable ExecProcDataTable(string procName, SqlParameter[] coll)
{
DataTable dt = new DataTable();
SqlDataAdapter sda = new SqlDataAdapter();
try
{
OpenConnection();
m_cmd.CommandType = CommandType.StoredProcedure;
m_cmd.CommandText = procName;
for (int i = 0; i < coll.Length; i++)
m_cmd.Parameters.Add(coll[i]);
sda.SelectCommand = m_cmd;
sda.Fill(dt);

}
catch (Exception e)
{
throw new Exception(e.Message);
}
finally
{
CloseConnection();
m_cmd.Parameters.Clear();
}
return dt;
}


OenAuth.Core 2009-01-19
  • 打赏
  • 举报
回复
参数用数组
xiaoyisnail 2009-01-19
  • 打赏
  • 举报
回复
帮顶~
那看着怎么像C#写的
nullah 2009-01-19
  • 打赏
  • 举报
回复
帮顶~~
tanmeining 2009-01-19
  • 打赏
  • 举报
回复
不懂数据库,帮顶

64,266

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧