转载链接: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语句”指的是在数据库管理中用于修改现有数据的SQL命令。在数据库操作中,`UPDATE`语句是不可或缺的一部分,它允许我们更改表中的特定行或所有行的数据。下面将详细介绍`UPDATE`语句的工作原理、...
GRANT用于赋予用户或角色执行特定操作(如SELECT, INSERT, UPDATE, DELETE等)或访问特定对象(如表、视图、存储过程等)的权限。例如,`GRANT EXECUTE ON my_proc TO user1;`将允许'user1'执行名为'my_proc'的存储...
- **创建存储过程(Create Procedure)**: `CREATE PROCEDURE`语句用于创建存储过程,封装一系列SQL语句。例如:`CREATE OR REPLACE PROCEDURE sp_greet(name IN VARCHAR2) AS BEGIN DBMS_OUTPUT.PUT_LINE('Hello, '...
在进行这些操作时,可能会遇到一些问题,如DOS窗口下执行存储过程不显示数据,这是因为DBMS_OUTPUT未开启,需要设置`set serveroutput on`。另外,由于安全原因,不能对sys用户的表创建触发器。解决办法是使用其他...
Oracle数据库中,系统表存储了数据库对象的元数据,例如表、视图、索引等,以及用户权限、统计信息等关键信息。掌握常用系统表语句对于数据库的管理和日常维护至关重要。接下来将详细介绍一些常用的Oracle系统表语句...
在使用UPDATE语句时,如果某字段值未赋值,则该字段将被清空为NULL。因此,在执行UPDATE操作前应先进行非空校验。同样地,如果字段值长度超过定义的长度,也会出错,需要在操作前进行校验。 在执行INSERT、DELETE和...
预编译器会将这些嵌入式的SQL语句转换成可以直接由Oracle数据库服务器解释的格式,这样就可以直接执行而无需再通过字符串处理等方式。 ##### 3.2 为什么使用ORACLE预编译程序? - **性能提升**:直接使用预编译器...
创建存储过程需要使用`CREATE OR REPLACE PROCEDURE`语句,如上所示,其中`PROC_INSERT`是存储过程的名称,`IS`关键字后跟过程体,包括变量声明和执行语句。 #### 结论 通过上述对Oracle 9i PL/SQL程序设计笔记的...
在设计和维护Oracle数据库时,数据库管理员(DBA)通常需要建立或维护一个数据字典,它是关于数据库表、视图、存储过程等数据库对象的详细描述的集合。数据字典包含数据库对象的元数据,是数据库管理不可或缺的部分...
3. **执行SQL**:在SQL*Plus中,可以执行DML(数据操纵语言)和DDL(数据定义语言)语句,如SELECT、INSERT、UPDATE、DELETE以及CREATE TABLE等。 4. **管理数据库**:除了基本的查询外,还可以进行用户管理、权限...
避免这种死锁的一种方法是在设计事务时遵循一定的顺序规则,例如,确保所有事务按照相同的顺序访问和修改数据,或者使用`FOR UPDATE SKIP LOCKED`(Oracle支持,但MySQL不直接支持)来跳过已锁定的行。另外,可以...
### Oracle常用SQL语句知识点详解 #### 一、基本操作 **1. 连接SQL*Plus** - 使用命令 `SQL*Plus system/manager` 可以连接到Oracle数据库,默认情况下,`system` 用户拥有管理员权限。 - **命令**: `SQL*Plus ...
20. **占用存储空间**:索引会占用实际的存储空间,而视图、序列和存储过程不直接占用,它们是逻辑对象,只有在使用时才会占用空间。 **判断题解析**: 1. 视图可以进行查询、更新、插入和删除操作,但受限于视图的...
在执行这些操作时,需谨慎处理,因为它们都是立即生效且不可逆的。 Oracle SQL还提供了丰富的数据类型,如NUMBER、VARCHAR2、DATE、TIMESTAMP等,用于存储各种类型的数据。理解这些数据类型及其用法,对于设计高效...
如果需要永久生效,可以将上述语句添加到`~/.bashrc`或`/etc/profile`中。 2. 编译和安装cx_Oracle模块: 进入cx_Oracle的源代码目录,执行以下命令: ```bash cd /tmp/cx_oracle_offline/cx_Oracle python3 ...
- 索引、视图、存储过程等对象的管理命令 4. **数据操纵语言**: - 插入(INSERT)、更新(UPDATE)、删除(DELETE)操作 - 数据完整性约束(如主键、外键) 5. **事务控制**: - COMMIT、ROLLBACK、SAVEPOINT...
1. 存储过程:存储过程是一组预先编译好的SQL和PL/SQL语句,可以在需要时通过调用执行。在实验8.1中,我们学习了如何编写和调用存储过程。例如,创建了一个名为`pro_emp`的存储过程,它接受员工ID作为输入参数,查询...
当执行DDL语句时,Oracle会自动提交当前事务,这意味着任何未提交的数据变化都会立即生效。 - **DDL命令举例**: - `CREATE TABLE`:创建新表。 ```sql CREATE TABLE employee ( EMP_ID INTEGER, NAME ...
初学mysql时,可能不太明白delimiter的真正用途,delimiter在mysql很多地方出现,比如存储过程、触发器、函数等。 学过oracle的人,再来学mysql就会感到很奇怪,百思不得其解。 其实就是告诉mysql解释器,该段命令...
4. **刷新配置**:完成上述步骤后,需要执行`DBMS_XDB.CFG_REFRESH`过程来刷新XDB的配置,使修改生效。 #### 方法二:通过Oracle Enterprise Manager Console进行配置修改 第二种方法是通过Oracle Enterprise ...