VARCHAR2 (32767) не может обрабатывать строки в хранимой процедуре - PullRequest
0 голосов
/ 11 апреля 2020

Я объединяю строку с помощью курсора (чтобы сформировать запрос для выполнения позже). Здесь запрос, который будет сформирован, будет намного больше, чем может обработать VARCHAR2 (32767). Поэтому я получаю ошибку при выполнении pro c - ORA-06502: PL / SQL: цифра c или ошибка значения: слишком маленький буфер строки символов.

Я также использовал тип данных CLOB, но получил ошибку ORA-06502: PL / SQL: цифра c или ошибка значения.

Мой код приведен ниже:

CREATE OR REPLACE PROCEDURE sp_Market
IS
   Names VARCHAR2(32767);    
BEGIN
   DECLARE CURSOR cur IS  ('Select ID, Order_of, field_name  
   FROM   pld_medicare_config');
   BEGIN       
   FOR i IN cur
       LOOP
           Names := Names ||  i.sqql;
       END LOOP;    
   dbms_output.put_line(Names);
   END;   
END sp_Market;

Как мне обработать мою строку запросов и какой тип данных существует для выполнения sh задачи?

Ответы [ 3 ]

1 голос
/ 11 апреля 2020

CLOB в порядке (насколько я могу судить); Я сомневаюсь, что запросы, которые вы храните, содержат , которые большие.

Удалить dbms_output.put_line вызов из процедуры; Я подозреваю, что именно она вызывает ошибку.

0 голосов
/ 11 апреля 2020

Я не уверен, как вы получили какую-либо ошибку во время выполнения, так как ваша процедура не будет компилироваться.

Действительная версия PL / SQL будет выглядеть примерно так:

create or replace procedure sp_market is
    names varchar2(32767);
begin
    for r in (
        select id, order_of, field_name
        from   pld_medicare_config
    )
    loop
        names := names || ' ' || r.field_name;
    end loop;

    names := ltrim(names);

    dbms_output.put_line(names);
end sp_market;

Если names должно быть длиннее, измените тип данных на clob.

0 голосов
/ 11 апреля 2020

Используйте тип данных CLOB и добавьте данные, используя процедуру dbms_lob.writeappend. Это ссылка (Oracle 18 c).

Возможно, ошибка возникает при вызове dbms_output.put_line. Процедура определена только для varchar2 аргументов, что означает, что во время вызова происходит неявное преобразование. Это не удастся для содержимого сгустка длиннее 32767 символов / байтов.

В качестве альтернативы вы можете объявить коллекцию более varchar2(4000) и последовательно заполнить элементы коллекции:

CREATE OR REPLACE PROCEDURE sp_Market
IS
   TYPE tLongString IS TABLE OF VARCHAR2(4000) INDEX BY BINARY_INTEGER;
   cNames  tLongString;    
BEGIN
   DECLARE CURSOR cur IS Select ID, Order_of, field_name, sqql FROM pld_medicare_config;
   BEGIN       
   FOR i IN cur
       LOOP
           cNames(cNames.COUNT+1) := i.sqql;
       END LOOP;    
   END;   
END sp_Market;

Примечание

Исправленный код, теперь скомпилируется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...