ORA-oracle ora 065122是什么错误?怎么解决

ora06502、ora06512错误该如何解决?
[问题点数:40分,结帖人speak13579]
ora06502、ora06512错误该如何解决?
[问题点数:40分,结帖人speak13579]
只显示楼主
取消只显示楼主
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。资料库: ORA-06502/ORA-06512错误原因一例 - IT Oracle ORA-06502 ORA-06512 WM_concat
时间: 13:26:06
ORA-06502/ORA-06512错误原因一例
--同事以下sql语句产生错误:
select n.mail_no,n.notice_no from ardba.arbino n
group by n.mail_no
[ORA-06502: PL/SQL: 数字或值错误:字符串缓冲区太小]
[ORA-06512: 在"WMSYS.WM_Concat_impl",line30]
--检查原因:
WMSYS.WM_Concat返回的是varchar2,所以长度不能超过.0.5和11.2.0.3后,此函数返回类型变成CLOB,但可能会导致其他问题。
=--同事用以下sql解决问题
select a.mail_no, wm_concat(a.notice_no) || max(a.str) as notice_no_all
from (select k.mail_no,
k.notice_no,
when k.all_sum > 4000 then
end as str
from (select t.mail_no,
t.notice_no,
sum(vsize(t.notice_no || ^,^)) over(partition by t.mail_type) as all_sum,
sum(vsize(t.notice_no || ^,^)) over(partition by t.mail_type order by t.notice_no) as up_sum
from ardba.arbino t) k
where (k.up_sum
or k.all_sum <= 4001) a
group by a.mail_no
(来源:Http://www.taoyoyo.net/lib/Single.asp?pID=2504)
评论(0)&浏览(2300)
Copyright@2005-, Inc. All Rights Reserved. (15)ORA-06512 DBMS_LOB.LOADCLOBFROMFILE处理经验
ORA-06512 DBMS_LOB.LOADCLOBFROMFILE处理经验
[摘要:正在履行一个用去返回CLOB工具的函数的时间,报ORA-06512毛病,目前便把毛病的缘由及办理举措纪录一下: create or replace function getClobDocument(filename in varchar2,charset in varchar2 default NULL) return]
在执行一个用来返回CLOB对象的函数的时候,报ORA-06512错误,现在就把错误的原因及解决办法记录一下:
create or replace function getClobDocument(filename in varchar2,charset in varchar2 default NULL)
& &return CLOB deterministic
& & file & & & & & &bfile := bfilename('XMLDIR',filename);
& & charContent & & CLOB := ' ';
& & targetFile & & &
& & lang_ctx & & & &number := DBMS_LOB.default_lang_
& & charset_id & & &number := 0;
& & src_offset & & &number := 1 ;
& & dst_offset & & &number := 1 ;
& & warning & & & &
& &if charset is not null then
& & & charset_id := NLS_CHARSET_ID(charset);
& &targetFile :=
& &DBMS_LOB.fileopen(targetFile, DBMS_LOB.file_readonly);
& &DBMS_LOB.LOADCLOBFROMFILE(charContent, targetFile,DBMS_LOB.getLength(targetFile), src_offset, dst_offset,charset_id, lang_ctx,warning);
& &DBMS_LOB.fileclose(targetFile);
& &return charC
INSERT INTO XMLTABLE VALUES(XMLTYPE(getCLOBDocument('test.xml','UTF-8')));
第 1 行出现错误:
ORA-06502: PL/SQL: 数字或&#20540;错误
ORA-06512: 在 &SYS.DBMS_LOB&, line 669
ORA-06512: 在 &VEND.GETCLOBDOCUMENT&, line 18
ORA-06512: 在 line 1
原因是ORACLE中存放的字符集不是utf-8而是utf8,在执行charset_id := NLS_CHARSET_ID(charset)的时候,charset_id是null,而 DBMS_LOB.LOADCLOBFROMFILE中的charset_id默认&#20540;是0而不是null,所以会报ORA-06512。
把语句改成:
INSERT INTO XMLTABLE VALUES(XMLTYPE(getCLOBDocument('test.xml','UTF8')));
引申学习:
遇到这个错误的时候在网上搜索很多资料,发现一个共同点,ORA-06512错误的原因一般都是在执行存储过程的时候,传入的参数不合法造成的,所以,解决这个错误的办法就是,仔细分析传入参数的&#20540;是否存在问题。
感谢关注 Ithao123精品文库频道,是专门为互联网人打造的学习交流平台,全面满足互联网人工作与学习需求,更多互联网资讯尽在 IThao123!
Laravel是一套简洁、优雅的PHP Web开发框架(PHP Web Framework)。它可以让你从面条一样杂乱的代码中解脱出来;它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁、富于表达力。
Hadoop是一个由Apache基金会所开发的分布式系统基础架构。
用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。
Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求,可以以流的形式访问(streaming access)文件系统中的数据。
Hadoop的框架最核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储,则MapReduce为海量的数据提供了计算。
产品设计是互联网产品经理的核心能力,一个好的产品经理一定在产品设计方面有扎实的功底,本专题将从互联网产品设计的几个方面谈谈产品设计
随着国内互联网的发展,产品经理岗位需求大幅增加,在国内,从事产品工作的大部分岗位为产品经理,其实现实中,很多从事产品工作的岗位是不能称为产品经理,主要原因是对产品经理的职责不明确,那产品经理的职责有哪些,本专题将详细介绍产品经理的主要职责
IThao123周刊As we all known,程序的错误一般分为两类:编译错误和运行时错误。其中运行时错误被称为异常。PL/SQL语句块中处理异常的部分即为异常处理部分。在异常处理部分,可以指定当特定异常发生时所采取的动作。
PL/SQL有两种类型的异常:内置异常和用户自定义异常。
其中,内置异常又分为预定义异常和非预定义异常。
一、内置异常
首先试举一例来抛砖引玉。
v_ename varchar2(10);
v_empno number(4) := &v_
SELECT ename
INTO v_ename
WHERE empno = v_
DBMS_OUTPUT.PUT_LINE('Employee name is '||v_ename);
该语句块通过输入员工的编号来得出员工的姓名。当输入的员工编号存在时,输出员工姓名,当员工编号不存在时,会有运行错误。如下所示:
Enter value for v_empno: 7788
Employee name is SCOTT
--&& 输入的员工编号存在,输出员工姓名
PL/SQL procedure successfully completed.
Enter value for v_empno: 1234
ERROR at line 1:
ORA-01403: no data found
--&& 输入的员工编号不存在,报运行时错误
ORA-06512: at line 5
&由此可见,编译器无法检测运行错误。为在程序中处理这种类型的错误,必须添加异常处理部分。异常处理部分的语法结构如下:
EXCEPTION& & & &WHEN&EXCEPTION_NAME&THEN& & & & & & &ERROR-PROCESSING STATEMENTS;
在语句块中,异常处理部分位于可执行部分之后,上例可修改如下:
v_ename varchar2(10);
v_empno number(4) := &v_
SELECT ename
INTO v_ename
WHERE empno = v_
DBMS_OUTPUT.PUT_LINE('Employee name is '||v_ename);
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('There is no such employee');
使用异常处理部分,可以使得程序能够正常结束,而不是非正常终止。同时,输出结果更加面向用户,而不是编程人员。
上述NO_DATA_FOUND即为Oracle预定义异常。
下面列出一些常见的预定义异常:
TOO_MANY_ROWS : SELECT INTO返回多行INVALID_CURSOR :非法指针操作(关闭已经关闭的游标)ZERO_DIVIDE :除数等于零DUP_VAL_ON_INDEX :违反唯一性约束ACCESS_INTO_NULL: 未定义对象 CASE_NOT_FOUND: CASE 中若未包含相应的 WHEN ,并且没有设置 ELSE 时 COLLECTION_IS_NULL: 集合元素未初始化 CURSER_ALREADY_OPEN: 游标已经打开 DUP_VAL_ON_INDEX: 唯一索引对应的列上有重复的值 INVALID_NUMBER: 内嵌的 SQL 语句不能将字符转换为数字 NO_DATA_FOUND: 使用 select into 未返回行,或应用索引表未初始化的元素时 SUBSCRIPT_BEYOND_COUNT:元素下标超过嵌套表或 VARRAY 的最大值 SUBSCRIPT_OUTSIDE_LIMIT: 使用嵌套表或 VARRAY 时,将下标指定为负数
VALUE_ERROR: 赋值时,变量长度不足以容纳实际数据 LOGIN_DENIED: PL/SQL 应用程序连接到 oracle 数据库时,提供了不正确的用户名或密码 NOT_LOGGED_ON: PL/SQL 应用程序在没有连接 oralce 数据库的情况下访问数据 PROGRAM_ERROR: PL/SQL 内部问题,可能需要重装数据字典& pl./SQL 系统包 ROWTYPE_MISMATCH: 宿主游标变量与 PL/SQL 游标变量的返回类型不兼容 SELF_IS_NULL: 使用对象类型时,在 null 对象上调用对象方法 STORAGE_ERROR: 运行 PL/SQL 时,超出内存空间 SYS_INVALID_ID: 无效的 ROWID 字符串 TIMEOUT_ON_RESOURCE: Oracle 在等待资源时超时
others可以代表所有异常,oracle预定义的异常在20000以内。
二、 用户自定义异常
通常,在自己的程序里,也许需要处理与所写程序相关的问题。例如,在上个语句块中,需要输入员工编号。通常,希望员工编号是正值。但是无意间,用户输入一个负数。但是,没有发生任何错误,因为变量v_empno被定义为数值类型。这时,你希望自定义异常来处理这种情况,这种类型的异常被称为用户自定义异常。在使用该异常之前,必须首先进行声明。语法结构如下所示:
DECLARE& & &exception_name EXCEPTION;BEGIN& & &...& & &IF &CONDITION THEN& & & & & RAISE exception_& & &ELSE& & & & & ...& & &END IF;EXCEPTION& & &WHEN exception_name THEN& & & & & &ERROR-PROCESSING STATEMENTS;END;
故上例可修改为:
v_ename varchar2(10);
v_empno number(4) := &v_
e_invalid_
IF v_empno & 0 THEN
RAISE e_invalid_
--&& 注意:RAISE语句应该与IF语句一起使用,否则,每次执行时,执行权都会转到该语句块的异常处理部分
SELECT ename
INTO v_ename
WHERE empno = v_
DBMS_OUTPUT.PUT_LINE('Employee name is '||v_ename);
WHEN e_invalid_no THEN
DBMS_OUTPUT.PUT_LINE('Employee number can not be negative');
三、RAISE_APPLICATION_ERROR
& & &RAISE_APPLICATION_ERROR是oracle提供的一种特殊的内置过程,允许编程人员为特定应用程序创建有意义的错误信息。RAISE_APPLICATION_ERROR过程适用于未命名的用户定义异常。它负责将错误编号和错误文本关联起来,它的语法为:
& & &RAISE_APPLICATION_ERROR(error_number,error_message);
& & &error_number是与特定错误信息相关联的错误编号。这个编号的范围在-20999到-20000之间。error_message是错误文本,最多包含2048个字符。
& & &上例可修改为:
v_ename varchar2(10);
v_empno number(4) := &v_
IF v_empno & 0 THEN
RAISE_APPLICATION_ERROR(-20000,'Employee number can not be negative');
SELECT ename
INTO v_ename
WHERE empno = v_
DBMS_OUTPUT.PUT_LINE('Employee name is '||v_ename);
当输入的员工编号为负数时,运行结果如下所示:
Enter value for v_empno: -1234
ERROR at line 1:
ORA-20000: Employee number can not be negative
ORA-06512: at line 6
借助于RAISE_APPLICATION_ERROR过程,编程人员能够遵循与Oracle错误一致的方式返回错误信息。
四、 EXCEPTION_INIT
在上文内置异常中,预定义异常的个数其实是非常有限的,当程序抛出其它不在上述预定义范围内的异常时,该如何捕捉呢?
譬如下例:
number(2) := &v_
DELETE FROM dept
WHERE deptno= v_
当部门编号输入10时,我们来看看运行结果:
Enter value for v_deptno: 10
ERROR at line 1:
ORA-02292: integrity constraint (SCOTT.FK_DEPTNO) violated - child record found
ORA-06512: at line 4
违反父键约束,但是,我们如何捕捉此种错误呢?在这里,我们可以用到EXCEPTION_INIT。
使用EXCEPTION_INIT指令,可以将某Oracle错误编号和用户定义异常的名称建立关联。EXCEPTION_INIT指令出现在语句块的声明部分,如下所示:
DECLARE& & & exception_name EXCEPTION;& & & PRAGMA EXCEPTION_INIT(exception_name,error_code);
注意,用户定义异常的声明出现在所使用的EXCEPTION_INIT指令之前,EXCEPTION_INIT指令有两个参数:exception_name和error_code。exception_name是异常的名称,error_code是希望与该异常建立关联的Oralce错误编号。
上例可修改为:
number(2) := &v_
e_child_exists EXCEPTION;
PRAGMA EXCEPTION_INIT(e_child_exists,-2292);
DELETE FROM dept
WHERE deptno= v_
WHEN e_child_exists THEN
DBMS_OUTPUT.PUT_LINE('Delete employees for No.'||v_deptno||' dept first');
同样将部门编号输入为10,来看看结果:
Enter value for v_deptno: 10
Delete employees for No. 10 dept frist
PL/SQL procedure successfully completed.
可以正常捕捉错误!
五、 SQLCODE和SQLERRM
所以Oracle错误都可以使用OTHERS异常处理程序进行捕获和处理,如下例所示:
v_deptno number(4) := &v_
varchar2(5);
varchar2(10);
SELECT dname,loc
INTO v_dname,v_loc
WHERE deptno = v_
DBMS_OUTPUT.PUT_LINE(v_dname||','||v_loc);
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('An error has occurred');
当输入10作为部门编号的值时,我们来看看输出:
Enter value for v_deptno: 10
An error has occurred
PL/SQL procedure successfully completed.
上述输出说明,在程序运行时发生一个错误。如果你对表结构及数据不是很熟悉的话,你很难知道这个错误是什么,以及是什么原因导致错误发生的。也许在运行时,dept表中不存在对应的部门编号,或者SELECT INTO语句所导致的数据类型匹配问题。尽管这只是一个简单地例子,但仍旧可能会发生很多意想不到的运行错误。
当然,你永远无法知道程序执行时所有可能发生的运行错误,因此,最好在自己的程序中添加OTHERS异常处理程序。为改进自己程序的异常处理接口,Oracle提供了两个内置函数-SQLCODE和SQLERRM-用于实现OTHERS异常处理程序。SQLCODE函数会返回Oracle错误编号,SQLERRM函数返回错误信息。
修改上例如下:
v_deptno number(4) := &v_
varchar2(5);
varchar2(10);
SELECT dname,loc
INTO v_dname,v_loc
WHERE deptno = v_
DBMS_OUTPUT.PUT_LINE(v_dname||','||v_loc);
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLCODE||chr(10)||SQLERRM);
--&& chr(10)代表回车键
同样,当输入10作为部门编号时,看看输出:
Enter value for v_deptno: 10
ORA-06502: PL/SQL: numeric or value error: character string buffer too
PL/SQL procedure successfully completed.
这样可捕捉任何运行时错误的错误编号和错误信息&
& & &1& 预定义异常的错误代码有名称,譬如上文提到的NO_DATA_FOUNG
& & &2& 非预定义异常只有错误代码,没有名称,如上文提到的ora-02292。这时可以通过EXCEPTION_INIT编译指令进行错误代码和名称的关联。
& & &3& 当PL/SQL语句块的可执行部分出现某个运行错误时,会抛出不同类型的异常。但是,运行错误也可能发生在语句块的声明部分或者异常处理部分。控制在这些环境下异常抛出方式的规则称为异常传播。
& & &4& 当PL/SQL语句块的声明部分或者异常处理部分出现运行错误时,该语句块的异常处理部分不能捕获此项错误。如果不存在外部语句块,该程序执行会终止,并将执行权转到主机环境。如果存在外部语句块,该异常会立即传播到外部语句块。如下例所示:
--outer block
--inner block
v_test CHAR(3) := 'ABC';
v_test := '1234';
DBMS_OUTPUT.PUT_LINE('v_test: '||v_test);
WHEN INVALID_NUMBER OR VALUE_ERROR THEN
v_test := 'ABCD';
DBMS_OUTPUT.PUT_LINE('An error has occurred in the inner block');
WHEN INVALID_NUMBER OR VALUE_ERROR THEN
DBMS_OUTPUT.PUT_LINE('An error has occurred in the program');
当执行时,得到如下输出:
An error has occurred in the program
PL/SQL procedure successfully completed.
最后试举一例练练思维:
my_error1 EXCEPTION;
PRAGMA EXCEPTION_INIT(my_error1, -20001);
my_error2 EXCEPTION;
PRAGMA EXCEPTION_INIT(my_error2, -20002);
raise_application_error(-20001,'err_1');
raise_application_error(-20002,'err_2');
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Not found');
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('More data');
WHEN MY_ERROR1 THEN
dbms_output.put_line('This is a err_1 test');
WHEN MY_ERROR2 THEN
dbms_output.put_line('This is a err_2 test');
阅读(...) 评论()}

我要回帖

更多关于 oracle ora 06512 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信