Форум программистов, компьютерный форум, киберфорум
Oracle
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/25: Рейтинг темы: голосов - 25, средняя оценка - 4.88
Shiningemerald
384 / 117 / 22
Регистрация: 05.01.2012
Сообщений: 951
1

"невозможно выполнение операции DML внутри запроса"

09.11.2016, 21:59. Показов 5196. Ответов 2

Author24 — интернет-сервис помощи студентам
Добрый вечер!
Обращаюсь к более опытным товарищам со следующей проблемой:
Передо мной стояла задача поместить содержимое нескольких*.rtf файлов в CLOBы и добавить новые строки в таблицу.

Для реализации данной задачи соответствующие файлы помещены на сервер Oracle, написан метод для их чтения и записи в CLOBы на java, написана функция для вызова этого метода.

То, что написано на java(чтение файлов работает, запись в CLOB работает):
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED BPTL.RTF_PARSER as import java.io.*;
import java.sql.*;
import java.util.*;
import java.text.*;
import oracle.jdbc.OracleDriver;
import oracle.sql.CLOB;
import oracle.sql.BLOB;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.OutputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.FileNotFoundException;
import java.io.UnsupportedEncodingException;
import java.io.RandomAccessFile;
 
 
public class RTF_PARSER
{
 
  public static oracle.sql.CLOB maint(String rtffile) throws Exception
  {
   //String cmd = "begin ? := bptl.P_CUP.RTF_PARSER(?); end;";
   //oracle.jdbc.OracleCallableStatement stmt = (oracle.jdbc.OracleCallableStatement)conn.prepareCall(cmd);
   Connection conn = (new OracleDriver()).defaultConnection();
   conn.setAutoCommit(false);
   CLOB tmpClob = CLOB.createTemporary(conn, false, CLOB.DURATION_SESSION);
   for (int i = 0; i < 5; i++)
   {FileInputStream body =new FileInputStream("/D/dmp/S/"+i+".rtf");
   byte[] bufferbody = new byte[body.available()];
   Writer writer = tmpClob.setCharacterStream(0L); //setCharacterStream(0L);
 
   int length1;
   while ((length1 = body.read(bufferbody, 0, bufferbody.length)) != -1)
        {
        writer.write(new String(bufferbody, 0, length1));
        }
   String searchWord = rtffile;
   //CallableStatement cs
   //oracle.jdbc.OracleCallableStatement stmt = (oracle.jdbc.OracleCallableStatement)conn.prepareCall("BEGIN INSERT INTO BPTL.GENERALAC gac (gac.AC_NUM, gac.AC_CARD) VALUES ("+i+", "+tmpClob+")END;");
   oracle.jdbc.OraclePreparedStatement stmt =(oracle.jdbc.OraclePreparedStatement)conn.prepareCall ("BEGIN INSERT INTO BPTL.GENERALAC gac (gac.AC_NUM, gac.AC_CARD) VALUES (?, ?); END;");
   stmt.setInt(1, i);
   stmt.setClob(2, tmpClob);
   stmt.executeQuery();
   }
 
 
return  tmpClob;
  }
  }
/
Функция на PLSQL:
Oracle 11 SQL
1
2
3
4
FUNCTION rtf_parser (
 rtffile IN VARCHAR2
) RETURN 
CLOB AS LANGUAGE JAVA NAME 'RTF_PARSER.maint(java.lang.String) return java.lang.String';
Вызов функции(на строку, которая передается в качестве параметра можно не обращать внимания, она роли не играет):
Oracle 11 SQL
1
SELECT  P_CUP.rtf_parser(' N ') FROM DUAL
Идея такая, что во время выполнения java-метода будут добавляться записи в таблицу.
Однако, я что-то не так делаю и при вызове функции пишет "невозможно выполнение операции DML внутри запроса"
Помогите, пожалуйста прозреть!
Спасибо заранее!

Добавлено через 24 минуты
Иными словами мне нужно понять:
1) правильно ли написан INSERT в java (JDBC)...и как правильно написать если неверно.
2) "невозможно выполнение операции DML внутри запроса" почему?
3) возможно ли выполнить java-метод отдельно? может выдает сообщение из-за вызова через функцию?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.11.2016, 21:59
Ответы с готовыми решениями:

ORA-14551: невозможно выполнение операции DML внутри запроса
Всем привет. Столкнулся с ошибкой ORA-14551: невозможно выполнение операции DML внутри запроса ...

Выполнение данной операции во время изменения размеров автозаполняемого столбца невозможно
Здравствуйте! Подскажите решение получаемой ошибки. У меня есть главная форма, на ней из...

Поиск и выполнение операции с текстом внутри тега
Здравствуйте, нужна помощь. Я написал класс, поиска тега и подготовку (по тегу) текста для...

Выполнение LINQ-запроса внутри условного оператора
Подскажите, как сделать простую вещь - выполнить LINQ-запрос внутри условного оператора: If md...

2
Модератор
4217 / 3058 / 583
Регистрация: 21.01.2011
Сообщений: 13,205
10.11.2016, 09:52 2
Лучший ответ Сообщение было отмечено Electroflower как решение

Решение

Цитата Сообщение от Electroflower
невозможно выполнение операции DML внутри запроса" почему?
По моему это должно быть очевидно. SELECT - это чтение данных, а не их изменение. Поэтому на функции, вызываемые из SELECT, накладывается ряд ограничений.
С другой стороны, никто не обязывает вызывать функцию из SELECT, вполне можно из блока PL/SQL
1
Shiningemerald
384 / 117 / 22
Регистрация: 05.01.2012
Сообщений: 951
10.11.2016, 23:02  [ТС] 3
Grossmeister, Спасибо большое! Помогло!

Решение: для вызова java-метода с DML можно создать процедуру с обращением к java и вызвать эту процедуру.

Например процедура для вызова моего метода :
Oracle 11 SQL
1
2
CREATE OR REPLACE PROCEDURE BPTL.PROCEDCALL AS language JAVA name 'RTF_PARSER.maint()';
/
Вызов:
Oracle 11 SQL
1
2
3
BEGIN 
PROCEDCALL;
END;
Думаю, тему можно считать закрытой!:3
0
10.11.2016, 23:02
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.11.2016, 23:02
Помогаю со студенческими работами здесь

DML операции в parallel процедуре
Не могу заставить работать dml в процедуре. Приведу упрощённый пример всего что я делаю: create...

Выполнение запроса и построитель выражений. Поля появляются, а значения не вытягивает в поля запроса
Запрос НАРАХОВАНО Поля для значений появляются, а значения не вытягивает в поля запроса, нужное не...

Access2K - выполнение данной макрокоманды в данный момент невозможно
%Subj% Кто-нибудь получал такое сообщение и как с ним боролся?

Невозможно разместить заголовок внутри блока
Всем привет! Имеется контейнер шириной 1170 px, расположен по центру страницы. Но один элемент,...

Невозможно завершение операции. Подсистема печати недоступна
При повторной установке принтера вообще не видит и выдаёт окно &quot;Невозможно завершение операции....

Не удалось установить принтер. Невозможно завершение операции
Всем привет! Ситуация такая. На компьютере установлена Windows XP SP3 После какого-то глюка,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru