Модераторы: Akella
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Возвращаемое значение функции 
V
    Опции темы
lv151
Дата 6.11.2008, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 916
Регистрация: 11.2.2008

Репутация: 1
Всего: 2



Пытаюсь сделать что то наподобе return, С-ных функций.
Если функция нормально отработала, то return 1;
Но в PSQL  такой механизм не катит. Создал дополнительный вых. параметр,не то...
Думаю применить серверные исключения, может есть другой способ имитаци return?
PM MAIL   Вверх
Deniz
Дата 7.11.2008, 06:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 22
Всего: 44



lv151, где это все происходит? Клиент или сервер?
В FireBird есть suspend.
Код

CREATE PROCEDURE SP_T1
RETURNS ( ID integer)
AS
begin
  /* Procedure Text */
  ID = 0;
  if (...) then ID = 1; 
  suspend;
end



--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
lv151
Дата 7.11.2008, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 916
Регистрация: 11.2.2008

Репутация: 1
Всего: 2



Проблема в том, что это нужно реализовать в функции множнственного выбора, RETURNS ( ID integer) - не подходит, я рассмотрел все стандартные варианты.
Цитата(lv151 @  6.11.2008,  22:24 Найти цитируемый пост)
Но в PSQL  такой механизм не катит. Создал дополнительный вых. параметр,не то...


PM MAIL   Вверх
Deniz
Дата 7.11.2008, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 22
Всего: 44



lv151, тогда опиши, что ты хочешь получить, и определись с терминологией, в FireBird функция и процедура совсем разные вещи, тебе что надо?


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
lv151
Дата 7.11.2008, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 916
Регистрация: 11.2.2008

Репутация: 1
Всего: 2



процедура, которая возвращает данные(обычный select запрос в виде процедуры), но с возможностью вроде return. 
функция не подходит.
В TSQL для передачи из процедуры значения возвращаемому коду можно использовать return без объявления переменных OUTPUT.


B. Return status codes
This example checks the state for the specified author's ID. If the state is California (CA), a status of 1 is returned. Otherwise, 2 is returned for any other condition (a value other than CA for state or an au_id that did not match a row).

Код

CREATE PROCEDURE checkstate @param varchar(11)
AS
IF (SELECT state FROM authors WHERE au_id = @param) = 'CA'
   RETURN 1
ELSE
   RETURN 2


 


 ! 
Akella
Пользуйтесь тэгами Код


Это сообщение отредактировал(а) Akella - 7.11.2008, 22:03
PM MAIL   Вверх
Akella
Дата 7.11.2008, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 20
Всего: 329



lv151,  Deniz дал пример кода тебе.

Цитата(lv151 @  7.11.2008,  21:37 Найти цитируемый пост)
использовать return без объявления переменных OUTPUT.

в Firebird объявлять выходные параметры нужно, чтобы узнать результаты работы процедуры. Нет никаких выходных параметров в процедурах. Зато в процедурах жарптички с помощью suspend`ов такие чудеса можно творить!

Это сообщение отредактировал(а) Akella - 7.11.2008, 22:09
PM MAIL   Вверх
lv151
Дата 7.11.2008, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 916
Регистрация: 11.2.2008

Репутация: 1
Всего: 2



Цитата(Akella @  7.11.2008,  22:06 Найти цитируемый пост)
в Firebird объявлять выходные параметры нужно, чтобы узнать результаты работы процедуры. Нет никаких выходных параметров в процедурах. Зато в процедурах жарптички с помощью suspend`ов такие чудеса можно творить!

Как?  smile 
PM MAIL   Вверх
Akella
Дата 8.11.2008, 00:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 20
Всего: 329



чудеса творить?

Добавлено через 1 минуту и 21 секунду
Вот так:

Код

CREATE OR ALTER PROCEDURE IAMASSHOLE2 
RETURNS (
    CODE VARCHAR(30),
    CODE1 SMALLINT,
    NAME VARCHAR(100),
    REMAINDER_STORAGE VARCHAR(5),
    PRICE_ONE NUMERIC(15,2),
    PRICE_TWO NUMERIC(15,2),
    PRICE_THREE NUMERIC(15,2),
    PRICE_FOUR NUMERIC(15,2),
    PRICE_OLD NUMERIC(15,2),
    DESCRIPTION VARCHAR(1000),
    GOODS_SIZE NUMERIC(15,2),
    MODEL VARCHAR(3),
    FULL_DESCRIPTION VARCHAR(1000),
    BREND VARCHAR(100),
    NOVELTY VARCHAR(7),
    METAGE VARCHAR(10))
AS
DECLARE VARIABLE CURRENTGOODSTYPE VARCHAR(100) = '';
DECLARE VARIABLE CURRENTGOODSID BIGINT;
DECLARE VARIABLE CURRENTINSERTION VARCHAR(100) = '';
DECLARE VARIABLE CURRENTINSERTION2 VARCHAR(100) = '';
DECLARE VARIABLE CURRENTCOVERAGE VARCHAR(100) = '';
DECLARE VARIABLE GOODSTYPE VARCHAR(100) = '';
DECLARE VARIABLE INSERTIONTYPE VARCHAR(100) = '';
DECLARE VARIABLE INSERTIONTYPE2 VARCHAR(100) = '';
DECLARE VARIABLE COVERAGETYPE VARCHAR(100) = '';
DECLARE VARIABLE ID VARCHAR(100) = '';
begin
  for select tg.NAME, ti.NAME, ti2.NAME, tc.NAME, /*i.COLLECTION,*/ i.ID, tg.ID
    from T_GOOD tg, t_INSERTION ti, t_INSERTION2 ti2, t_coverage tc, IN1 i
    where (SUBSTRING (ARTICLE from 5 FOR 1) = tc.code)
      and (SUBSTRING (ARTICLE from 6 FOR 1) = tg.code)
      and (SUBSTRING (ARTICLE from 7 FOR 2) = ti.code)
      and (SUBSTRING (ARTICLE from 7 FOR 2) = ti2.code)

    order by tg.NAME, ti2.NAME, ti.NAME, tc.NAME, i.NAME/*, i.COLLECTION, i.NAME*/
    into :GoodsType, :InsertionType, :InsertionType2, :CoverageType, /*:BrandType,*/ :id, :CURRENTGOODSID
  do
  begin
    -- set all fields into null
    CODE              = null;
    CODE1             = null;
    NAME              = null;
    REMAINDER_STORAGE = null;
    PRICE_ONE         = null;
    PRICE_TWO         = null;
    PRICE_THREE       = null;
    PRICE_FOUR        = null;
    PRICE_OLD         = null;
    DESCRIPTION       = null;
    GOODS_SIZE        = null;
    MODEL             = null;
    FULL_DESCRIPTION  = null;
    NOVELTY           = null;
    METAGE            = null;

    if (CurrentGoodsType <> GoodsType) then
    begin
      CurrentGoodsType = GoodsType;
      CurrentInsertion = '';
      CurrentInsertion2 = '';
      CurrentCoverage = '';

      NAME = GoodsType;
      CODE1 = 1;
      code  = 'g' || CAST(CURRENTGOODSID as VARCHAR(15));
--      code  = 'g' || id;
      suspend;
    end
    if (CurrentInsertion2 <> InsertionType2) then
    begin
      CurrentInsertion2 = InsertionType2;
      CurrentInsertion = '';
      CurrentCoverage = '';

      NAME = InsertionType2;
      CODE1 = 2;
      code  = 'i' || id;
      suspend;
    end

    if (CurrentInsertion <> InsertionType) then
    begin
      CurrentInsertion = InsertionType;
      CurrentCoverage = '';


      NAME = InsertionType;
      CODE1 = 3;
      code  = 'i2' || id;
      suspend;
    end
    if (CurrentCoverage <> CoverageType) then
    begin
      CurrentCoverage = CoverageType;
      NAME = CoverageType;

      CODE1 = 4;
      code  = 'c' || id;
      suspend;
    end

    CODE1 = null;
    -- select all fields for full suspend

    select
      tg.NAME,
      ti.NAME,
      ti2.NAME,
      tc.NAME,
      i.ARTICLE,
      I.NAME || (SELECT RES from SP_GET_SIZE5(i.ARTICLE,I.NAME)),
      (select res from SP_PRESENSE_ON_STORAGE(i.ARTICLE)),
      (SELECT price1 from SP_GET_BASEPRICE(i.ARTICLE, i.PRICE_BASE)),
      (SELECT price2 from SP_GET_BASEPRICE(i.ARTICLE, i.PRICE_BASE)),
      (SELECT price3 from SP_GET_BASEPRICE(i.ARTICLE, i.PRICE_BASE)),
      (SELECT price4 from SP_GET_BASEPRICE(i.ARTICLE, i.PRICE_BASE)),
      (SELECT price_old from SP_GET_BASEPRICE(i.ARTICLE, i.PRICE_BASE)),
      (SUBSTRING('Покрытие: ' || tc.NAME || '. Вставка: ' || ti.NAME || '.' || (SELECT RES from SP_GET_SIZE4(i.ARTICLE,I.NAME)) || (SELECT RES from sp_get_novinka(i.ARTICLE)) || ' Артикул по каталогу: ' || i.ARTICLE from 1 FOR 1000))  || '. Коллекция: '|| (SELECT result from SP_GET_BREND_NAME(i.ARTICLE)) || '. Ювелирная бижутерия Эталон-Женави.',
      (select res FROM SP_GET_SIZE3(i.ARTICLE, i.name)),
      (SUBSTRING(i.ARTICLE from 2 for 3)),
      (SUBSTRING('Покрытие: ' || tc.NAME || '. Вставка: ' || ti.NAME || '.' || (SELECT RES from SP_GET_SIZE4(i.ARTICLE,I.NAME)) || (SELECT RES from sp_get_novinka(i.ARTICLE)) || ' Артикул по каталогу: ' || i.ARTICLE from 1 FOR 1000))  || '. Коллекция: '|| (SELECT result from SP_GET_BREND_NAME(i.ARTICLE)) || '. Ювелирная бижутерия Эталон-Женави.',
      i.COLLECTION,
      (case UPPER(i.novelty) when 'NEW' then 'Новинка' else null end),
      (select res FROM sp_get_metage(i.ARTICLE))

      -- insert all fields for output set
      from IN1 i, T_GOOD tg, t_INSERTION ti, t_INSERTION2 ti2, t_coverage tc
      where (i.ID = :Id)
        and (SUBSTRING (ARTICLE from 5 FOR 1) = tc.code)
        and (SUBSTRING (ARTICLE from 6 FOR 1) = tg.code)
        and (SUBSTRING (ARTICLE from 7 FOR 2) = ti.code)
        and (SUBSTRING (ARTICLE from 7 FOR 2) = ti2.code)    --  Select all data for current goods
      order by I.NAME
      into
        :GOODSTYPE,
        :InsertionType,
        :InsertionType2,
        :CoverageType,
        :CODE,
        :NAME,
        :REMAINDER_STORAGE,
        :pRICE_ONE,
        :pRICE_TWO,
        :pRICE_THREE,
        :pRICE_FOUR,
        :pRICE_OLD,
        :DESCRIPTION,
        :GOODS_SIZE,
        :MODEL,
        :FULL_DESCRIPTION,
        :BREND,
        :novelty,
        :metage
        ;

    suspend;

  end
end


Добавлено через 4 минуты и 16 секунд
результат получается такой:
Цитата

ГРУППА1
  ПОДГРУППА1
   ПОД_ПОДГРУППА2
ТОВАР1
ТОВАР1
ТОВАР1

ГРУППА2
  ПОДГРУППА2
   ПОД_ПОДГРУППА2
ТОВАР2
ТОВАР3
ТОВАР2
-- и т.д.


Добавлено через 6 минут и 41 секунду
или такой:

Цитата

<Город> Город
<раздел> Жилая недвижимость
<Рубрика> Продажа
<Рубрика11> Продажа                     1 комн.
куча объявлений

<Город> Город
<раздел> Жилая недвижимость
<Рубрика> Продажа
<Рубрика11> Продажа                     2 комн.
куча объявлений

<Город> Город
<раздел> Жилая недвижимость
<Рубрика> Продажа
<Рубрика11> Продажа                     3 комн.
куча объявлений


Добавлено через 12 минут и 42 секунды
или вот такой:
user posted image


ну типа каталоги разные, вот например: etalon-jenavi.ms
PM MAIL   Вверх
lv151
Дата 8.11.2008, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 916
Регистрация: 11.2.2008

Репутация: 1
Всего: 2



не то...
Цитата(lv151 @  6.11.2008,  22:24 Найти цитируемый пост)
 Создал дополнительный вых. параметр,не то..


У меня получалось так

Result                      Данные для выборки
NULL                        Данные
NULL                        Данные
NULL                        Данные
NULL                        Данные
10                            Данные

т.е. для того чтобы получить результат нужно перейти на самую последнюю запись, а это не есть гуд. smile

p.s. а зачем ты инициализируешь выходные праметры null-ами, они же по-умолчанию null? Так, для общего развития интересно.




Это сообщение отредактировал(а) lv151 - 8.11.2008, 13:29
PM MAIL   Вверх
Akella
Дата 9.11.2008, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 20
Всего: 329



Цитата(lv151 @  8.11.2008,  13:23 Найти цитируемый пост)
они же по-умолчанию null?

Пример. Буратино дали 3 яблока. 1 яблоко он съел. Сколько осталось яблок. Логично было бы ответить 2. А вот фигушки. Никто не знает, сколько яблок было у Буратино до этого.

Добавлено через 1 минуту и 53 секунды
Цитата(lv151 @  8.11.2008,  13:23 Найти цитируемый пост)
У меня получалось так


Цитата(lv151 @  8.11.2008,  13:23 Найти цитируемый пост)
т.е. для того чтобы получить результат нужно перейти на самую последнюю запись

бред какой-то

Добавлено через 2 минуты и 18 секунд
СМОТРЯ ЧТО ТЫ ХОЧЕШЬ ПОЛУЧИТЬ  smile 
PM MAIL   Вверх
lv151
Дата 12.11.2008, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 916
Регистрация: 11.2.2008

Репутация: 1
Всего: 2



Спасибо всем за помощь!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Interbase"
Alex

Обязательно указание:

1. Версию InterBase (Firebird, Yaffil)

2. Способа доступа (ADO, BDE, IBX и т.д.)

  • КАК ПРАВИЛЬНО ОФОРМИТЬ КОД - ЗДЕСЬ
  • КАК ПРАВИЛЬНО УКАЗАТЬ ТЕКСТ ОШИБКИ - ЗДЕСЬ
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • FAQ раздела лежит здесь!

Если Вам понравилась атмосфера форума, заходите к нам чаще! С Уважением, Akella.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Firebird, Interbase | Следующая тема »


 




[ Время генерации скрипта: 0.0588 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.