Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как из вложенной процедуры, в случае эксепшена, получить out параметры?  [new]
_Наталья
Member

Откуда:
Сообщений: 26
Есть две процеды.
Первая в работе вызывает процедуру в оракле, если вернулось удовлетворяющие условие, вызывает вторую процедуру, иначе эксепшн.
Вторая процедура:
ALTER PROCEDURE [dbo].[create_jur_tariff_contract]                                                  
 (@p_account_id integer 
 @p_packet integer = 0,
 @sr_user   varchar(255),  
 @result integer out,   
 @V varchar(4000) out)                      
                      
 WITH EXECUTE AS CALLER                                                              
 AS                                                                                                             
 BEGIN TRY                                 
 SET NOCOUNT ON;          
 SET XACT_ABORT ON;
 SET IMPLICIT_TRANSACTIONS OFF;        
         
                                                     
 BEGIN TRANSACTION create_jur_tariff_contract                                                                                            
    EXEC ('выполнение процедуры в оракле'                                                            
    , @result out, @V out) AT test1;                                                    
    IF @V IS NOT NULL     
        begin                         
	    RAISERROR(@V, 16, 1)
        end;
    ELSE                      
        begin
	    COMMIT TRANSACTION create_jur_tariff_contract                                       
        end;
 END TRY                                                      
                                   
 BEGIN CATCH 
     ROLLBACK TRANSACTION create_jur_tariff_contract                                                                              
 END CATCH;

во второй процедуре при обработке процедуры в оракле переменная @V возвращается не пустая, вылетает в CATCH и таким же образом вылетает в CATCH и первая процедура.
Вроде все корректно, но как мне теперь получить @V из второй процедуры в первой? Там текст ошибки.
Вот так я из первой процедуры вызываю вторую:
DECLARE @tar_id INTEGER, @Vtar VARCHAR(4000)   
EXEC create_jur_tariff_contract @result, @tariff_package, @sr_user, @result=@tar_id OUT, @V=@Vtar OUT
7 июл 12, 17:04    [12833621]     Ответить | Цитировать Сообщить модератору
 Re: Как из вложенной процедуры, в случае эксепшена, получить out параметры?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37200
Через параметры никак. При исключении не будет ни out-параметров, ни return. Пишите в таблицу.

Вам, похоже, можно получить ваше @v через error_message().
7 июл 12, 17:19    [12833642]     Ответить | Цитировать Сообщить модератору
 Re: Как из вложенной процедуры, в случае эксепшена, получить out параметры?  [new]
_Наталья
Member

Откуда:
Сообщений: 26
Как так может быть, что из второй процедуры SELECT ERROR_MESSAGE() возращает настоящую ошибку, а из первой:
"Cannot roll back create_jur_tariff_contract. No transaction or savepoint of that name was found."?
Ведь ошибка с вложенной процедуры должна была попасть в CATCH основной?
7 июл 12, 18:37    [12833806]     Ответить | Цитировать Сообщить модератору
 Re: Как из вложенной процедуры, в случае эксепшена, получить out параметры?  [new]
flexgen
Member

Откуда: Город на песке
Сообщений: 834
_Наталья
Как так может быть, что из второй процедуры SELECT ERROR_MESSAGE() возращает настоящую ошибку, а из первой:
"Cannot roll back create_jur_tariff_contract. No transaction or savepoint of that name was found."?
Ведь ошибка с вложенной процедуры должна была попасть в CATCH основной?


А можно текст обоих процедур на T-SQL? А то гадание на хрустальном шаре получается.
7 июл 12, 21:56    [12834252]     Ответить | Цитировать Сообщить модератору
 Re: Как из вложенной процедуры, в случае эксепшена, получить out параметры?  [new]
Glory
Member

Откуда:
Сообщений: 104751
_Наталья
Ведь ошибка с вложенной процедуры должна была попасть в CATCH основной?

С чего вдруг ? Ошибка уже перехвачена во вложенной процедуре.
8 июл 12, 10:45    [12835132]     Ответить | Цитировать Сообщить модератору
 Re: Как из вложенной процедуры, в случае эксепшена, получить out параметры?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
_Наталья
 BEGIN CATCH 
     ROLLBACK TRANSACTION create_jur_tariff_contract                                                                              
 END CATCH;
Cannot roll back create_jur_tariff_contract. No transaction or savepoint of that name was found.
Человек наивно верит что можно откатить вложенную транзакцию.
Наталья, откатить можно или всё или до SAVE PONT-а.
Так что не употребляйте такой синтаксис - никогда.

