Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Firebird, Interbase > Возвращаемое значение функции


Автор: lv151 6.11.2008, 22:24
Пытаюсь сделать что то наподобе return, С-ных функций.
Если функция нормально отработала, то return 1;
Но в PSQL  такой механизм не катит. Создал дополнительный вых. параметр,не то...
Думаю применить серверные исключения, может есть другой способ имитаци return?

Автор: Deniz 7.11.2008, 06:28
lv151, где это все происходит? Клиент или сервер?
В FireBird есть suspend.
Код

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

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


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

Автор: lv151 7.11.2008, 21:37
процедура, которая возвращает данные(обычный 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:06
lv151,  Deniz дал пример кода тебе.

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

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

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

Как?  smile 

Автор: Akella 8.11.2008, 00:55
чудеса творить?

Добавлено через 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 секунды
или вот такой:
http://ipicture.ru/Gallery/Viewfull/8878031.html


ну типа каталоги разные, вот например: etalon-jenavi.ms

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


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

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

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

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



Автор: Akella 9.11.2008, 19:02
Цитата(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 

Автор: lv151 12.11.2008, 22:09
Спасибо всем за помощь!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)