今天写了个存储过程,单步调试不报错,但是update始终不成功,后来上网看了下原来是
写道
今天一个同事写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);
code number(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_code number(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(code in 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_, 所以以前没遇到这个问题, 为了防止以后可能再次遇到这个问题和也遇到这个问题的朋友, 在此留下这篇博客作为备忘.
犯了第一个错误,所以存储过程始终update不成功,但是,同样的select into中出现重名则不会影响赋值,只用update时候发现了这个问题,
此外在使用pl sql时候,我构造了一个10W+的循环,但是每每700多次就挂掉了,后来发现是 DBMS_OUTPUT.PUT_LINE('XXXXXXXXX'||m);惹的祸,估计是缓存溢出了,我的plsql dbms输出缓冲区大小是10000,原因在这里。一旦超过了就报错。。
此外很多人肯定对plsql或者说DBMS_OUTPUT.PUT_LINE的怨念,因为他是最后输出,而很多时候我们是要求在中间观察进度的,这个是没招的,只能自行设计方案了,无非邮件通知,写表,写文件。
分享到:
相关推荐
学习SQL存储过程是提升数据库管理和应用开发效率的关键步骤,它可以帮助我们更好地组织和优化数据操作。 在SQL存储过程中,有以下几个重要的知识点: 1. **定义与创建**:存储过程可以通过`CREATE PROCEDURE`语句...
本文将基于“存储过程测试心得总结”这一主题,深入探讨存储过程的相关知识,以及在实际操作中进行测试的经验与技巧。 首先,我们来理解什么是存储过程。存储过程是预编译的SQL语句集合,存储在数据库服务器中,...
PowerBuilder 学习心得总结 本文总结了 PowerBuilder 学习过程中的重要知识点,涵盖了事件、配置文件、应用对象、编译发行、Idle 事件、函数与代码存储、连接数据库、ConnectionBegin 和 ConnectionEnd 事件、...
### JavaScript 学习基础心得 在深入探讨JavaScript的基础深度原理之前,我们首先了解JavaScript的一些基本概念,这将有助于我们更好地理解和应用这些高级知识点。 #### 浏览器组成 浏览器是JavaScript运行的重要...
### ARM嵌入式学习心得详解 #### 一、ARM与Linux的选择及原因 在选择学习方向时,ARM+Linux是一个非常明智的选择。ARM处理器作为市场上主流的嵌入式处理器之一,其广泛应用范围使得掌握ARM技术变得尤为重要。同时...
创建一个存储过程,接受页码和每页大小作为参数,然后在SQL语句中使用`TOP`关键字来选取特定数量的记录。例如: ```sql CREATE PROCEDURE GetProductsByPage @PageNumber int, @PageSize int AS BEGIN DECLARE @...
本文将围绕“Mysql学习心得之存储过程”展开,讨论在实际应用中的几个关键技术和注意事项。 首先,我们看一个简单的存储过程示例——`sp_select_reply_article`。这个存储过程用于查询文章的回复。在MySQL中,如果...
### C++ Primer 学习心得总结 通过学习《C++ Primer》这本书,对C++语言有了更深入的理解。下面将从几个方面分享学习心得与重要知识点。 #### 1. 编译器与编译指令 - **命令行编译**:在命令行环境下使用编译器...
最后,我们调用了远程服务器上名为“Calculator.add”的方法,并传递了两个整数作为参数,返回结果存储在变量`result`中。 如果需要使用HTTPClient包与服务器通信,则可以通过更改`TransportFactory`来实现: ```...
下面将详细介绍AVR单片机C语言学习的关键知识点,以及LCD显示程序的实例和常用库函数。 1. AVR单片机架构与C语言编程基础: - **AVR内核**:AVR单片机采用哈佛结构,拥有独立的数据和指令存储空间,支持并行处理,...
移动通信学习心得是指在学习过程中积累的经验和心得,特别是在移动通信领域的学习心得。本文档主要记录了学习移动通信过程中的经验和心得,涵盖了 Zigbee、adhoc 网络、AODVjr 协议、rf4ce、GTS 等领域。 1. 物理层...
### ArcGIS 学习心得:ArcGIS 10 插值方法详解 #### 一、引言 在地理信息系统(GIS)领域,ArcGIS 是一个非常重要的工具,它提供了广泛的功能来处理空间数据,其中插值是其核心功能之一。插值在GIS中的应用非常...
通过实际操作,学生将学习如何创建、查看、修改和删除存储过程,同时也会涉及自定义函数和游标的运用。这些技能对于数据库管理与开发至关重要,因为存储过程可以提高数据处理的效率,减少网络通信,并且提供了一种...
### CGridCtrl 学习心得知识点总结 #### 一、Grid 控件概述 **GridControl** 是一款在 VC 平台上极为强大且灵活的网格控件。它在 **CListCtrl** 的基础上进行了定制和扩展,能够实现丰富的功能,如单元格选择、...
### ORACLE数据库学习心得 #### 一、Oracle数据库的特点 Oracle数据库是一款由Oracle公司开发的关系型数据库管理系统。作为全球领先的企业级数据库之一,Oracle具备多种优势特性,使其成为众多企业和组织首选的...