PS: Уберите эти пробелы в коде, как-то негоже быть поросёнком, особенно девушке.
+ Как?
Сделайте Reaplace (Ctrl+R кажется). Включите Regular Expresion и замените [ \t]+$ на пустоту.
8 июл 12, 23:29    [12836403]     Ответить | Цитировать Сообщить модератору
 Re: Как из вложенной процедуры, в случае эксепшена, получить out параметры?  [new]
_Наталья
Member

Откуда:
Сообщений: 26
Первая процедура:
ALTER PROCEDURE create_account 
 (@id INTEGER,
 @tariff_package INTEGER,
 @type varchar(1),
 @sr_user VARCHAR(max) 
 )
AS
BEGIN TRY 
  --set xact_abort on 
  SET NOCOUNT ON; 
  SET IMPLICIT_TRANSACTIONS OFF;
  BEGIN TRANSACTION create_acc_in_ora
  BEGIN
  DECLARE @V varchar(4000), @result integer
   EXEC ('/*кусочек работы в оракле*/ 
     EXCEPTION WHEN OTHERS THEN 
    V:=SQLCODE || '' '' || SQLERRM; 
    select V into ? from DUAL; 
     END;' 
    , @result OUTPUT, @V out) AT test1; 
   IF @V IS NOT NULL 
	RAISERROR(@V, 16, 1);
   ELSE 
   BEGIN     
    IF @result IS NOT NULL 
		declare @tar_id integer, @Vtar varchar(4000)   
		if @type = 'J'
			EXEC create_jur_tariff_contract @result, @tariff_package, @sr_user, @result=@tar_id out, @V=@Vtar out;
		if @type = 'P'
			EXEC create_phys_tariff_contract @result, @tariff_package, @sr_user, @result=@tar_id out, @V=@Vtar out;
	END;
	COMMIT TRANSACTION create_acc_in_ora 
	END; 
END TRY

BEGIN CATCH 
  ROLLBACK TRANSACTION create_acc_in_ora 
END CATCH;

Текст второй в первом посте.
Необходимо в первую процедуру, в случае эксепшена второй процедуры, передать текст ошибки. Как это сделать?
Откатить необходимо все действия второй и первой процедуры.
9 июл 12, 14:10    [12838757]     Ответить | Цитировать Сообщить модератору
 Re: Как из вложенной процедуры, в случае эксепшена, получить out параметры?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
_Наталья
Откатить необходимо все действия второй и первой процедуры.
Ну а что вы пишете:
-- Во второй
ROLLBACK TRANSACTION create_jur_tariff_contract
-- В первой
ROLLBACK TRANSACTION create_acc_in_ora
Что как бэ намекает даже человеку в клетчатом плете.
Нет?

Что вам непонятно из этого (12836403) поста?
Вот про синтаксис команд аля ROLLBACK. Цитирую:
BOL
Аргументы

transaction_name
        Имя, присвоенное транзакции в BEGIN TRANSACTION. Имя transaction_name должно соответствовать правилам для
идентификаторов, однако используются только первые 32 символа имени транзакции. При вложении транзакций
аргумент transaction_name должен быть именем транзакции из самой внешней инструкции BEGIN TRANSACTION.

savepoint_name
savepoint_name из инструкции SAVE TRANSACTION. Имя savepoint_name должно соответствовать правилам для идентификаторов.
Используйте аргумент savepoint_name, если откат по условию должен влиять только на часть транзакции.
Но главное это:
BOL
Инструкция ROLLBACK TRANSACTION без аргумента savepoint_name или transaction_name откатывает изменения на начало транзакции.

Инструкция ROLLBACK TRANSACTION не может ссылаться на аргумент savepoint_name в распределенных транзакциях, запущенных явно с помощью инструкции BEGIN DISTRIBUTED TRANSACTION или вызванных из локальной транзакции.
Ну как разжевал как 3х летней, вы довольны? вопить не будете?
Или вам надо сразу решеине для вашего случая? чтоб не думать

При такой ошибочной "архитектуре" процедур вам ничего не сделать. Надо менять подход.
9 июл 12, 17:07    [12840150]     Ответить | Цитировать Сообщить модератору
 Re: Как из вложенной процедуры, в случае эксепшена, получить out параметры?  [new]
_Наталья
Member

Откуда:
Сообщений: 26
Мне понятно, спасибо.
10 июл 12, 11:26    [12843421]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить