SQL: Как получить подстроку из вывода функции в sql?

89
8

В одном из моих приложений. У нас есть один запрос, где actully мы вызываем функцию, а функция возвращает o/p как String. У любого есть идея, как получить подстроку из возвращаемой функции o/p?

Я так использую

select substr(myfunction(),0,4000) from dual.

Я становлюсь ниже вопроса.

ORA-06502: PL/SQL: числовая или стоимостная ошибка: буфер строковой буквы слишком мал.

Пожалуйста, помогите мне. Заранее спасибо.

спросил(а) 2021-01-25T15:08:05+03:00 5 месяцев назад
1
Решение
78

Поскольку вы применяете substr, предположительно значение, возвращаемое вашей функцией, превышает 4000 символов. Если в этом случае вы получите эту ошибку из SQL, вы не сможете этого избежать. Он пытается присвоить длинное строковое значение (неявному) SQL-уровню varchar2, который, конечно же, не может превышать 4000 символов, прежде чем передать это функции substr.

Вам нужно будет добавить substr к возврату из вашей функции, или если его иногда вызывают откуда-то, который может обрабатывать длинные значения, вы можете иметь функцию-обертку, которая возвращает только первые 4000 символов, поэтому вы можете иметь соответствующее значение по мере необходимости.

Чтобы продемонстрировать с помощью фиктивной функции (неэффективно!), Создайте большую строку:

create or replace function myfunction(strlen number) return varchar2 is
str varchar2(32767) := 'X';
begin
while length(str) < least(strlen, 32767) loop
str := str || 'X';
end loop;
return str;
end myfunction;
/

Это нормально, потому что выход функции не превышает размер SQL varchar2:

select length(substr(myfunction(4000),0,4000)) from dual;

LENGTH(SUBSTR(MYFUNCTION(4000),0,4000))
---------------------------------------
4000

Но это вызывает вашу ошибку, потому что выход функции слишком длинный:

select length(substr(myfunction(4001),0,4000)) from dual;

SQL Error: ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at "STACKOVERFLOW.MYFUNCTION", line 7
06502. 00000 - "PL/SQL: numeric or value error%s"

С простой функцией обертки как обходной путь:

create or replace function trunc_myfunction(strlen number) return varchar2 is
begin
return substr(myfunction(strlen), 0, 4000);
end;
/

select length(substr(trunc_myfunction(4000),0,4000)) from dual;

LENGTH(SUBSTR(TRUNC_MYFUNCTION(4000),0,4000))
---------------------------------------------
4000

select length(substr(trunc_myfunction(4001),0,4000)) from dual;

LENGTH(SUBSTR(TRUNC_MYFUNCTION(4001),0,4000))
---------------------------------------------
4000

select length(substr(trunc_myfunction(32767),0,4000)) from dual;

LENGTH(SUBSTR(TRUNC_MYFUNCTION(32767),0,4000))
----------------------------------------------
4000

ответил(а) 2021-01-25T15:08:05+03:00 5 месяцев назад
63

Скорее всего, вы пытаетесь сохранить больше символов, чем разрешено в одной из переменных, которые вы используете в своей функции. См.: PL/SQL: числовая или значащая ошибка: буфер символьной строки слишком мал.% ROWTYPE

Простейший пример:


DECLARE
v_varchar2_test VARCHAR2(5);
BEGIN
v_varchar2_test := '123456';
END;

И ошибка, как в вашем случае, ORA-06502.

ответил(а) 2021-01-25T15:08:05+03:00 5 месяцев назад
45

Убедитесь, что значение, возвращаемое функцией, имеет правильный тип; Я только что попробовал:

create or replace 
FUNCTION MONTH
(DATA IN DATE)
RETURN VARCHAR IS
BEGIN
RETURN TO_CHAR(DATA, 'MM');
END;

и вызов:

SELECT substr(MONTH(SYSDATE),0,1) FROM DUAL;

и это сработало.

ответил(а) 2021-01-25T15:08:05+03:00 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема