`
wenlongsust
  • 浏览: 72395 次
  • 性别: 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的存储过程,最近为了处理一批异常的数据,嫌写程序调试麻烦,就使用存储过程,遇到了相同问题,是变量名和要更新的表字段名相同了。

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

分享到:
评论

相关推荐

    update语句

    标题中的“update语句”指的是在数据库管理中用于修改现有数据的SQL命令。在数据库操作中,`UPDATE`语句是不可或缺的一部分,它允许我们更改表中的特定行或所有行的数据。下面将详细介绍`UPDATE`语句的工作原理、...

    oracle 编译存储过程 赋权 查询用户占用空间

    GRANT用于赋予用户或角色执行特定操作(如SELECT, INSERT, UPDATE, DELETE等)或访问特定对象(如表、视图、存储过程等)的权限。例如,`GRANT EXECUTE ON my_proc TO user1;`将允许'user1'执行名为'my_proc'的存储...

    Oracle sql 语句集锦

    - **创建存储过程(Create Procedure)**: `CREATE PROCEDURE`语句用于创建存储过程,封装一系列SQL语句。例如:`CREATE OR REPLACE PROCEDURE sp_greet(name IN VARCHAR2) AS BEGIN DBMS_OUTPUT.PUT_LINE('Hello, '...

    Oracle--存储过程与触发器基本操作.docx

    在进行这些操作时,可能会遇到一些问题,如DOS窗口下执行存储过程不显示数据,这是因为DBMS_OUTPUT未开启,需要设置`set serveroutput on`。另外,由于安全原因,不能对sys用户的表创建触发器。解决办法是使用其他...

    ORACLE学习之常用数据库系统表语句

    Oracle数据库中,系统表存储了数据库对象的元数据,例如表、视图、索引等,以及用户权限、统计信息等关键信息。掌握常用系统表语句对于数据库的管理和日常维护至关重要。接下来将详细介绍一些常用的Oracle系统表语句...

    Oracle SQL

    在使用UPDATE语句时,如果某字段值未赋值,则该字段将被清空为NULL。因此,在执行UPDATE操作前应先进行非空校验。同样地,如果字段值长度超过定义的长度,也会出错,需要在操作前进行校验。 在执行INSERT、DELETE和...

    Oracle proc

    预编译器会将这些嵌入式的SQL语句转换成可以直接由Oracle数据库服务器解释的格式,这样就可以直接执行而无需再通过字符串处理等方式。 ##### 3.2 为什么使用ORACLE预编译程序? - **性能提升**:直接使用预编译器...

    oracle 9i pl/sql程序设计笔记

    创建存储过程需要使用`CREATE OR REPLACE PROCEDURE`语句,如上所示,其中`PROC_INSERT`是存储过程的名称,`IS`关键字后跟过程体,包括变量声明和执行语句。 #### 结论 通过上述对Oracle 9i PL/SQL程序设计笔记的...

    Oracle SQL Table name

    在设计和维护Oracle数据库时,数据库管理员(DBA)通常需要建立或维护一个数据字典,它是关于数据库表、视图、存储过程等数据库对象的详细描述的集合。数据字典包含数据库对象的元数据,是数据库管理不可或缺的部分...

    Oracle(最小)客户端

    3. **执行SQL**:在SQL*Plus中,可以执行DML(数据操纵语言)和DDL(数据定义语言)语句,如SELECT、INSERT、UPDATE、DELETE以及CREATE TABLE等。 4. **管理数据库**:除了基本的查询外,还可以进行用户管理、权限...

    Mysql 数据库死锁过程分析(select for update)

    避免这种死锁的一种方法是在设计事务时遵循一定的顺序规则,例如,确保所有事务按照相同的顺序访问和修改数据,或者使用`FOR UPDATE SKIP LOCKED`(Oracle支持,但MySQL不直接支持)来跳过已锁定的行。另外,可以...

    oracle常用SQL语句

    ### Oracle常用SQL语句知识点详解 #### 一、基本操作 **1. 连接SQL*Plus** - 使用命令 `SQL*Plus system/manager` 可以连接到Oracle数据库,默认情况下,`system` 用户拥有管理员权限。 - **命令**: `SQL*Plus ...

    oracle数据库练习A

    20. **占用存储空间**:索引会占用实际的存储空间,而视图、序列和存储过程不直接占用,它们是逻辑对象,只有在使用时才会占用空间。 **判断题解析**: 1. 视图可以进行查询、更新、插入和删除操作,但受限于视图的...

    Oracle.SQL必备参考

    在执行这些操作时,需谨慎处理,因为它们都是立即生效且不可逆的。 Oracle SQL还提供了丰富的数据类型,如NUMBER、VARCHAR2、DATE、TIMESTAMP等,用于存储各种类型的数据。理解这些数据类型及其用法,对于设计高效...

    cx_oracle离线安装.rar

    如果需要永久生效,可以将上述语句添加到`~/.bashrc`或`/etc/profile`中。 2. 编译和安装cx_Oracle模块: 进入cx_Oracle的源代码目录,执行以下命令: ```bash cd /tmp/cx_oracle_offline/cx_Oracle python3 ...

    Oracle SQL Reference

    - 索引、视图、存储过程等对象的管理命令 4. **数据操纵语言**: - 插入(INSERT)、更新(UPDATE)、删除(DELETE)操作 - 数据完整性约束(如主键、外键) 5. **事务控制**: - COMMIT、ROLLBACK、SAVEPOINT...

    Oracle数据库系统应用开发实用教程文本 ch8实验报告.doc

    1. 存储过程:存储过程是一组预先编译好的SQL和PL/SQL语句,可以在需要时通过调用执行。在实验8.1中,我们学习了如何编写和调用存储过程。例如,创建了一个名为`pro_emp`的存储过程,它接受员工ID作为输入参数,查询...

    oracle pl/sql编程

    当执行DDL语句时,Oracle会自动提交当前事务,这意味着任何未提交的数据变化都会立即生效。 - **DDL命令举例**: - `CREATE TABLE`:创建新表。 ```sql CREATE TABLE employee ( EMP_ID INTEGER, NAME ...

    详解 Mysql中的delimiter定义及作用

    初学mysql时,可能不太明白delimiter的真正用途,delimiter在mysql很多地方出现,比如存储过程、触发器、函数等。 学过oracle的人,再来学mysql就会感到很奇怪,百思不得其解。 其实就是告诉mysql解释器,该段命令...

    改Oracle8080端口

    4. **刷新配置**:完成上述步骤后,需要执行`DBMS_XDB.CFG_REFRESH`过程来刷新XDB的配置,使修改生效。 #### 方法二:通过Oracle Enterprise Manager Console进行配置修改 第二种方法是通过Oracle Enterprise ...

Global site tag (gtag.js) - Google Analytics