Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Обработка исключений  [new]
lukyanov.a
Member

Откуда:
Сообщений: 10
Доброго времени суток.
Подскажите пожалуйста как в функции вывести сообщение о ошибке если какой-то из параметров не верен?

CREATE FUNCTION f_getJournalByOrg(@OrgId int)
RETURNS @JournalList TABLE(
	JRN_ID int PRIMARY KEY NOT NULL,
	JRN_NAME nvarchar(50) NULL,
	JRN_ORG_ID int NOT NULL,
	JRN_ORG_NAME nvarchar(50) NULL,
	JRN_ORG_ID_PRNT int NULL
)
AS
	BEGIN
		DECLARE @ISSET INT;
		SET @ISSET = (SELECT * FROM v_getOrgInfo WHERE v_getOrgInfo.ORG_ID = @OrgId); -- Смотрим есть ли в нашем справочнике организация с нужным нам ID если есть идём дальше
		IF  @ISSET IS NOT NULL
		BEGIN
				DECLARE @CNT INT;
				DECLARE @ORG INT;
				DECLARE @PRNT_ORG INT;
				
				SET @CNT = 0;
				SET @ORG = @OrgId;
				SET @PRNT_ORG = 0;
				
				WHILE @CNT = 0
					BEGIN
						SET @CNT = (SELECT COUNT(*)FROM v_getJournal WHERE v_getJournal.JRN_ORG_ID = @ORG)
						IF @CNT<>0 BEGIN BREAK END
							ELSE
								BEGIN
									SET @PRNT_ORG = (SELECT v_getOrgInfo.ORG_ID_PRNT FROM v_getOrgInfo WHERE v_getOrgInfo.ORG_ID = @ORG)
									IF @PRNT_ORG = NULL
										BEGIN 
										--тут тоже надо высти ошибку 
										END
										ELSE
											BEGIN
												SET @ORG = @PRNT_ORG;
											END
								END;	
					END;	
				INSERT @JournalList
					SELECT 
						dbo.v_getJournal.JRN_ID AS JRN_ID,
						dbo.v_getJournal.JRN_TTL AS JRN_TTL,
						dbo.v_getJournal.JRN_ORG_ID AS JRN_ORG_ID,
						dbo.v_getJournal.JRN_ORG_TTL AS JRN_ORG_TTL,
						dbo.v_getJournal.JRN_ORG_ID_PRNT AS JRN_ORG_ID_PRNT
					FROM dbo.v_getJournal
					WHERE dbo.v_getJournal.JRN_ORG_ID = @ORG
				RETURN	
		END
			ELSE 
				BEGIN
					-- А если нету таковой организации нам нужно вывести ошибку в этом месте
				END;
			
	END
	GO
9 окт 12, 15:56    [13291351]     Ответить | Цитировать Сообщить модератору
 Re: Обработка исключений  [new]
Jovanny
Member

Откуда:
Сообщений: 1195
RAISERROR("Нету таковой организации", 11, 1)
9 окт 12, 16:08    [13291443]     Ответить | Цитировать Сообщить модератору
 Re: Обработка исключений  [new]
Glory
Member

Откуда:
Сообщений: 104760
lukyanov.a
Подскажите пожалуйста как в функции вывести сообщение о ошибке если какой-то из параметров не верен?

Никак.
Возвращайте пустую таблицу
9 окт 12, 16:11    [13291470]     Ответить | Цитировать Сообщить модератору
 Re: Обработка исключений  [new]
LSV
Member [заблокирован]

Откуда: Киев
Сообщений: 30817
У нас сложные процедуры работают в транзакции. Чтобы получить список ошибок (бизнес-правил) после роллбека, сделали CLR-ф-цию, кот. выводит список в отдельную времянку. После отката т-ции список не пропадает (например список товаров, не соотв. к-л правилу).
9 окт 12, 16:24    [13291563]     Ответить | Цитировать Сообщить модератору
 Re: Обработка исключений  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
LSV
У нас сложные процедуры работают в транзакции. Чтобы получить список ошибок (бизнес-правил) после роллбека, сделали CLR-ф-цию, кот. выводит список в отдельную времянку. После отката т-ции список не пропадает (например список товаров, не соотв. к-л правилу).
мне интересно, а чем RAISERROR не устроил?
9 окт 12, 20:21    [13292599]     Ответить | Цитировать Сообщить модератору
 Re: Обработка исключений  [new]
lukyanov.a
Member

Откуда:
Сообщений: 10
Jovanny, Mind
Msg 443, Level 16, State 14, Procedure f_getJournalByOrg, Line 51
Invalid use of a side-effecting operator 'RAISERROR' within a function.
9 окт 12, 22:27    [13292862]     Ответить | Цитировать Сообщить модератору
 Re: Обработка исключений  [new]
