Автор Тема: Хранимые процедуры  (Прочитано 8647 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн moran

  • Гуру
  • ****
  • Сообщений: 403
  • Пиво - тоже компонента...
Хранимые процедуры
« : 07 Мая 2009, 04:12:12 »
В прикрепленных файлах находятся скрипты процедур, которые необходимо открыть в редакторе скриптов в любом менеджере баз Firebird. Выполняем скрипт, в базе появляется соответствующая процедура, выполнив которую можно получить соответствующий результат.

p.s. Предлагайте свои алгоритмы для всяческих задач. А там посмотрим что из этого выйдет...

1. Процедура отмечающая все фильмы где нет постера, в виде метки используется пользовательское поле, с произвольным текстом
SET TERM ^ ;

CREATE OR ALTER PROCEDURE USER_MARK_POSTERS (
    value_text varchar(100),
    cmfid_id integer)
as
begin
/*$$IBEC$$ ПОСТЕРЫ $$IBEC$$*/

INSERT INTO
  CUSTOM_VALUES_SHORTSTR
  ("cmfid", "mid", "value")
  SELECT
    :CMFID_ID as "cmfid", "mid", :VALUE_TEXT as "value"
  FROM
    MOVIES
  WHERE
    "mid" NOT IN (SELECT "mid" FROM CUSTOM_VALUES_SHORTSTR WHERE "cmfid" = :CMFID_ID AND "value" = :VALUE_TEXT) AND
    "visible" = -1 AND "epid" is NULL AND
    (NOT EXISTS(SELECT FIRST 1 * FROM IMAGES WHERE ("mid" = MOVIES."mid") AND ("imgtype" = 0)));

DELETE FROM
  CUSTOM_VALUES_SHORTSTR
WHERE
  ("cmfid" = :CMFID_ID) AND ("value" = :VALUE_TEXT) and
  (EXISTS(SELECT FIRST 1 * FROM IMAGES WHERE ("mid" = CUSTOM_VALUES_SHORTSTR."mid") AND ("imgtype" = 0)));


  suspend;
end^

SET TERM ; ^

COMMENT ON PROCEDURE USER_MARK_POSTERS IS
'Процедура отмечающая все фильмы где нет постера, в виде метки используется пользовательское поле, с произвольным текстом';

DESCRIBE PARAMETER VALUE_TEXT PROCEDURE USER_MARK_POSTERS
'Текст вносимый в пользовательское поле';

DESCRIBE PARAMETER CMFID_ID PROCEDURE USER_MARK_POSTERS
'ID пользовательского поля в которое вносим значение VALUE_TEXT';

GRANT SELECT,INSERT,DELETE ON CUSTOM_VALUES_SHORTSTR TO PROCEDURE USER_MARK_POSTERS;

GRANT SELECT ON MOVIES TO PROCEDURE USER_MARK_POSTERS;

GRANT SELECT ON IMAGES TO PROCEDURE USER_MARK_POSTERS;

GRANT EXECUTE ON PROCEDURE USER_MARK_POSTERS TO SYSDBA;

2. Процедура отмечающая все фильмы где нет скриншотов, в виде метки используется пользовательское поле, с произвольным текстом
SET TERM ^ ;

CREATE OR ALTER PROCEDURE USER_MARK_SCREENSHOTS (
    value_text varchar(100),
    cmfid_id integer)
as
begin
/*$$IBEC$$ СКРИНШОТЫ $$IBEC$$*/

INSERT INTO
  CUSTOM_VALUES_SHORTSTR
  ("cmfid", "mid", "value")
  SELECT
    :CMFID_ID as "cmfid", "mid", :VALUE_TEXT as "value"
  FROM
    MOVIES
  WHERE
    "mid" NOT IN (SELECT "mid" FROM CUSTOM_VALUES_SHORTSTR WHERE "cmfid" = :CMFID_ID AND "value" = :VALUE_TEXT) AND
    "visible" = -1 AND
    (NOT EXISTS(SELECT FIRST 1 * FROM IMAGES WHERE ("mid" = MOVIES."mid") AND ("imgtype" = 1)));

DELETE FROM
  CUSTOM_VALUES_SHORTSTR
WHERE
  ("cmfid" = :CMFID_ID) AND ("value" = :VALUE_TEXT) and
  (EXISTS(SELECT FIRST 1 * FROM IMAGES WHERE ("mid" = CUSTOM_VALUES_SHORTSTR."mid") AND ("imgtype" = 1)));
  suspend;
end^

SET TERM ; ^

COMMENT ON PROCEDURE USER_MARK_SCREENSHOTS IS
'Процедура отмечающая все фильмы где нет скриншотов, в виде метки используется пользовательское поле, с произвольным текстом';

DESCRIBE PARAMETER VALUE_TEXT PROCEDURE USER_MARK_SCREENSHOTS
'Текст вносимый в пользовательское поле';

DESCRIBE PARAMETER CMFID_ID PROCEDURE USER_MARK_SCREENSHOTS
'ID пользовательского поля в которое вносим значение VALUE_TEXT';

GRANT SELECT,INSERT,DELETE ON CUSTOM_VALUES_SHORTSTR TO PROCEDURE USER_MARK_SCREENSHOTS;

GRANT SELECT ON MOVIES TO PROCEDURE USER_MARK_SCREENSHOTS;

GRANT SELECT ON IMAGES TO PROCEDURE USER_MARK_SCREENSHOTS;

GRANT EXECUTE ON PROCEDURE USER_MARK_SCREENSHOTS TO SYSDBA;

3. Процедура отмечающая все фильмы где нет CD обложек, в виде метки используется пользовательское поле, с произвольным текстом
SET TERM ^ ;

CREATE OR ALTER PROCEDURE USER_MARK_CD_COVER (
    value_text varchar(100),
    cmfid_id integer)
as
begin
/*$$IBEC$$ CD ОБЛОЖКИ $$IBEC$$*/

INSERT INTO
  CUSTOM_VALUES_SHORTSTR
  ("cmfid", "mid", "value")
  SELECT
    :CMFID_ID as "cmfid", "mid", :VALUE_TEXT as "value"
  FROM
    MOVIES
  WHERE
    "mid" NOT IN (SELECT "mid" FROM CUSTOM_VALUES_SHORTSTR WHERE "cmfid" = :CMFID_ID AND "value" = :VALUE_TEXT) AND
    "visible" = -1 AND "epid" is NULL AND
    (NOT EXISTS(SELECT FIRST 1 * FROM IMAGES WHERE ("mid" = MOVIES."mid") AND ("imgtype" = 3)));

DELETE FROM
  CUSTOM_VALUES_SHORTSTR
WHERE
  ("cmfid" = :CMFID_ID) AND ("value" = :VALUE_TEXT) and
  (EXISTS(SELECT FIRST 1 * FROM IMAGES WHERE ("mid" = CUSTOM_VALUES_SHORTSTR."mid") AND ("imgtype" = 3)));

  suspend;
end^

SET TERM ; ^

COMMENT ON PROCEDURE USER_MARK_CD_COVER IS
'Процедура отмечающая все фильмы где нет CD обложек, в виде метки используется пользовательское поле, с произвольным текстом';

DESCRIBE PARAMETER VALUE_TEXT PROCEDURE USER_MARK_CD_COVER
'Текст вносимый в пользовательское поле';

DESCRIBE PARAMETER CMFID_ID PROCEDURE USER_MARK_CD_COVER
'ID пользовательского поля в которое вносим значение VALUE_TEXT';

GRANT SELECT,INSERT,DELETE ON CUSTOM_VALUES_SHORTSTR TO PROCEDURE USER_MARK_CD_COVER;

GRANT SELECT ON MOVIES TO PROCEDURE USER_MARK_CD_COVER;

GRANT SELECT ON IMAGES TO PROCEDURE USER_MARK_CD_COVER;

GRANT EXECUTE ON PROCEDURE USER_MARK_CD_COVER TO SYSDBA;

4. Процедура отмечающая все фильмы где нет BOX обложки, в виде метки используется пользовательское поле, с произвольным текстом
SET TERM ^ ;

CREATE OR ALTER PROCEDURE USER_MARK_BOX_COVER (
    value_text varchar(100),
    cmfid_id integer)
as
begin
/*$$IBEC$$ Box ОБЛОЖКИ $$IBEC$$*/

INSERT INTO
  CUSTOM_VALUES_SHORTSTR
  ("cmfid", "mid", "value")
  SELECT
    :CMFID_ID as "cmfid", "mid", :VALUE_TEXT as "value"
  FROM
    MOVIES
  WHERE
    "mid" NOT IN (SELECT "mid" FROM CUSTOM_VALUES_SHORTSTR WHERE "cmfid" = :CMFID_ID AND "value" = :VALUE_TEXT) AND
    "visible" = -1 AND "epid" is NULL AND
    (NOT EXISTS(SELECT FIRST 1 * FROM IMAGES WHERE ("mid" = MOVIES."mid") AND ("imgtype" = 2)));

DELETE FROM
  CUSTOM_VALUES_SHORTSTR
WHERE
  ("cmfid" = :CMFID_ID) AND ("value" = :VALUE_TEXT) and
  (EXISTS(SELECT FIRST 1 * FROM IMAGES WHERE ("mid" = CUSTOM_VALUES_SHORTSTR."mid") AND ("imgtype" = 2)));

  suspend;
end^

SET TERM ; ^

COMMENT ON PROCEDURE USER_MARK_BOX_COVER IS
'Процедура отмечающая все фильмы где нет BOX обложки, в виде метки используется пользовательское поле, с произвольным текстом';

DESCRIBE PARAMETER VALUE_TEXT PROCEDURE USER_MARK_BOX_COVER
'Текст вносимый в пользовательское поле';

DESCRIBE PARAMETER CMFID_ID PROCEDURE USER_MARK_BOX_COVER
'ID пользовательского поля в которое вносим значение VALUE_TEXT';

GRANT SELECT,INSERT,DELETE ON CUSTOM_VALUES_SHORTSTR TO PROCEDURE USER_MARK_BOX_COVER;

GRANT SELECT ON MOVIES TO PROCEDURE USER_MARK_BOX_COVER;

GRANT SELECT ON IMAGES TO PROCEDURE USER_MARK_BOX_COVER;

GRANT EXECUTE ON PROCEDURE USER_MARK_BOX_COVER TO SYSDBA;

[вложение удалено Администратором]
« Последнее редактирование: 07 Мая 2009, 04:19:06 от moran »
Русские кинопремьеры 2001-2010 (www.kinopoisk.ru)
80.64.88.51:ГОД_ПРЕМЬЕР
login: ГОД_ПРЕМЬЕР
password: ГОД_ПРЕМЬЕР
2006-2008 в процессе, 2001-2005,2009-2010 доступны...

Оффлайн moran

  • Гуру
  • ****
  • Сообщений: 403
  • Пиво - тоже компонента...
Хранимые процедуры
« Ответ #1 : 07 Мая 2009, 04:13:07 »
5. Добавляет в пользовательское поле с ID ''CMFID_ID'' значение ''VALUE_TEXT'' если в поле ''расположение носителя'' есть запись ''LOCATION_TEXT'', эпизоды не учитываются.
SET TERM ^ ;

CREATE OR ALTER PROCEDURE USER_MARK_LOCATION_TO_USER_FILD (
    location_text varchar(127),
    value_text varchar(127),
    cmfid_id integer)
as
begin
INSERT INTO
  CUSTOM_VALUES_SHORTSTR
  ("cmfid", "mid", "value")
  SELECT
    :CMFID_ID as "cmfid", "mid", :VALUE_TEXT as "value"
  FROM
    MOVIES
  WHERE
    "mid" NOT IN (SELECT "mid" FROM CUSTOM_VALUES_SHORTSTR WHERE "cmfid" = :CMFID_ID AND "value" = :VALUE_TEXT) AND
    "visible" = -1 AND "epid" is NULL AND
    (EXISTS(SELECT FIRST 1 * FROM locations WHERE (locations."locid" = movies."location") AND locations."value" = :LOCATION_TEXT));

DELETE FROM
  CUSTOM_VALUES_SHORTSTR
WHERE
  ("cmfid" = :CMFID_ID) AND ("value" = :VALUE_TEXT) and
  (NOT EXISTS(SELECT FIRST 1 * FROM locations, movies WHERE (locations."locid" = movies."location") AND locations."value" = :LOCATION_TEXT));

  suspend;
end^

SET TERM ; ^

COMMENT ON PROCEDURE USER_MARK_LOCATION_TO_USER_FILD IS
'Добавляет в пользовательское поле с ID ''CMFID_ID'' значение ''VALUE_TEXT'' если в поле ''расположение носителя'' есть запись ''LOCATION_TEXT'', эпизоды не учитываются.';

DESCRIBE PARAMETER LOCATION_TEXT PROCEDURE USER_MARK_LOCATION_TO_USER_FILD
'Текст находящийся в поле ''Расположение Носителя''';

DESCRIBE PARAMETER VALUE_TEXT PROCEDURE USER_MARK_LOCATION_TO_USER_FILD
'Текст вносимый в пользовательское поле';

DESCRIBE PARAMETER CMFID_ID PROCEDURE USER_MARK_LOCATION_TO_USER_FILD
'ID пользовательского поля в которое вносим значение VALUE_TEXT';

GRANT SELECT,INSERT,DELETE ON CUSTOM_VALUES_SHORTSTR TO PROCEDURE USER_MARK_LOCATION_TO_USER_FILD;

GRANT SELECT ON MOVIES TO PROCEDURE USER_MARK_LOCATION_TO_USER_FILD;

GRANT SELECT ON LOCATIONS TO PROCEDURE USER_MARK_LOCATION_TO_USER_FILD;

GRANT EXECUTE ON PROCEDURE USER_MARK_LOCATION_TO_USER_FILD TO SYSDBA;

[вложение удалено Администратором]
Русские кинопремьеры 2001-2010 (www.kinopoisk.ru)
80.64.88.51:ГОД_ПРЕМЬЕР
login: ГОД_ПРЕМЬЕР
password: ГОД_ПРЕМЬЕР
2006-2008 в процессе, 2001-2005,2009-2010 доступны...

Оффлайн moran

  • Гуру
  • ****
  • Сообщений: 403
  • Пиво - тоже компонента...
Re: Хранимые процедуры
« Ответ #2 : 13 Мая 2009, 04:42:32 »
6. В пользовательское поле (Short text) вставляется количество постеров фильма.

SET TERM ^ ;

CREATE OR ALTER PROCEDURE USER_COUNT_POSTER (
    cmfid_id integer)
as
begin
delete from custom_values_shortstr where "cmfid" = :CMFID_ID;

INSERT INTO
  CUSTOM_VALUES_SHORTSTR
  ("cmfid", "mid", "value")
select
    :CMFID_ID as "cmfid",
    images."mid" as "mid",
    count( images."mid") as "value"
from images
where
   (
      (images."imgtype" = '0')
   )
group by images."mid", images."imgtype";
  suspend;
end^

SET TERM ; ^

COMMENT ON PROCEDURE USER_COUNT_POSTER IS
'В пользовательское поле вставляется количество постеров фильма.';

DESCRIBE PARAMETER CMFID_ID PROCEDURE USER_COUNT_POSTER
'ID пользовательского поля';

GRANT SELECT,INSERT,DELETE ON CUSTOM_VALUES_SHORTSTR TO PROCEDURE USER_COUNT_POSTER;

GRANT SELECT ON IMAGES TO PROCEDURE USER_COUNT_POSTER;

GRANT EXECUTE ON PROCEDURE USER_COUNT_POSTER TO SYSDBA;

7. В пользовательское поле (Short text) вставляется количество скриншотов фильма.

SET TERM ^ ;

CREATE OR ALTER PROCEDURE USER_COUNT_SCREEN (
    cmfid_id integer)
as
begin
delete from custom_values_shortstr where "cmfid" = :CMFID_ID;

INSERT INTO
  CUSTOM_VALUES_SHORTSTR
  ("cmfid", "mid", "value")
select
    :CMFID_ID as "cmfid",
    images."mid" as "mid",
    count( images."mid") as "value"
from images
where
   (
      (images."imgtype" = '1')
   )
group by images."mid", images."imgtype";
  suspend;
end^

SET TERM ; ^

COMMENT ON PROCEDURE USER_COUNT_SCREEN IS
'В пользовательское поле вставляется количество скриншотов фильма.';

DESCRIBE PARAMETER CMFID_ID PROCEDURE USER_COUNT_SCREEN
'ID пользовательского поля';

GRANT SELECT,INSERT,DELETE ON CUSTOM_VALUES_SHORTSTR TO PROCEDURE USER_COUNT_SCREEN;

GRANT SELECT ON IMAGES TO PROCEDURE USER_COUNT_SCREEN;

GRANT EXECUTE ON PROCEDURE USER_COUNT_SCREEN TO SYSDBA;

p.s. После создания поля в программе необходимо хотя бы у одного фильма, в ручную, внести значение в поле.

[вложение удалено Администратором]
« Последнее редактирование: 13 Мая 2009, 04:45:26 от moran »
Русские кинопремьеры 2001-2010 (www.kinopoisk.ru)
80.64.88.51:ГОД_ПРЕМЬЕР
login: ГОД_ПРЕМЬЕР
password: ГОД_ПРЕМЬЕР
2006-2008 в процессе, 2001-2005,2009-2010 доступны...