转:http://blog.csdn.net/m_changgong/article/details/4540632
错误发生的原因是在执行存储过程操作中,读取游标少读取了某个或者某些列。
不过,这似乎是不可能发生的,因为编译阶段都会报错。
下面演示错误的发生以及解决方法。
1.创建测试表USERS。
CREATE TABLE "USERS2" (
"USERNAME" VARCHAR2(20 BYTE),
"USERPASS" VARCHAR2(20 BYTE),
"COUNTER" NUMBER(11,0)
) ;
2.创建测试过程PROC_DEMO,故意少读取一列。
create or replace
PROCEDURE PROC_DEMO AS
uname varchar2(20);
upass varchar2(20);
counter number;
BEGIN
DECLARE CURSOR CUR_USERS is
select * from USERS;
BEGIN
OPEN CUR_USERS;
LOOP
FETCH CUR_USERS INTO uname,upass;
EXIT when CUR_USERS%NOTFOUND;
dbms_output.put_line('uname:'||uname);
dbms_output.put_line('upass:'||upass);
dbms_output.put_line('counter:'||counter);
END LOOP;
CLOSE CUR_USERS;
END;
END PROC_DEMO;
编译以上过程,发生错误:
Error(12,5): PL/SQL: SQL Statement ignored
Error(12,5): PLS-00394: 在 FETCH 语句的 INTO 列表中值数量出现错误
连编译都通不过,更不要说在执行时出现如下错误:ORA-00932: 数据类型不一致: 应为 -, 但却获得 –。
以上是在SQL Developer进行的测试。在PROC_DEMO声明游标CUR_USERS并读取,如果少读取了某个或者某些列编译通不过。如果游标CUR_USERS不是在过程中显示声明的而是通过调用返回游标类型数据的过程中获取的,那么少读取了某个或者某些列编译可能能够通过。
3.创建返回游标和基本类型数据的过程。
该过程封装在包中,包声明如下:
create or replace PACKAGE PACKAGE_TEST AS
TYPE CURSOR_TYPE IS REF CURSOR;
PROCEDURE PROC_TEST(
COUNTER OUT NUMBER,
CUR_USERS OUT CURSOR_TYPE
);
END PACKAGE_TEST;
创建包体如下:
create or replace PACKAGE BODY PACKAGE_TEST
IS
PROCEDURE PROC_TEST(
COUNTER OUT NUMBER,
CUR_USERS OUT CURSOR_TYPE
)
IS
SELECT_SQL VARCHAR2(200);
BEGIN
SELECT_SQL := 'SELECT COUNT(*) FROM USERS';
EXECUTE IMMEDIATE SELECT_SQL INTO COUNTER;
SELECT_SQL := 'SELECT USERNAME,USERPASS FROM USERS';
OPEN CUR_USERS FOR SELECT_SQL;
END PROC_TEST;
END PACKAGE_TEST;
4.创建测试过程PROC_CLIENT。
create or replace
PROCEDURE PROC_CLIENT AS
TYPE CURSOR_TYPE IS REF CURSOR;
CUR_USERS CURSOR_TYPE;
COUNTER number;
uname varchar2(20);
upass varchar2(20);
BEGIN
--调用PACKAGE_TEST中的过程PROC_TEST
PACKAGE_TEST.PROC_TEST(COUNTER,CUR_USERS);
--打印结果信息
DBMS_OUTPUT.PUT_LINE('COUNTER:'||COUNTER);
DBMS_OUTPUT.PUT_LINE('返回的游标中的数据:');
LOOP
FETCH CUR_USERS INTO uname;
EXIT when CUR_USERS%NOTFOUND;
dbms_output.put_line('uname:'||uname);
--dbms_output.put_line('upass:'||upass);
END LOOP;
CLOSE CUR_USERS;
END PROC_CLIENT;
运行PROC_CLIENT,发生如下错误:
ORA-00932: 数据类型不一致: 应为 -, 但却获得 -
ORA-06512: 在 "DEMO.PROC_CLIENT", line 14
ORA-06512: 在 line 2
原因是PACKAGE_TEST.PROC_TEST返回的游标CUR_USERS是表USERS两个列
USERNAME和USERPASS的结果集,但是在PROC_CLIENT中读取该游标时只读取了USERNAME。
解决方法:
将读取游标的语句修改为如下所示:
FETCH CUR_USERS INTO uname,userpass;
EXIT when CUR_USERS%NOTFOUND;
dbms_output.put_line('uname:'||uname);
dbms_output.put_line('upass:'||upass);
总结,通过上面的演示可以发现其实这是个很表面的错误,仅仅因为游标是从别的过程中声明并产生数据集的,所以躲过了很多编译错误,直到运行时才发生莫名其妙的错误。
相关推荐
当遇到ora-01033错误时,主要的现象包括但不限于: - **SQL*Plus无法连接**:尝试通过SQL*Plus连接数据库时,会收到ORA-01033错误提示。 - **Enterprise Manager Console中的错误**:同样地,在尝试通过Oracle ...
1. **表中的VARCHAR2字段存储了多字节字符**:如果某个字段的数据类型为VARCHAR2,并且其长度限制不足以完全容纳某些多字节字符(例如汉字),则可能导致数据截断。当尝试查询这些被截断的多字节字符时,Oracle...
—————————– 主库hp ux 备库win 2003 在备库发起数据复制sp,通过属于备库的dblink,取远程主库的数据,插入到本地备库时,属于LITTLE ENDIAN平台向BIG ENDIAN平台取值然后插入,这时出现错误: ORA-04052: ...
ORA-32001:write to spfile requested but no spfile is in use请求写入spfile,但没有使用spfile的解决方法 在输入以下语句中报了这样的错误: SQL>alter system set control_files=’/u01/app/oracle/oradata/prod/...
ORA-12154: TNS: 无法解析指定的连接标识符的解决方法
在Oracle数据库管理中,"ORA-00990: 权限缺失或无效"是一个常见的错误代码,它表示用户尝试执行的操作没有足够的权限。这个错误通常发生在试图访问、修改或者管理数据库对象(如表、视图、索引等)时。在本篇文章中...
4. **类型匹配**:OracleCommand的`Parameters`集合中的数据类型(OracleType)应与数据库表列的数据类型相匹配。在示例中,`:id`被定义为`OracleType.Char`,这意味着在数据库中对应的`tea_id`字段应该是字符类型的...
这可能是由于数据类型不兼容或其他数据转换问题。 #### ORA-00077: Conversion Not Supported 不支持的转换。这可能是由于数据类型不兼容或其他数据转换问题。 #### ORA-00078: Unable to Convert 无法转换。这...
在Oracle数据库中,"ORA-00904"是一个常见的错误代码,它表示尝试引用一个不存在或无效的标识符。在这个场景下,错误信息提到的是"WM_CONCAT"函数,这表明在Oracle 19c数据库环境中,用户尝试使用WM_CONCAT函数,但...
当事务对数据进行读写操作时,会根据操作类型和数据范围申请相应的锁。行级锁在行级别保护数据,而表级锁则锁定整个表。在并发环境中,如果事务A持有行锁并尝试获取事务B持有的另一行锁,而事务B也在尝试获取事务A...
而对于CLOB类型,虽然没有硬性长度限制,但一次PL/SQL语句中的绑定变量值不能超过4000个字符。 在处理这类问题时,有几种常见的解决方案: 1. **分块插入**: 当你的数据长度超过了4000个字符,你可以选择分批...
oracle12c程序连接时异常: ORA-01017: 用户名/口令无效; 登录被拒绝 的解决方案。
需要注意的是,这些命令应该谨慎使用,因为强制终止会话可能会导致数据的不一致。 如果在数据库级别杀死会话后,锁定的资源没有被及时释放,那么可以在操作系统级别杀死进程。这通常需要先查询到操作系统的进程号...
ORA-00001: 违反唯一约束条件 (.) ORA-00017: 请求会话以设置跟踪事件 ORA-00018: 超出最大会话数 ORA-00019: 超出最大会话许可数 ORA-00020: 超出最大进程数 () ORA-00021: 会话附属于其它某些进程;无法转换...
Oracle数据库自10g版本开始引入了回收站功能(Recycle Bin),这一特性为数据库管理员提供了一种简单而强大的方式来恢复误删的数据对象。通过回收站功能,用户可以在不使用备份的情况下恢复已删除的表、索引等数据库...
-- 解决ORA-00904: "WMSYS"."WM_CONCAT": 标识符无效 的文件包....... -- 解决ORA-00904: "WMSYS"."WM_CONCAT": 标识符无效 的文件包....... -- 解决ORA-00904: "WMSYS"."WM_CONCAT": 标识符无效 的文件包....... ...
ORA-12518 TNS:监听程序无法分发客户机连接,在您安装好数据库后配置连接数据库的过程中遇到这类问题应该很头疼吧,不过,当您还是四处查资料来解决您遇到的另你头疼的问题时,如果不经意间看到了这则贴子,那请您升...
oracle报错ora-12541:TNS无监听程序
oracle远程连接服务器出现 ORA-12170 TNS:连接超时 解决办法,需要的朋友可以参考一下