lukyanov.a
Member

Откуда:
Сообщений: 10
Glory, подскажите пожалуйста как вернуть пустую таблицу, а то видать мозгов не хватает....вроде документацию читал...
9 окт 12, 22:27    [13292868]     Ответить | Цитировать Сообщить модератору
 Re: Обработка исключений  [new]
lukyanov.a
Member

Откуда:
Сообщений: 10
LSV, я так понимаю CLR функции необходимы для рекурсивного метода поэтому для этого используются временные таблицы. у меня задача получить только верхний уровень(если на верхнем нету, то идёт ещё выще)
9 окт 12, 22:32    [13292877]     Ответить | Цитировать Сообщить модератору
 Re: Обработка исключений  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
1
автор
. IF @PRNT_ORG = NULL
BEGIN
--тут тоже надо высти ошибку
END

Вообще странно минимум должно быть

 IF @PRNT_ORG IS NULL

И почему вот ету проверку не сделать до вызоыва ф-ции ?
автор
(SELECT v_getOrgInfo.ORG_ID_PRNT FROM v_getOrgInfo WHERE v_getOrgInfo.ORG_ID = @ORG)

Тогда не нужон весь огород
9 окт 12, 23:34    [13293033]     Ответить | Цитировать Сообщить модератору
 Re: Обработка исключений  [new]
lukyanov.a
Member

Откуда:
Сообщений: 10
Maxx, Это всё сделается в процессе оптимизации....сейчас мне нужно решить задача по выводу ошибки или же пустой таблицы...
10 окт 12, 07:12    [13293538]     Ответить | Цитировать Сообщить модератору
 Re: Обработка исключений  [new]
Guf
Member

Откуда: Новосибирск
Сообщений: 647
lukyanov.a
подскажите пожалуйста как вернуть пустую таблицу, а то видать мозгов не хватает....вроде документацию читал...

CREATE FUNCTION [dbo].[f_getJournalByOrg](@OrgId int)
RETURNS @JournalList TABLE(
	JRN_ID int PRIMARY KEY NOT NULL
)
AS
BEGIN
IF @OrgId = 1
BEGIN
    INSERT @JournalList SELECT 1;
    RETURN;
END
ELSE
    INSERT @JournalList SELECT 1 WHERE 1 = 0;
    RETURN;
END;
10 окт 12, 09:08    [13293720]     Ответить | Цитировать Сообщить модератору
 Re: Обработка исключений  [new]
Glory
Member

Откуда:
Сообщений: 104760
lukyanov.a
Glory, подскажите пожалуйста как вернуть пустую таблицу, а то видать мозгов не хватает....вроде документацию читал...

Мда. Просто не заполняйте данными таблицу, которую уже и так возвращает ваша функция.
10 окт 12, 09:10    [13293727]     Ответить | Цитировать Сообщить модератору
 Re: Обработка исключений  [new]
Jovanny
Member

Откуда:
Сообщений: 1195
lukyanov.a
Jovanny, Mind
Msg 443, Level 16, State 14, Procedure f_getJournalByOrg, Line 51
Invalid use of a side-effecting operator 'RAISERROR' within a function.

Извините, невнимательно прочитал вопрос. В пользовательских функциях RAISERROR неприменим.
10 окт 12, 09:34    [13293784]     Ответить | Цитировать Сообщить модератору
 Re: Обработка исключений  [new]
PaulYoung
Member

Откуда: Москва
Сообщений: 2551
lukyanov.a, а Вы код своей функции вообще смотрели? Он ведь у Вас совсем не рабочий...
10 окт 12, 10:04    [13293944]     Ответить | Цитировать Сообщить модератору
 Re: Обработка исключений  [new]
lukyanov.a
Member

Откуда:
Сообщений: 10
PaulYoung,

Вот рабочий вариант:
CREATE FUNCTION f_getJournalByOrg(@OrgId int)
RETURNS @JournalList TABLE(
JRN_ID int PRIMARY KEY NOT NULL,
JRN_NAME nvarchar(50) NULL,
JRN_ORG_ID int NOT NULL,
JRN_ORG_NAME nvarchar(50) NULL,
JRN_ORG_ID_PRNT int NULL
)
AS
BEGIN
DECLARE @CNT INT;
DECLARE @ORG INT;
DECLARE @PRNT_ORG INT;

SET @CNT = 0;
SET @ORG = @OrgId;
SET @PRNT_ORG = 0;

