Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.03.2012, 13:37   #1
mrChester
Я
Форумчанин
 
Аватар для mrChester
 
Регистрация: 24.04.2010
Сообщений: 693
По умолчанию Вложенная функция

Нужен пример создания вложенной функции.
Суть задачи. Имеется хранимая процедура, мягко говоря не простая. Так вот внутри процедуры мне нужно создать функцию, синтаксиса не знаю, может у кого есть под рукой пример?
Все персонажи вымышлены, все совпадения случайны.
Если жизнь игра, тогда я её разработчик ©.
mrChester вне форума Ответить с цитированием
Старый 23.03.2012, 15:25   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

СУБД какая?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 26.03.2012, 12:57   #3
mrChester
Я
Форумчанин
 
Аватар для mrChester
 
Регистрация: 24.04.2010
Сообщений: 693
По умолчанию

MSSQL. Уже конечно не так важно, обошелся. Хотя все равно пригодилось бы
Все персонажи вымышлены, все совпадения случайны.
Если жизнь игра, тогда я её разработчик ©.
mrChester вне форума Ответить с цитированием
Старый 26.03.2012, 14:34   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Вот пару работающих примеров бросил для MSSQL2000. Но создаются не внутри процедуры. Внутри процедуры создавать из того что знаю нельзя (или не знаю как) Обращаться из запроса или хранимой процедуры или функции нет проблем. Обычно так dbo.uf_TestTaraAvt(параметры через запятую)
Код:
IF EXISTS (SELECT name FROM sysobjects WHERE name='uf_TestTaraAvt' AND type='FN') DROP FUNCTION uf_TestTaraAvt
GO
CREATE FUNCTION uf_TestTaraAvt (@Koment varchar,@TaraText varchar,@TaraId int,@PlanId int) RETURNS tinyint AS
BEGIN
  DECLARE @Result tinyint
  IF COALESCE(@Koment,'')<>'' OR COALESCE(@TaraText,'')<>'' SET @Result=1
  ELSE IF COALESCE(@TaraId,0)=0 SET @Result=NULL
  ELSE IF EXISTS(SELECT *
    FROM Product T1,AvtPlanProd D,Product P,Product T2
    WHERE T1.Prod_Id=@TaraId AND
          D.AvtPlan_Id=@PlanId AND
          D.Prod_Id=P.Prod_Id AND
          P.Tara_Id=T2.Prod_Id AND 
          ((T1.Uroven=1 AND T2.Uroven>=1 AND T1.Kod_Osn=T2.Kod_Osn) OR
           (T1.Uroven=2 AND T2.Uroven>=2 AND T1.Kod_Osn=T2.Kod_Osn AND T1.Kod_Dp1=T2.Kod_Dp1) OR
           (T1.Uroven=3 AND T2.Uroven>=3 AND T1.Kod_Osn=T2.Kod_Osn AND T1.Kod_Dp1=T2.Kod_Dp1 AND T1.Kod_Dp2=T2.Kod_Dp2) OR
           (T1.Uroven=4 AND T2.Uroven>=4 AND T1.Kod_Osn=T2.Kod_Osn AND T1.Kod_Dp1=T2.Kod_Dp1 AND T1.Kod_Dp2=T2.Kod_Dp2 AND T1.Kod_Dp3=T2.Kod_Dp3) OR
           (T1.Prod_Id=T2.Prod_Id))) SET @Result=NULL
  ELSE SET @Result=1
  RETURN(@Result)
END
GO
Код:
IF EXISTS (SELECT name FROM sysobjects WHERE name='uf_CalcBlock' AND type='FN') DROP FUNCTION uf_CalcBlock
GO
CREATE FUNCTION uf_CalcBlock (@Block smallint,@Pril varchar(6),@PrilDop varchar(20)) RETURNS smallint AS
BEGIN
  DECLARE @res smallint,
          @i int,
          @s varchar(20)
  IF @Block IS NULL OR @Block<1 SET @res=0
  ELSE IF @Block IN (1,2,3) SET @res=@Block
  ELSE IF LTRIM(RTRIM(@Pril))='7' SET @res=6
  ELSE IF @PrilDop IS NULL SET @res=4
  ELSE BEGIN
    SET @s=LTRIM(RTRIM(@PrilDop))
    SET @i=CHARINDEX('.',@s)
    IF @i=0 SET @res=4
    ELSE BEGIN
      SET @s=LTRIM(RTRIM(RIGHT(@s,LEN(@s)-@i)))
      SET @i=CHARINDEX('.',@s)
      IF @i=0 BEGIN
        IF @s='200' SET @res=5
        ELSE SET @res=4
      END 
      ELSE IF RTRIM(LEFT(@s,@i-1))='200' SET @res=5
      ELSE BEGIN 
        SET @s=LTRIM(RIGHT(@s,LEN(@s)-@i))
        SET @i=CHARINDEX('.',@s)
        IF @i>0 SET @s=RTRIM(LEFT(@s,@i-1))
        IF LEN(@s)=3 AND @s BETWEEN '200' AND '299' SET @res=5
        ELSE IF @s='300' SET @res=6
        ELSE SET @res=4
      END  
    END  
  END
  RETURN(@res)
END
GO
Почитать можно здесь http://msdn.microsoft.com/ru-ru/libr...sql.90%29.aspx
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 26.03.2012 в 14:42.
Аватар вне форума Ответить с цитированием
Старый 27.03.2012, 09:39   #5
mrChester
Я
Форумчанин
 
Аватар для mrChester
 
Регистрация: 24.04.2010
Сообщений: 693
По умолчанию

Ну таких примеров у меня тоже достаточно. Я думал, что можно создать именно внутри процедуры.
В общем понятно, спасибо+
Все персонажи вымышлены, все совпадения случайны.
Если жизнь игра, тогда я её разработчик ©.
mrChester вне форума Ответить с цитированием
Старый 28.03.2012, 02:41   #6
=master=
Форумчанин
 
Регистрация: 26.03.2012
Сообщений: 665
По умолчанию

В принципе функцию можно создать кодом процедуры, но что значит по вашему "вложенная", не понятно.
=master= вне форума Ответить с цитированием
Старый 28.03.2012, 10:33   #7
mrChester
Я
Форумчанин
 
Аватар для mrChester
 
Регистрация: 24.04.2010
Сообщений: 693
По умолчанию

По-моему вложенная означает временная, которая создается внутри другой функции или процедуры. Как еще выразиться? Локальная может больше подойдет
Все персонажи вымышлены, все совпадения случайны.
Если жизнь игра, тогда я её разработчик ©.
mrChester вне форума Ответить с цитированием
Старый 28.03.2012, 11:19   #8
=master=
Форумчанин
 
Регистрация: 26.03.2012
Сообщений: 665
По умолчанию

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

Cоздать можно через sp_executesql, удалить - drop function <your function name>.
Такое сойдет?
=master= вне форума Ответить с цитированием
Старый 29.03.2012, 13:00   #9
mrChester
Я
Форумчанин
 
Аватар для mrChester
 
Регистрация: 24.04.2010
Сообщений: 693
По умолчанию

Пример с процедурой, функция создается аналогично.
Цитата:
CREATE PROCEDURE dbo.Test2
AS
CREATE TABLE #t(x INT PRIMARY KEY);
INSERT INTO #t VALUES (2);
SELECT Test2Col = x FROM #t;
GO
CREATE PROCEDURE dbo.Test1
AS
CREATE TABLE #t(x INT PRIMARY KEY);
INSERT INTO #t VALUES (1);
SELECT Test1Col = x FROM #t;
EXEC Test2;
GO
CREATE TABLE #t(x INT PRIMARY KEY);
INSERT INTO #t VALUES (99);
GO
EXEC Test1;
GO
Источник. Кстати, там тоже использовали термин "вложенная", а то я уже думал я как-то не так выразился, прям лузером себя почувствовал
Все персонажи вымышлены, все совпадения случайны.
Если жизнь игра, тогда я её разработчик ©.
mrChester вне форума Ответить с цитированием
Старый 29.03.2012, 13:23   #10
=master=
Форумчанин
 
Регистрация: 26.03.2012
Сообщений: 665
По умолчанию

Вы пальцем ткните, где тут создание вложенных (временных) процедур или функций.
=master= вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
функция Vitalya_1993 Помощь студентам 1 09.12.2011 10:13
Функция KatruKot C# (си шарп) 3 14.06.2011 10:03
Функция SL1CK Помощь студентам 3 07.06.2009 17:36
Вложенная панель инструментов. haros Microsoft Office Excel 7 16.03.2009 14:38
одна функция потока, а другая функция - член класса запускающего этот поток Дмитрий_Ч Общие вопросы C/C++ 2 27.09.2007 08:50