社区
C#
帖子详情
oracle存储过程执行事物的问题 在线等
tksnow
2006-12-21 01:33:24
oracle9i中我建了两个存储过程,分别向主从表中insert数据,两个存储过程分别单独执行是成功的。但是建立在一个事物中,只有第一个执行成功,执行第二个的时候提示ORA-01036: 非法的变量名/编号.
请教各位怎么解决这个问题.谢谢!!!
...全文
480
24
打赏
收藏
oracle存储过程执行事物的问题 在线等
oracle9i中我建了两个存储过程,分别向主从表中insert数据,两个存储过程分别单独执行是成功的。但是建立在一个事物中,只有第一个执行成功,执行第二个的时候提示ORA-01036: 非法的变量名/编号. 请教各位怎么解决这个问题.谢谢!!!
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
24 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
tksnow
2006-12-21
打赏
举报
回复
感谢大家问题解决了。 comm.Parameters.Clear(); 清除了一下。
可是我一开始写的时候就没用一个command,报错提示我要有一个command事务。我有点记不清楚了。
liujia_0421
2006-12-21
打赏
举报
回复
这样试试:
oraComm.Parameters.Clear();
oraComm.Parameters.Add(new OracleParameter("byteZrzp", OracleType.LongRaw)).Value = m_byteZrzp;
yan63
2006-12-21
打赏
举报
回复
怎么清除command参数保留
----------------------------
comm.Parameters.Clear();
弱弱的啰嗦一下,真的没必要在一个command...
tksnow
2006-12-21
打赏
举报
回复
怎么清除command参数保留
yan63
2006-12-21
打赏
举报
回复
在同一个事物中要用同一个command
------------------------------------
没有必要,只要使用一个connnection就可以了,如果一定要同一个command,看一下第二条语句运行前是否把前面insert的参数清空
tksnow
2006-12-21
打赏
举报
回复
oraComm.Parameters.Add(new OracleParameter("byteZrzp", OracleType.LongRaw)).Value = m_byteZrzp;
改成这样也不行。
在同一个事物中要用同一个command.
yan63
2006-12-21
打赏
举报
回复
为什么所有的insert要在一个command里做呢?完全可以new一个新的command,可能是你上一个insert的command参数保留,下一个insert没有这个参数,就有这样的问题,
liujia_0421
2006-12-21
打赏
举报
回复
别弄错了,这里的不用改..
else
{
strSql += "',:byteZrzp)";
}
这个是要加上的...
liujia_0421
2006-12-21
打赏
举报
回复
TO:
oraComm.Parameters.Add(new OracleParameter(":byteZrzp", OracleType.LongRaw)).Value = m_byteZrzp;
改成这样试试:
oraComm.Parameters.Add(new OracleParameter("byteZrzp", OracleType.LongRaw)).Value = m_byteZrzp;
记得好像Oracle添加参数时,赋值是,参数前的":"要去掉...试试看..
tksnow
2006-12-21
打赏
举报
回复
使用的是一个connection,第一个注掉执行第二个是可以执行的。我跟踪了就是只要有照片信息,即执行if (m_byteZrzp != null)
{
oraComm.Parameters.Add(new OracleParameter(":byteZrzp", OracleType.LongRaw)).Value = m_byteZrzp;
}
时有这个LongRaw字段,我加的是二进制照片信息。第一个insert是可以执行成功的,
再执行第二个insert 就会报错了。ORA-01036: 非法的变量名/编号.
如果不照片为null则执行是没有问题的。
yan63
2006-12-21
打赏
举报
回复
oraComm.Connection = m_OracleConn;
oraComm.CommandText = strSql;
-----------------------------------
oraComm是你外部传入的,两个insert要使用事务的话,应该使用同一个oracle connection
m_QzrXx.Insert(oraComm)与m_QXx.Insert(oraComm);使用同一个connection吗
liujia_0421
2006-12-21
打赏
举报
回复
跟踪一下看具体执行到什么地方时抛出的异常...
liujia_0421
2006-12-21
打赏
举报
回复
你所谓的存储过程不是真正意义上的数据库存储过程吧...
只是把一个操作放在一个方法里写了..
liujia_0421
2006-12-21
打赏
举报
回复
那你试着把第一个存储过程注释掉,只调用第二个存储过程可以成功吗?
tksnow
2006-12-21
打赏
举报
回复
下面的代码是一个insert方法,也不是调用数据库的存储过程。请大家看一下。
所有的insert方法都类似。
public int Insert(OracleCommand oraComm)
{
string strSql = "Insert into T_QZRXX(QZRBH,XBDM,GJDM,PCSDM,ZJLXDM,ZRXM,ZRZJH,ZRNL," +
"JTZJ,GZDW,DWDH,GDDH,YDDH,YJDZ,DJSJ,BZ,ZP)" +
"values" +
"(" +
"S_T_QZRXX_QZRBH.NEXTVAL"
+ ",'" + m_strXbID
+ "','" + m_strGjdm
+ "','" + m_strPcsId
+ "','" + m_strZjlxId
+ "','" + m_strZrxm
+ "','" + m_strZrzjh
+ "','" + m_strZrnl
+ "','" + m_strJtzz
+ "','" + m_strZrgzdw
+ "','" + m_strZrdwdh
+ "','" + m_strZrgddh
+ "','" + m_strZryddh
+ "','" + m_strZryjd
+ "',sysdate"
+ ",'" + m_strZrbz;
if (m_byteZrzp == null) //照片为空值
{
strSql += "',null)";
}
else
{
strSql += "',:byteZrzp)";
}
oraComm.Connection = m_OracleConn;
oraComm.CommandText = strSql;
if (m_byteZrzp != null)
{
oraComm.Parameters.Add(new OracleParameter(":byteZrzp", OracleType.LongRaw)).Value = m_byteZrzp;
}
return oraComm.ExecuteNonQuery();
}
tksnow
2006-12-21
打赏
举报
回复
没有联系。
tksnow
2006-12-21
打赏
举报
回复
没有任务联系。
liujia_0421
2006-12-21
打赏
举报
回复
两个存储过程间有什么联系吗?
tksnow
2006-12-21
打赏
举报
回复
是同一个数据库连接。
代码如下
Insert方法为调用存储过程插入数据
public bool Save()
{
OracleCommand oraComm = new OracleCommand();
OracleTransaction oracleTran = m_OracleConn.BeginTransaction();
oraComm.Transaction = oracleTran;
try
{
m_QzrXx.Insert(oraComm);
m_QXx.Insert(oraComm);
m_GrYqJl.Qbh = m_QXx.Qbh;
m_GrYqJl.QZrBh = m_QzrXx.Qzrbh;
m_NfJnJl.Qbh = m_QXx.Qbh;
m_GrYqJl.Insert(oraComm);
m_NfJnJl.Insert(oraComm);
oracleTran.Commit(); }
catch (Exception exp)
{
m_DataException = new DataException(exp.Message);
oracleTran.Rollback(); //回滚事务
return false;
}
return true;
}
tksnow
2006-12-21
打赏
举报
回复
用的是OracleTransaction事务
加载更多回复(4)
oracle
存储过程
,函数,自主事务处理
文章目录一.1.1 子程序1.2 过程1.2.1 过程参数的三种模式 一. 1.1 子程序 命名的pl/sql块,编译并存储在数据库中 子程序的各个部分:声明部分、可
执行
部分、异常处理部分(可选) 子程序的分类:
存储过程
(
执行
某些操作),函数(
执行
操作并返回结果) 1.2 过程 create [or replace] procedure 过程名 [(参数列表)] is|as 声明变量 begin
执行
语句 [exception 异常处理] end; 1.2.1 过程参数的三种模式 in 用于接收调用
Oracle
存储过程
事务控制语句
Oracle
存储过程
事务控制语句
oracle
具备
存储过程
么,什么是
oracle
存储过程
?新手一定要掌握了
对于很多的IT行业人士来说,事实上,
oracle
存储过程
就是计算机保存文件当中一种比较常用的方式了。事实上,经常使用电脑的人都知道,电脑保存文件的方法是有很多的,其中就有一种叫做
oracle
存储,不过,在说到
oracle
存储的同时,有一个绕不开的话题,那就是
oracle
存储过程
。那么,究竟什么是
oracle
存储过程
呢?它到底有多么的重要呢?一起接着往下看。需要用户知道的是
oracle
存储过程
又有系...
Oracle
存储过程
和事务
存储过程
和事务 一、
存储过程
1、什么是
存储过程
?
存储过程
(Stored Procedure )是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中。用户通过指定
存储过程
的名字并给出参数(如果该
存储过程
带有参数)来
执行
它。
存储过程
是一种命名的pl/sql程序块。 有没有参数都可以,但是没有返回值(return)
存储过程
保存在数据库中,不可以被sql语句直接
执行
或调用,只能通过excute命令
执行
或PL/SQL程序块内部调用。 优点: 1.
存储过程
只在创造时进行编译,以后每次
执行
存储过程
都不需再
Oracle
存储过程
,触发器,事务,锁
博客园 首页 新随笔 联系 管理 订阅 随笔- 75 文章- 0 评论- 0
Oracle
存储过程
,触发器,事务,锁 1.1
存储过程
存储过程
是一种命名的PL/SQL程序块,他可以有参数,也可以有若干个输入、输出参数。甚至可以有多个即做输入又做输出的参数,但他都没有返回值。
存储过程
被保存在数据库中,他不可以被SQL语句直接
执行
调用。通过EXECUTE命令或在PL/SQL...
C#
111,097
社区成员
642,554
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章