Могу ли я использовать Varchar2 (32767) или Varchar2 Table в IN оператора SQL - PullRequest
0 голосов
/ 24 апреля 2019

Я сохранил функцию, которая возвращает Varchar2 (32767), и я хочу использовать ее в операторе select в IN, но я получаю ошибку, когда использую ее в Select в предложении IN.

SELECT * FROM testcustomers1 where no_of_bu1 in(select myMaxLenFunc('test') from dual);

Это дает мне ошибку

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

Если возвращаемое значение меньше 4k, оно работает нормально, но если оно больше этого значения, оно выдает вышеуказанную ошибку.

Пожалуйста, предложите мне, если я использую таблицу varchar2 или Varchar2 возвращаются в сохраненную функцию, как я могу использовать это предложение IN в select.

Ответы [ 2 ]

0 голосов
/ 24 апреля 2019

У вас правильная идея использовать коллекцию вместо строки в предложении IN. Тогда вы не столкнетесь с этой проблемой. Попробуйте что-то вроде этого:

CREATE OR REPLACE TYPE strings_t IS TABLE OF VARCHAR2 (4000)
/

CREATE OR REPLACE FUNCTION strings
   RETURN strings_t
   AUTHID DEFINER
IS
BEGIN
   RETURN strings_t ('abc', 'def', '123');
END;
/

CREATE TABLE t (s VARCHAR2 (100))
/

BEGIN
   INSERT INTO t
        VALUES ('abd');

   INSERT INTO t
        VALUES ('def');

   INSERT INTO t
        VALUES ('456');

   COMMIT;
END;
/

SELECT *
  FROM t
 WHERE t.s IN (SELECT COLUMN_VALUE FROM TABLE (strings ()))
/
0 голосов
/ 24 апреля 2019

Ваша функция PL / SQL и может возвращать строку varchar2 более 4000. Это недопустимо для SQL (если параметр MAX_STRING_SIZE имеет значение STANDARD)

http://docs.oracle.com/cd/E11882_01/appdev.112/e17126/datatypes.htm

VARCHAR2 Максимальный размер в PL / SQL: 32,767 байт Максимальный размер в SQL 4000 байтов

Так что вам нужно найти способ обойти. Поскольку no_of_bu1 является столбцом SQL и не может иметь длину более 4000 байт, вы сохраните его с помощью:

SELECT * FROM testcustomers1 
 where no_of_bu1 in(select substr(myMaxLenFunc('test'),1,4000) from dual);

Хотя я бы обрезал строку внутри функции.

Если ваша БД имеет Oracle 12.1, вы можете узнать, СТАНДАРТЫ ли вы в строках SQL (т.е. 4000)

SELECT name, value
  FROM v$parameter
 WHERE name = 'max_string_size'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...