ORA-06502: PL/SQL: 数字或值错误,我贴出来,大家帮我改一下,以前没怎么写过存储过程。。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ORA-06502: PL/SQL: 数字或值错误,我贴出来,大家帮我改一下,以前没怎么写过存储过程。。相关的知识,希望对你有一定的参考价值。

执行EXEC SQM_RESULT_PRO ;
ORA-06502: PL/SQL: 数字或值错误
ORA-06512: 在"TELEUSER.SQM_RESULT_PRO", line 30
ORA-06512: 在line 2

create or replace procedure SQM_RESULT_PRO is
str varchar2(4096);--最终拼的字符串
str2 varchar2(4096);--最终拼的字符串
ndate varchar2(64); --当天日期
cnum NUMBER(6);--当天的条数
CURSOR resname1 IS select resname from sqm_result_log where restype='1';
CURSOR resname2 IS select resname from sqm_result_log where restype='2';
begin
--开始
select to_char(sysdate,'yyyy-MM-dd') into ndate from dual;
select count(*) into cnum from sqm_result_log where to_char(restime,'yyyy-MM-dd')=ndate;
--判断当天的是否为6个文件
if cnum = 6 then
--系统运行正常
str:='系统运行正常';
else if cnum<6 then
--系统运行不正常
str:='系统运行不正常';
end if;
end if;
--open resname1 for select resname from sqm_result_log where restype='1';
--close resname1;
--open resname2 for select resname from sqm_result_log where restype='2';
--close resname2;
OPEN resname1;
loop
fetch resname1 into str2;
str:=str||' '||str2;
exit when resname1 % NOTFOUND;
end loop;
CLOSE resname1;

str2:='';

OPEN resname2;
loop
fetch resname2 into str2;
str:=str||' '||str2;
exit when resname2 % NOTFOUND;
end loop;
CLOSE resname2;

insert into testsqm values(str);
end SQM_RESULT_PRO;

刚刚看了一下,语法没有太大问题,怀疑是变量长度不够造成的问题。
把str、str2、cnum的长度修改一下,字符串改为32767,这个是最大的长度,number不限定长度,修改如下:
Str VARCHAR2(32767); --最终拼的字符串
Str2 VARCHAR2(32767); --最终拼的字符串
Ndate VARCHAR2(64); --当天日期
Cnum NUMBER; --当天的条数追问

insert into testsqm values(str);

插入的时候这个testsqm 表改成long类型的?改完了然后str没有数据啊。。str查询出来的东西必定是有数据的啊。这个怎么检查呢?用pl/sql

追答

testsqm 表的结构什么样,发出来

追问

..忘记贴了。就这一个字段啊。。测试能不能插进去
create table TESTSQM
(
TEST LONG
)
tablespace USERS
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64K
minextents 1
maxextents unlimited
);

追答

在insert into testsqm values(str); --之后,需要提交,增加
commit;
然后执行过程,执行后查询TESTSQM表中数据就行了。

参考技术A ORA-6502: 数字或值错误,一般出现在将字符串(varchar)类型转换为数值类型失败时候出现
检查下程序中变量和表列的数据类型是否一致
参考技术B fetch resname2. resname into str2;

插入 CLOB 列时出错:ORA-06502:PL/SQL:数字或值错误

【中文标题】插入 CLOB 列时出错:ORA-06502:PL/SQL:数字或值错误【英文标题】:Getting error while inserting into CLOB Column: ORA-06502: PL/SQL: numeric or value error 【发布时间】:2021-05-10 08:11:28 【问题描述】:

我在插入 CLOB 数据类型时遇到 PL/SQL 值错误,因为限制超过了 32767 个字符,我的数据限制在这里超过了 40000。

错误来自第 24 行,即v_clob_all := 同时将所有值分配给 CLOB 列。

ORA-06502:PL/SQL:数字或值错误 ORA-06512: 在第 24 行

** 请查看下面的代码并在这里帮助我如何处理这个 CLOB 值。**

提前致谢