WHILE @CNT = 0
BEGIN
SET @CNT = (SELECT COUNT(*)FROM v_getJournal WHERE v_getJournal.JRN_ORG_ID = @ORG)
IF @CNT<>0 BEGIN BREAK END
ELSE
BEGIN
SET @PRNT_ORG = (SELECT v_getOrgInfo.ORG_ID_PRNT FROM v_getOrgInfo WHERE v_getOrgInfo.ORG_ID = @ORG)
IF @PRNT_ORG = NULL BEGIN BREAK END
ELSE
BEGIN
SET @ORG = @PRNT_ORG;
END
END;
END;
INSERT @JournalList
SELECT
dbo.v_getJournal.JRN_ID AS JRN_ID,
dbo.v_getJournal.JRN_TTL AS JRN_TTL,
dbo.v_getJournal.JRN_ORG_ID AS JRN_ORG_ID,
dbo.v_getJournal.JRN_ORG_TTL AS JRN_ORG_TTL,
dbo.v_getJournal.JRN_ORG_ID_PRNT AS JRN_ORG_ID_PRNT
FROM dbo.v_getJournal
WHERE dbo.v_getJournal.JRN_ORG_ID = @ORG

RETURN
END
GO

Но когда @OrgId не существуует запрос висит
10 окт 12, 11:57    [13294693]     Ответить | Цитировать Сообщить модератору
 Re: Обработка исключений  [new]
PaulYoung
Member

Откуда: Москва
Сообщений: 2551
lukyanov.a, пользуйтесь тегом SRC. А по существу, у Вас, вероятно, возникает бесконечный цикл...
10 окт 12, 12:12    [13294808]     Ответить | Цитировать Сообщить модератору
 Re: Обработка исключений  [new]
PaulYoung
Member

Откуда: Москва
Сообщений: 2551
PaulYoung, да, и ещё совет: перепишите своё изделие, выкинув все циклы. Удивитесь результату.
10 окт 12, 12:15    [13294844]     Ответить | Цитировать Сообщить модератору
 Re: Обработка исключений  [new]
lukyanov.a
Member

Откуда:
Сообщений: 10
PaulYoung,

у меня задача получить только верхний уровень(если на верхнем нету, то идёт ещё выще)


Как тут без циклов обойтись ?
10 окт 12, 12:18    [13294870]     Ответить | Цитировать Сообщить модератору
 Re: Обработка исключений  [new]
PaulYoung
Member

Откуда: Москва
Сообщений: 2551
lukyanov.a
PaulYoung,

у меня задача получить только верхний уровень(если на верхнем нету, то идёт ещё выще)


Как тут без циклов обойтись ?
если правильно Вас понял, то для 2005, примеры Г, Д, Е
10 окт 12, 12:24    [13294927]     Ответить | Цитировать Сообщить модератору
 Re: Обработка исключений  [new]
lukyanov.a
Member

Откуда:
Сообщений: 10
Всем спасибо! проблема вроде решена.

з.Ы. кому интересно вот код

IF OBJECT_ID(N'f_getJournalByOrg',N'TF') IS NOT NULL
	DROP FUNCTION f_getJournalByOrg;
GO

CREATE FUNCTION f_getJournalByOrg(@OrgId int)
RETURNS @JournalList TABLE(
	JRN_ID int PRIMARY KEY NOT NULL,
	JRN_NAME nvarchar(255) NULL,
	JRN_ORG_ID int NOT NULL,
	JRN_ORG_NAME nvarchar(255) NULL,
	JRN_ORG_ID_PRNT int NULL
)
AS
BEGIN
	DECLARE @ISSET INT
	SET @ISSET = (SELECT v_getOrgInfo.ORG_ID FROm v_getOrgInfo WHERE v_getOrgInfo.ORG_ID = @OrgId);
	IF @ISSET IS NOT NULL
	BEGIN
		
		DECLARE @CNT INT;
		DECLARE @ORG INT;
		DECLARE @PRNT_ORG INT;
		
		SET @CNT = 0;
		SET @ORG = @OrgId;
		SET @PRNT_ORG = 0;
			
		WHILE @CNT = 0
			BEGIN
				SET @CNT = (SELECT COUNT(*)FROM v_getJournal WHERE v_getJournal.JRN_ORG_ID = @ORG);
				IF @CNT<>0 BEGIN BREAK END
					ELSE
						BEGIN
							SET @PRNT_ORG = (SELECT v_getOrgInfo.ORG_ID_PRNT FROM v_getOrgInfo WHERE v_getOrgInfo.ORG_ID = @ORG)
							IF @PRNT_ORG IS NOT NULL SET @ORG = @PRNT_ORG ELSE BREAK
						END;	
			END;	
		INSERT @JournalList
			SELECT 
				dbo.v_getJournal.JRN_ID AS JRN_ID,
				dbo.v_getJournal.JRN_TTL AS JRN_TTL,
				dbo.v_getJournal.JRN_ORG_ID AS JRN_ORG_ID,
				dbo.v_getJournal.JRN_ORG_TTL AS JRN_ORG_TTL,
				dbo.v_getJournal.JRN_ORG_ID_PRNT AS JRN_ORG_ID_PRNT
			FROM dbo.v_getJournal
			WHERE dbo.v_getJournal.JRN_ORG_ID = @ORG
	END
