PL / SQL中的数组作为返回类型,返回ORA-06502:PL / SQL:数字或值错误:字符到数字的转换错误

问题描述 投票:0回答:1

一直在研究一个问题,即通过替换出现在同义词和单词替换列表中的单词来替换字符串中的单词。一个字符串可能会产生多个字符串,具体取决于替换。这样做的想法是获得可能的字符串替换,作为可以在SQL查询中使用的函数。但是,我得到了错误ORA-06502: PL/SQL: numeric or value error: character to number conversion error。让我解决上一个问题。

有一个单词替换表,例如:

WORD        SUBS_LIST
MOUNTAIN    MOUNTAIN, MOUNT, MT, MTN
VIEW        VIEW, VU
FORMULA     FORMULA, 4MULA, FOURMULA

此外,我的同义词表如下:

WORD            SYN_LIST
EDUCATION       SCHOOL, UNIVERSITY, COLLEGE, TRAINING
FOOD            SYN, BAR, BISTRO, BREAKFAST, BUFFET, CABARET, CAFE, CANTINA, CAPPUCCINO,    ...,
STORE           SYN, CONVENIENCE, FOOD, GROCER, GROCERY,...,
REFRIGERATION   SYN, APPLIANCE, COLDSTORAGE, FOODLOCKER, FREEZE, FRIDGE, ICE, REFRIGERATION

如果我有一个字符串,例如MOUNT VU SYN GROWERS,该函数应返回一个由三个字符串组成的数组,这些字符串针对所有可能的替换生成:

MOUNTAIN VIEW STORE GROWERS
MOUNTAIN VIEW FOOD GROWERS
MOUNTAIN VIEW REFRIGERATION GROWERS

然后,查询应通过以下方式调用该函数以替换同义词和替换:

select replace_synonyms('MOUNT VU SYN GROWERS') from dual;

SELECT name, replace_synonyms(name) corrected_name
FROM   institutions
WHERE  replace_synonyms(name) LIKE replace_synonyms('MOUNT VU SYN GROWERS')

为了解决此问题,创建了一个函数来替换字符串并提供可能的替换。在那边给数组赋值时遇到问题:

ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: character to number conversion error
ORA-06512: at "SYSTEM.REPLACE_SYNONYMS", line 35
ORA-06512: at "SYSTEM.REPLACE_SYNONYMS", line 35

35:  array(v_idx):= regexp_replace(
                  p_text, '(^|[^a-z0-9])' || i.text || '($|[^a-z0-9])', 
                  '\1' || i.word || '\2', 1, 0,  'i');

对应于以下值:

array(2):= regexp_replace(
                  'MOUNTAIN VIEW SYN GROWERS', '(^|[^a-z0-9])' || 'SYN' || '($|[^a-z0-9])', 
                  '\1' || 'STORE' || '\2', 1, 0,  'i');

请查看dbFiddle以获取详细信息和确切情况。

如何获得要在SQL查询中使用的数组?这可能吗?

谢谢

arrays database oracle plsql sql-like
1个回答
0
投票

错误ORA-06502: PL/SQL: numeric or value error: character to number conversion error被证明是与数组大小有关的错误。然后增加varray的值可解决问题:

create type array_t is varray(100) of varchar2(4000);
/
© www.soinside.com 2019 - 2024. All rights reserved.