1   DECLARE
2      v_clob_all      CLOB;
3      delimiter                 VARCHAR2 (20) := ',';
4      l_err_message   VARCHAR2 (2000);
5      l_retcode_o     NUMBER := 0;
6   BEGIN
7      DBMS_OUTPUT.PUT_LINE ('START');
8   
9      FOR cur_execution_report IN (SELECT TABLE_NAME     TABLE_NAME,
10                                         PURGE_NAME     PURGE_NAME,
11                                         ENABLE_FLAG    ENABLE_FLAG,
12                                         ARCHIVE_FLAG   ARCHIVE_FLAG,
13                                         END_TIME       END_TIME,
14                                         STATUS         STATUS,
15                                         ELIGIBLE_COUNT ELIGIBLE_COUNT,
16                                         TABLE_SIZE     TABLE_SIZE,
17                                         BIZ_RULE       BIZ_RULE,
18                                         ERROR_MESSAGE  ERROR_MESSAGE
19                                    FROM TEST_REPORT_STATUS)
20     LOOP
21        DBMS_OUTPUT.PUT_LINE ('Inside loop');
22  
23        BEGIN
24           v_clob_all :=
25                 v_clob_all
26              || cur_execution_report.TABLE_NAME
27              || delimiter
28              || cur_execution_report.PURGE_NAME
29              || delimiter
30              || cur_execution_report.ENABLE_FLAG
31              || delimiter
32              || cur_execution_report.ARCHIVE_FLAG
33              || delimiter
34              || TO_CHAR (cur_execution_report.END_TIME,
35                          'DD-MON-YYYY HH:MI:SS PM')
36              || delimiter
37              || cur_execution_report.STATUS
38              || delimiter
39              || cur_execution_report.ELIGIBLE_COUNT
40              || delimiter
41              || cur_execution_report.TABLE_SIZE
42              || delimiter
43              || '"'
44              || REPLACE (
45                    (REPLACE (cur_execution_report.BIZ_RULE, ',', '","')),
46                    '"',
47                    '')
48              || '"'
49              || delimiter
50              || cur_execution_report.ERROR_MESSAGE
51              || UTL_TCP.crlf;
52  
53           DBMS_OUTPUT.PUT_LINE ('Length Of CLOB: ' || LENGTH (v_clob_all));
54        --                EXCEPTION
55        --                   WHEN OTHERS
56        --                   THEN
57        --                      l_err_message :=
58        --                         SUBSTR (
59        --                               ' Error while Executing Report clob data fetch for all records purge : '
60        --                            || SQLERRM,
61        --                            1,
62        --                            1500);
63        --                      l_retcode_o := 1;
64        --
65        --                      RAISE RPT_ERR_MSG;
66        END;
67     END LOOP;
68  END;

【问题讨论】:

【参考方案1】:

如果我理解正确,您没有发布的代码(为什么不发布?)是

declare
  v_clob_all varchar2(32767);

你为什么不这样做

declare
  v_clob_all clob;

毕竟,您正在使用CLOB;你不是吗?


作为变量 CLOB 然后:将to_clob 应用于您要连接的每个元素,例如

       v_clob_all :=
             v_clob_all
          || to_clob(cur_execution_report.TABLE_NAME)
          || delimiter
          || to_clob(cur_execution_report.PURGE_NAME)
          || delimiter
          ...

【讨论】:

好的。现在删除整个 EXCEPTION 部分,再次运行代码。当/如果您遇到错误,Oracle 会确切地告诉您它发生的位置(行号和列号)。然后看看是什么引起的。 删除了异常块,错误来自第 24 行,同时为 CLOB 赋值,也更新了问题,请立即提出建议。 ORA-06502:PL/SQL:数字或值错误 ORA-06512:第 24 行 啊哈;我认为我了解您的问题可能是什么 - 将 TO_CLOB 应用于您要连接的值。我发布了一个示例,说明了我的意思。看看有没有帮助。 它现在正在工作,非常感谢您的帮助

以上是关于ORA-06502: PL/SQL: 数字或值错误,我贴出来,大家帮我改一下,以前没怎么写过存储过程。。的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL: 数字或值错误 - ORA-06502

ORA-06502 PL/SQL:数字或值错误:字符到数字的转换错误;

ORA-06502: PL/SQL: 数字或值错误: 数字精度太大

ORA-06502: PL/SQL: 数字或值错误: 字符到数字的转换错误

ORA-06502: PL/SQL: 数字或值错误: NULL 索引表键值

ORA 06502 错误 PL/SQL