`
wenlongsust
  • 浏览: 66719 次
  • 性别: Icon_minigender_1
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论

Oracle存储过程执行update语句不报错不生效问题

 
阅读更多

转载链接:http://lin49940.iteye.com/blog/466626


今天一个同事写oracle 的存储过程遇到了一个问题, 他在里面update 操作不能完成更新的操作, 但是又不会报错.

如一个表 A(id,code, name, type)

在存储过程中的更新操作的语句: update A x set x.type = 变量A where x.code = 变量B;

变量A 和 变量B 都定义好了, 并且都成功赋值了.

这是一个很简单的更新语句, 简单到一开始对为什么发生这样的错误不知所措. 其实出错的原因是在于 变量A 或 变量B 的定义上, 如:

creat or replace procedure p_AA

is

t_type varchar2(20);

codenumber(10);

begin

t_type := 'AA';

code := 100

update A x set x.type = t_type where x.code =code;

commit;

end;

执行成功, 但是update 操作没有成功, 没有报什么错误. 其实原因在于变量code跟 表A 中的字段code 的名字相同造成的. 看下面的:

creat or replace procedure p_AA

is

t_type varchar2(20);

t_codenumber(10);

begin

t_type := 'AA';

t_code:= 100

update A x set x.type = t_type where x.code =t_code;

commit;

end;

执行成功, update操作也成功. 所以原因在与变量的名称上面(还有一个值得注意的地方, 如果code字段是char型的, 变量的长度跟字段code的长度如果不一致, 比较会不成功,' 100' 和 '100' 是不对等的, 这也是容易犯的一个错误, 在此记录下)

还有一个地方要注意:

creat or replace procedure p_AA(codein number)--code作为参数, 就算跟表A 的字段名称一样, 也不会有影响

is

t_type varchar2(20);

begin

t_type := 'AA';

update A x set x.type = t_type where x.code =code;

commit;

end;

执行 execute p_AA(100) 成功, 更新操作也成功. code如果是参数, 跟表A 的字段名称一样, 也不会有影响.

我一般变量都会加t_ 或 p_, 所以以前没遇到这个问题, 为了防止以后可能再次遇到这个问题和也遇到这个问题的朋友, 在此留下这篇博客作为备忘.




小龙评论


平时很少写Oracle的存储过程,最近为了处理一批异常的数据,嫌写程序调试麻烦,就使用存储过程,遇到了相同问题,是变量名和要更新的表字段名相同了。

不报错,的确不方便找原因,转载备忘。

分享到:
评论

相关推荐

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    说明:Oracle中需要创建用户一定是要具有dba(数据库管理员)权限的用户才能创建,而且创建的新用户不具备任何权限,连登录都不可以。 用法:create user 新用户名 identified by 密码 例子: 2. 修改密码 说明:...

    最全的oracle常用命令大全.txt

    8、存储函数和过程 查看函数和过程的状态 SQL>select object_name,status from user_objects where object_type='FUNCTION'; SQL>select object_name,status from user_objects where object_type='PROCEDURE';...

    mySQL事务处理

    或者 只可以通过存储过程来实现, 单行的锁定 BEGIN; SELECT book_number FROM book WHERE book_id = 123 FOR UPDATE; --这里for update , 以前用Oracle的时候也是有这个行锁 // ... UPDATE book SET book_number ...

    经典全面的SQL语句大全

    下列语句部分是Mssql语句,不可以在access中使用。  SQL分类:  DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE)  DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT)  DCL—数据控制语言(GRANT,REVOKE,...

    Oracle事例

    字符串字段中含有\"\'\",如果用来组合sql语句,会造成语句不准确。 比如:replace(f1,\'\'\'\',\'\') <2>.字符串字段中含有\"\\t \\n\",如果用来在c或者c++程序中输出到文件,格式无法保证。 比如:replace(f2,...

    神通数据库-数据库快速入门.pdf

    在神通数据库系统中,触发器是一种特殊类型的存储过程,它在指定的表中的数据发生变化时自动生效 被触发执行。唤醒调用触发器以响应 INSERT、UPDATE 或 DELETE 语句。触发器可以查询其它表,并 9 可以包含复杂的 ...

    orcale常用命令

    8、存储函数和过程 查看函数和过程的状态 SQL>select object_name,status from user_objects where object_type='FUNCTION'; SQL>select object_name,status from user_objects where object_type='PROCEDURE';...

    asp.net知识库

    直接从SQL语句问题贴子数据建表并生成建表语句的存储过程 从SQL中的一个表中导出HTML文件表格 获取數据库表的前N条记录 几段SQL Server语句和存储过程 生成表中的数据的脚本 最详细的SQL注入相关的命令整理 Oracle ...

    企业后台管理基础框架 hsweb.zip

    通用mybatis配置文件,支持多种条件查询自动生成,支持自动生成insert,update,delete语句,支持和查询相同的各种条件.实现用户,权限管理;基于aop,注解,精确到按钮的权限控制.动态表单功能,可在前端设计表单,动态生成...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例005 下载并安装JRE执行环境 8 实例006 编程输出星号组成的等腰三角形 9 1.2 开发工具 11 实例007 下载最新的Eclipse 11 实例008 为最新的Eclipse安装中文语言包 12 实例009 活用Eclipse的工作空间 14 实例010 在...

Global site tag (gtag.js) - Google Analytics