RETURN;
END;
GO
10 окт 12, 13:09    [13295374]     Ответить | Цитировать Сообщить модератору
 Re: Обработка исключений  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
0. Пишите деларативно. (никаких циклов, ветвлений, промежуточных переменных, ваааще)
1. Всегда пишите имя схемы (dbo.)
2. Всегда пишите алиасы в запросах
3. Изучаем синтаксис языка, на котором пишем, постоянно
4. Забываем вредные привычки пришедшие из других языков

CREATE FUNCTION [dbo].[f_getJournalByOrg] (
	 @OrgId	Int
) RETURNS TABLE AS RETURN
WITH OrgAncestors AS (
	SELECT	 0	AS [Level]
		,O.ORG_ID
		,O.ORG_ID_PRNT
	FROM	dbo.v_getOrgInfo	O
	WHERE	O.ORG_ID = @OrgId
UNION ALL
	SELECT	 [Level] + 1
		,O.ORG_ID
		,O.ORG_ID_PRNT
	FROM	     OrgAncestors	A
		JOIN dbo.v_getOrgInfo	O ON O.ORG_ID = A.ORG_ID_PRNT
)	SELECT	Top(1) WITH TIES
		 J.JRN_ID
		,J.JRN_TTL
		,J.JRN_ORG_ID
		,J.JRN_ORG_TTL
		,J.JRN_ORG_ID_PRNT
	FROM	     OrgAncestors	O
		JOIN dbo.v_getJournal	J ON J.JRN_ORG_ID = O.ORG_ID
	ORDER BY O.[Level]
GO
Ошибки обрабатываеются или в процежурах или на клиенте.
Этот вид ошибок лучше на клиенте обработать, такова их природа.

Список предков нужно оформить в отдельной функции, а данный запрос на ней завязать. Показать эту обязательную элементарщину?

PS: Если не умеете писать декларативно, собирайте шмотки и алга в другую профессию. Это не обсуждается. Астралопитекам пора уже вымирать.
10 окт 12, 13:28    [13295568]     Ответить | Цитировать Сообщить модератору
 Re: Обработка исключений  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
lukyanov.a,

О девушк.
Им обычно ваще на всё нас....ать

Из старого анекдота
Порутчик, выходя на балкон:
- Если она обоср.... валите всё на меня


PS: Да, да, всё именно так и выглядит, если снять розовые очки.
10 окт 12, 13:33    [13295608]     Ответить | Цитировать Сообщить модератору
 Re: Обработка исключений  [new]
lukyanov.a
Member

Откуда:
Сообщений: 10
Mnior,

0. Пишите деларативно. (никаких циклов, ветвлений, промежуточных переменных, ваааще)
3. Изучаем синтаксис языка, на котором пишем, постоянно

Это моя первая функция на sql

1. Всегда пишите имя схемы (dbo.)

Хорошо, обязательно запомню...

2. Всегда пишите алиасы в запросах

Забыл тут их использовать...каюсь)))

4. Забываем вредные привычки пришедшие из других языков


Это какие ? не совсем понял Вас
10 окт 12, 13:52    [13295778]     Ответить | Цитировать Сообщить модератору
 Re: Обработка исключений  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
lukyanov.a
4. Забываем вредные привычки пришедшие из других языков
Это какие ? не совсем понял Вас
К примеру:
lukyanov.a
DECLARE @ISSET INT;
SET @ISSET = (SELECT * FROM v_getOrgInfo WHERE v_getOrgInfo.ORG_ID = @OrgId);
IF  @ISSET IS NOT NULL;
IsSet - это откуда, запихивать результат в Set, а потом проверять его наличие?
ПэХаПэ?
10 окт 12, 15:50    [13296960]     Ответить | Цитировать Сообщить модератору
 Re: Обработка исключений  [new]
lukyanov.a
Member

Откуда:
Сообщений: 10
Mnior, Проверка на существование переменной мне кажется в любом языке есть
10 окт 12, 22:00    [13299153]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить