2015-04-21 6 views
0

Это часть моего кода Java построения функции в анонимном PLSQL блока:Оказывает ли оракул SGBD запросы анонимного PLSQL в том же порядке?

*String p ="FUNCTION get_result RETURN varchar2 AS " 
+"BEGIN " 
+"sql_error:='ok';" 
+query1+";" 
+query2+";" 
+query3+";" 
+"COMMIT;" 
+"RETURN sql_error; " 
+"EXCEPTION " 
+"when others then " 
+"ROLLBACK;" 
+"end;";* 

где опрашивает 1,2 и 3 SQL запросов; иногда query2 не выполняется, и это не создает ошибку транзакции и запросы 1 и 3 и не передается. Я хотел бы знать, как это возможно, и как я могу его исправить. Я также хотел бы знать, какая процедура лучше между вызовом анонимных заявлений блока и statement.addBatch

Я хочу знать, как управлять сеансами, которые выполняют транзакции, манипулировать много последовательностей. Я обнаружил, что использование многих транзакций в транзакции вызывает ошибки, которые oracle не отправляет обратно пользователю. Они иногда получают одинаковое значение для 2 исполнений на sequence.nextval? спасибо

+1

Это функция, а не анонимный блок; но да для обоих операторов в PL/SQL-блоке всегда будут выполняться в том же порядке. Ваш запрос2 всегда выполняется, если функция вызывается с этим определением. (Это действительно странный дизайн, BTW). Не зная ничего о операторах или данных, или когда вызывается этот код или функция, невозможно сказать, почему вам кажется, что он не выполняется. –

+0

Может ли Oracle использовать много потоков для выполнения процедуры? – ValerieMT

+0

Вы имеете в виду выполнение одной и той же процедуры одновременно с нескольких клиентских сеансов? Да. Или использовать потоки внутри, выполняя один экземпляр? Я так думаю, возможно, в разных масштабах на разных платформах. Каждый вызов будет логически неповрежденным, хотя операторы в блоке будут выполняться в указанном вами порядке. Вы могли видеть, по-видимому, странные вещи от одновременных вызовов, в зависимости от того, что делает процедура, и если/когда она совершает, например. –

ответ

0

Я видел ошибку, которую создавал. Фактически, все запросы не были в одной транзакции, из-за того, что я использовал статический атрибут, который собирал запросы различных транзакций и отправлял их в оракул SGBD через анонимный plsql.

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