powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / DBMS_SQL
5 сообщений из 5, страница 1 из 1
DBMS_SQL
    #39043615
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день коллеги!

В общем была задача , многострочный инсерт, типа блокнота.

Теперь столкнулся со следующей проблемой.
Размер самого SQL запроса становится слишком большим, как мы знаем больше 32 К с копейками символов в самом запросе вызывает ошибку.
Сейчас переписал свой запрос с использованием DBMS_SQL, и он закомплился.
Когда нажимаю выполнить, он выполняется.
Но почему-то результаты в самой таблице не появляются.
Знатоки, помогите плиз!!!

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
DECLARE
    cursor_name INTEGER;
    rows_processed INTEGER;
BEGIN
    cursor_name := dbms_sql.open_cursor;
    DBMS_SQL.PARSE(cursor_name, 'INSERT INTO MONITOR.MORED (ID_MORED, ID_EMPLOYEE_FK, MODEL_MORED, STATUS)
                                 SELECT MONITOR.SEQ_MORED.NEXTVAL, :x, a.str, 1
                                   FROM (SELECT TRIM(REGEXP_SUBSTR(s, ''[^''||chr(10)||'']+'', 1, level)) str
	                                     FROM (SELECT :y s FROM dual) t
                                         CONNECT BY INSTR(s, chr(10), 1, level - 1) > 0) a
                                  WHERE TRIM(a.str) IS NOT NULL;',
                   DBMS_SQL.NATIVE);
    DBMS_SQL.BIND_VARIABLE(cursor_name, ':x', :F102_ID_EMPLOYEE);
    DBMS_SQL.BIND_VARIABLE(cursor_name, ':y', :P1_MODEL);
    rows_processed := DBMS_SQL.EXECUTE(cursor_name);
    DBMS_SQL.CLOSE_CURSOR(cursor_name);
EXCEPTION
WHEN OTHERS THEN
    DBMS_SQL.CLOSE_CURSOR(cursor_name);
END;
...
Рейтинг: 0 / 0
DBMS_SQL
    #39043628
blkangel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vadipok,

Вообще задача не апекса, а оракла. Я думаю стоит в ту ветку написать.
А мне жалко давать свой парсер :)
...
Рейтинг: 0 / 0
DBMS_SQL
    #39043642
blkangel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vadipok,

Кстати в первом посте, вам подсказали как это сделать, но вы почему то от цикла отказались :)
...
Рейтинг: 0 / 0
DBMS_SQL
    #39043662
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да точно, спасибо за подсказку.
...
Рейтинг: 0 / 0
DBMS_SQL
    #39044590
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blkangel,

Вроде победил, спасибо.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
DECLARE
  l_count     number;
  mored_value varchar2(200);
BEGIN
  l_count := length(:P1_MODEL||chr(10)) - length(replace(:P1_MODEL||chr(10),chr(10),''));

  FOR i IN 1 .. l_count LOOP 
    mored_value := TRIM(REGEXP_SUBSTR(:P1_MODEL||chr(10), '[^'||chr(10)||']+', 1, i));
    INSERT INTO MONITOR.MORED (ID_MORED, ID_EMPLOYEE_FK, MODEL_MORED, STATUS)
    SELECT MONITOR.SEQ_MORED.NEXTVAL, :F102_ID_EMPLOYEE, mored_value, 1 
      FROM dual
     WHERE mored_value IS NOT NULL;
  END LOOP;

  :P1_MODEL := NULL;
  COMMIT;
END;



Правда пока не знаю что будет если в саму :P1_MODEL закинут больше 32000 символов.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / DBMS_SQL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]