Интерфейс к базе итогов торгов. Оглавление: Общие положения: ........................................................................................................................3 Общие функции: ............................................................................................................................3 Список рынков ...........................................................................................................................3 Список секторов ........................................................................................................................3 Зарегестрировать пользователя в системе для данного сектора ...........................................3 Поля: ...............................................................................................................................................3 Описание полей .........................................................................................................................3 Список наборов полей...............................................................................................................3 Принадлежность поля к набору ...............................................................................................4 Описание полей данных по сделкам .......................................................................................4 Описание полей в файле DBF ..................................................................................................4 Данные для шапки таблицы .....................................................................................................4 Бумаги: ............................................................................................................................................5 Список бумаг..............................................................................................................................5 Поиск бумаги .............................................................................................................................5 Список инструментов ................................................................................................................6 Список режимов торгов: ...........................................................................................................6 Список заданных оператором наборов бумаг .........................................................................6 Принадлежность бумаги к набору ...........................................................................................6 Управление принадлежностью бумаг к набору бумаг ...........................................................6 Получить наименование бумаги по её идентификатору........................................................6 Получить сектора для бумаги по её идентификатору ...........................................................6 Данные: ...........................................................................................................................................7 Данные за определенный день по группе бумаг: ...................................................................7 Данные по бумаге за период .....................................................................................................7 Данные укрупненные ................................................................................................................7 Последние даты существования данных .................................................................................8 Существование сделок для бумаги по определенному режиму торгов за указанную дату 8 Получить последнюю котировку бумаги ................................................................................8 Навигация .......................................................................................................................................8 Навигация для данных за определенный день по группе бумаг ...........................................9 Навигация для данных по бумаге за период ...........................................................................9 Навигация для данных укрупненных ....................................................................................10 Рассчитать периоды.................................................................................................................10 Навигация (старые функции) .....................................................................................................10 Навигация для данных за определенный день по группе бумаг .........................................11 Навигация для данных по бумаге за период .........................................................................12 Навигация для данных укрупненных ....................................................................................12 Данные в DBF-формате...............................................................................................................12 Сформировать данные по сектору (по бумаге/списку, за дату/период) .............................12 Сформировать данные по сделкам по бумаге, режиму торгов и дате ................................13 Сформировать данные за месяц по сектору ..........................................................................13 Календарь: ....................................................................................................................................13 Года существования данных по бумаге/списку бумаг .........................................................13 Месяца существования данных по бумаге/списку бумаг для указанного года .................13 Дни существования данных по бумаге/списку бумаг для указанных года и месяца ........14 Общие положения: Весь интерфейс организован на хранимых процедурах. Все данные разделены по рынкам, рынки разделены на сектора. Данные представляются в виде таблиц с несколькими предзаданными наборами полей. Общие функции: Список рынков CREATE FUNCTION get_markets( market VARCHAR(32) -- если NULL- возвращает все рынки ) RETURNING VARCHAR(32), -- идентификатор VARCHAR(128) -- наименование WITH RESUME Список секторов CREATE FUNCTION get_sectors( market VARCHAR(32), -- идентификатор рынка sector VARCHAR(32) -- если NULL- возвращает все сектора ) RETURNING VARCHAR(32), -- идентификатор сектора VARCHAR(128) -- наименование сектора WITH RESUME Зарегестрировать пользователя в системе для данного сектора Необходимо для сбора статистики посещений пользователей CREATE FUNCTION register_user( id_user VARCHAR(20), -- идентификатор пользователя (кука) sector VARCHAR(32) -- идентификатор сектора ) RETURNING SMALLINT -- 1 если было добавление пользователя, 0 – если нет. Поля: Описание полей CREATE FUNCTION get_fields( sector VARCHAR(32), -- идентификатор сектора is_group INT -- =1 при укрупнении ) RETURNING VARCHAR(32), -- идентификатор поля NVARCHAR(64), -- краткое наименование поля (как в шапке таблицы) NVARCHAR(64), -- краткое наименование группы полей (как в шапке таблицы) NVARCHAR(128) -- полное наименование поля WITH RESUME Список наборов полей CREATE FUNCTION get_fields_lists( sector VARCHAR(32) -- идентификатор сектора ) RETURNING VARCHAR(32), -- идентификатор набора VARCHAR(64) -- наименование набора WITH RESUME Принадлежность поля к набору CREATE FUNCTION is_field_in_list( sector VARCHAR(32), -- идентификатор сектора field VARCHAR(32), -- идентификатор поля field_list VARCHAR(20) -- идентификатор набора ) RETURNING SMALLINT -- =1 если принадлежит, =0 иначе Описание полей данных по сделкам CREATE FUNCTION get_rees_fields( sector VARCHAR(32) -- идентификатор сектора ) RETURNING VARCHAR(10), -- идентификатор поля NVARCHAR(64) -- описание поля WITH RESUME Описание полей в файле DBF CREATE FUNCTION get_dbf_fields( sector VARCHAR(32) -- идентификатор сектора ) RETURNING VARCHAR(10), -- идентификатор поля NVARCHAR(128) -- описание поля WITH RESUME Данные для шапки таблицы Предпоследний возвращаемый столбец содержит пары 10-11, 20-21 и т.д. Первое значение в паре указывает на индикативное поле (то, по которому определяется знак измененния), второе указывает поле, которое изменялось (для отрисовки стрелки изменения) CREATE FUNCTION fields_title( sector VARCHAR(32), -- идентификатор сектора field_list VARCHAR(20), -- идентификатор набора is_group INT -- =1 для шапки при укрупнении ) RETURNING VARCHAR(64), -- наименование поля VARCHAR(64), -- наименование группы полей INT, -- индикатор раскраски колонок INT -- =1 для колонки со сделками, =2 для текстовых данных (спец. вывод) =3 для поля даты, =4 нужна ссылка на описание бумаги WITH RESUME Пример вызова: EXECUTE FUNCTION fields_title('securies', 'full', 0) Ответ: Краткое наименование ценной бумаги Режим торгов Дата торгов Средневзвешенная 4 2 3 Цена сделки 11 Изменение средневзвешенной Рыночная Открытия Периода открытия Последней Изменение цены последней Периода закрытия Минимальная Максимальная Последней предыдущего дня Цена предложения Наименьшая Цена спроса Наибольшая Сумма сделок за день, руб Объем сделок за день в единицах Количество сделок за день, штук Цена сделки Цена сделки Цена сделки Цена сделки Цена сделки Цена сделки Цена сделки Цена сделки Цена сделки Цена сделки Цена предложения Цена предложения Цена спроса Цена спроса 10 21 20 1 Бумаги: Есть заданные оператором наборы бумаг и набор бумаг, заданный пользователем. У пользовательского набора идентификатор=кука (уникальная; 20 символов). Список бумаг CREATE FUNCTION get_secs( sector VARCHAR(32), -- идентификатор сектора instr VARCHAR(4), -- идентификатор инструмента, если =NULL то для всех инструментов id_list VARCHAR(20), -- идентификатор набора, если =NULL то для всех наборов p_active SMALLINT -- если =1 то ищется только среди бумаг с признаком «Торгуется на ММВБ» ) RETURNING VARCHAR(12), -- идентификатор бумаги VARCHAR(64), -- наименование бумаги VARCHAR(4), -- идентификатор инструмента VARCHAR(128) -- наименование инструмента WITH RESUME Поиск бумаги Все строки поиска должны содержать концевой знак процента CREATE FUNCTION find_secs( sector VARCHAR(32), -- идентификатор сектора sec VARCHAR(12), -- строка поиска по идентификатору name NVARCHAR(128), -- строка поиска по наименованию p_active SMALLINT -- если =1 то ищется только среди бумаг с признаком «Торгуется на ММВБ» ) RETURNING VARCHAR(12), -- идентификатор бумаги VARCHAR(64), -- наименование бумаги VARCHAR(4), -- идентификатор инструмента VARCHAR(128) -- наименование инструмента Список инструментов Лучше не использовать, добавлена для совместимости с черновиком CREATE FUNCTION get_instrs( sector VARCHAR(32) -- идентификатор сектора ) RETURNING VARCHAR(4), -- идентификатор инструмента VARCHAR(64) -- наименование инструмента Список режимов торгов: CREATE FUNCTION get_boards( sector VARCHAR(32) -- идентификатор сектора ) RETURNING VARCHAR(32), -- идентификатор режима торгов VARCHAR(128) -- наименование режима торгов WITH RESUME Список заданных оператором наборов бумаг CREATE FUNCTION get_secs_lists( sector VARCHAR(32) -- идентификатор сектора ) RETURNING VARCHAR(32), -- идентификатор набора VARCHAR(64) -- наименование набора WITH RESUME Принадлежность бумаги к набору CREATE FUNCTION sec_in_list( sector VARCHAR(32), -- идентификатор сектора sec VARCHAR(12), -- идентификатор бумаги id_list VARCHAR(20) -- идентификатор набора (кука) ) RETURNING SMALLINT -- 1 если принадлежит Управление принадлежностью бумаг к набору бумаг CREATE FUNCTION sec_to_list( sector VARCHAR(32), -- идентификатор сектора sec VARCHAR(12), -- идентификатор бумаги id_list VARCHAR(20), -- идентификатор набора is_set SMALLINT -- если 1 - то вставить бумагу в набор, если 0 - то удалить бумагу из набора ) RETURNING SMALLINT -- возвращает 0, если нужна вставка, а в наборе больше 10 бумаг – ограничение на кол-во бумаг в наборе. В любом другом случае возвращет 1. Получить наименование бумаги по её идентификатору CREATE FUNCTION get_sec_name( sector VARCHAR(32), -- идентификатор сектора sec VARCHAR(12) -- идентификатор бумаги ) RETURNING NVARCHAR(128) – наименование бумаги Получить сектора для бумаги по её идентификатору CREATE FUNCTION get_sector_by_sec( p_sec VARCHAR(12) -- идентификатор бумаги ) RETURNING VARCHAR(32), NVARCHAR(128) Данные: Многие процедуры в имени содержат идентификатор сектора – макрос подстановки %%SECTOR%% идентификатор набора полей – макрос подстановки %%FIELDS_LIST_NAME%% список возвращаемых полей (в зав-ти от набора полей) - макрос подстановки %%FIELDS_LIST_RETURN%% Например, get_data_day_%%SECTOR%%_%%FIELDS_LIST_NAME%% для рынка securies раскрывается в get_data_day_securies_full, get_data_day_securies_middle и get_data_day_securies_short Данные за определенный день по группе бумаг: CREATE FUNCTION get_data_day_%%SECTOR%%_%%FIELDS_LIST_NAME%%( begin_pos INT, -- начальная позиция sec_list VARCHAR(20), -- идентификатор набора бумаг board VARCHAR(4), -- идентификатор режима торгов (если NULL то все) date_show DATE, -- дата торгов only_active INT -- если 1 то возвращаются только дни с активностью на рынке (numtrades>0) ) RETURNING INT, -- позиция строки данных VARCHAR(12), -- идентификатор бумаги VARCHAR(4), -- идентификатор режима торгов CHAR(10), -- дата торгов в строковом формате %Y-%m-%d %%FIELDS_LIST_RETURN%% -- собственно данные WITH RESUME Данные по бумаге за период CREATE FUNCTION get_data_%%SECTOR%%_%%FIELDS_LIST_NAME%%( begin_pos INT, -- начальная позиция securie VARCHAR(12), -- идентификатор бумаги board VARCHAR(4), -- идентификатор режима торгов (если NULL то все) date_from DATE, -- дата начала периода date_to DATE, -- дата конца периода only_active INT-- если 1 то возвращаются только дни с активностью на рынке (numtrades>0) ) RETURNING INT, -- позиция строки данных VARCHAR(12), -- идентификатор бумаги VARCHAR(4), -- идентификатор режима торгов CHAR(10), -- дата торгов в строковом формате %Y-%m-%d %%FIELDS_LIST_RETURN%% -- собственно данные WITH RESUME Данные укрупненные CREATE FUNCTION get_data_group_%%SECTOR%%_%%FIELDS_LIST_NAME%%( begin_pos INT, -- начальная позиция securie VARCHAR(12), -- идентификатор бумаги если NULL то учитывается значение sec_list sec_list VARCHAR(20), -- идентификатор набора бумаг board VARCHAR(4), -- идентификатор режима торгов (если NULL то все) year_show INT, -- год: от 1990 до ... если 0, то все года и не учитываются quart_show и month_show quart_show INT, -- квартал: от 1 до 4 (значение month_show не учитывается) если 0 - то в зав-ти от значения month_show month_show INT -- месяц: от 1 до 12 если 0 - то все месяца ) RETURNING INT, -- позиция строки данных VARCHAR(12), -- идентификатор бумаги VARCHAR(4), -- идентификатор режима торгов CHAR(10), -- всегда NULL (дата торгов в строковом формате) %%FIELDS_LIST_RETURN%% -- собственно данные WITH RESUME Последние даты существования данных Должен быть указан или набор, или бумага CREATE FUNCTION last_dates_%%SECTOR%%( sec_list VARCHAR(20), -- идентификатор набора бумаг securie VARCHAR(12), -- идентификатор бумаги board VARCHAR(4) -- идентификатор режима торгов (если NULL то все) ) RETURNING INT, -- день \ INT, -- месяц – последняя дата существования для набора бумаг, начало последнего периода для бумаги INT, -- год / INT, -- день \ INT, -- месяц – NULL для набора бумаг, конец последнего периода для бумаги INT -- год / Существование сделок для бумаги по определенному режиму торгов за указанную дату Если указана только дата (первые 2 параметра =NULL) то выдается существование сделок за день CREATE FUNCTION trades_exist_%%SECTOR%%( p_id VARCHAR(12), -- идентификатор бумаги p_board VARCHAR(4), -- идентификатор режима торгов p_trdate DATE -- дата торгов ) RETURNING SMALLINT – 1 – существуют, 0 - нет Получить последнюю котировку бумаги CREATE FUNCTION get_last_quote_%%SECTOR%%( securie VARCHAR(12) -- идентификатор бумаги ) RETURNING DATE, FLOAT, FLOAT DATE -- дата торгов FLOAT – котировка (последняя цена) FLOAT – изменение котировки Навигация Функции возвращают начальные позиции страниц и их названия. Вызовы функций практически идентичны соответствующим функциям формирования данных. Для первых вызовов устанавливать begin_pos=0. Для группы страниц можно кэшировать вызовы _sets2_ функций, т.к. они идентичны. Пример использования: Вызов: EXECUTE FUNCTION get_data_sets2_securies( 0, 'RU0008958863', NULL, DATETIME(2000-01-28) YEAR TO DAY, DATETIME(2002-02-04) YEAR TO DAY, 0) Result set: 1 2 3 4 5 6 365520071 365660071 365800071 365970071 366110071 366250071 28.01.2000 11.02.2000 25.02.2000 13.03.2000 27.03.2000 10.04.2000 С С С С С N Отобразить нужно в: 28.01.2000 11.02.2000 25.02.2000 13.03.2000 27.03.2000 365520071 365660071 365800071 365970071 366110071 >>> 6 Ссылка >>> приведет к формированию сл. сета: Вызов: EXECUTE FUNCTION get_data_sets2_securies( 6, 'RU0008958863', NULL, DATETIME(2000-01-28) YEAR TO DAY, DATETIME(2002-02- 04) YEAR TO DAY, 0) Result set: 1 6 7 8 9 10 11 365520071 366250071 366390071 366560071 366700071 366840071 366990071 28.01.2000 10.04.2000 24.04.2000 11.05.2000 25.05.2000 08.06.2000 23.06.2000 P C C C C C N Отобразить нужно в: <<< 10.04.2000 24.04.2000 11.05.2000 25.05.2000 08.06.2000 >>> 1 366250071 366390071 366560071 366700071 366840071 11 Пять ссылок с датами приводят к одинаковому вызову get_data_sets_securies. Навигация для данных за определенный день по группе бумаг CREATE FUNCTION get_data_day_sets2_%%SECTOR%%( begin_pos INT, -- номер начального окна для сета sec_list VARCHAR(20), -- идентификатор набора бумаг board VARCHAR(4), -- идентификатор режима торгов (если NULL то все) date_show DATE, -- дата торгов only_active INT -- если 1 то возвращаются только дни с активностью на рынке (numtrades>0) ) RETURNING INT, -- номер окна INT, -- первая позиция строки данных страницы (для передачи в get_data_day в качестве begin_pos) VARCHAR(32), -- данные для вывода пользователю CHAR(1) -- признак навигации: P – начало предыдущего сета; C – окна в текущем сете; N – начало сл. сета. Навигация для данных по бумаге за период CREATE FUNCTION get_data_sets2_%%SECTOR%%( begin_pos INT, -- начальная позиция securie VARCHAR(12), -- идентификатор бумаги board VARCHAR(4), -- идентификатор режима торгов (если NULL то все) date_from DATE, -- дата начала периода date_to DATE, -- дата конца периода only_active INT-- если 1 то возвращаются только дни с активностью на рынке (numtrades>0) ) RETURNING INT, -- номер окна INT, -- первая позиция строки данных страницы (для передачи в get_data в качестве begin_pos) VARCHAR(32), -- данные для вывода пользователю CHAR(1) -- признак навигации: P – начало предыдущего сета; C – окна в текущем сете; N – начало сл. сета. Навигация для данных укрупненных CREATE FUNCTION get_data_group_sets2_%%SECTOR%%( begin_pos INT, -- начальная позиция securie VARCHAR(12), -- идентификатор бумаги если NULL то учитывается значение sec_list sec_list VARCHAR(20), -- идентификатор набора бумаг board VARCHAR(4), -- идентификатор режима торгов (если NULL то все) year_show INT, -- год: от 1990 до ... если 0, то все года и не учитываются quart_show и month_show quart_show INT, -- квартал: от 1 до 4 (значение month_show не учитывается) если 0 - то в зав-ти от значения month_show month_show INT -- месяц: от 1 до 12 если 0 - то все месяца ) RETURNING INT, -- номер окна INT, -- первая позиция строки данных страницы (для передачи в get_data_group в качестве begin_pos) VARCHAR(32), -- данные для вывода пользователю CHAR(1) -- признак навигации: P – начало предыдущего сета; C – окна в текущем сете; N – начало сл. сета. Рассчитать периоды Используется для ссылок из таблицы с укрупненными данными CREATE FUNCTION calc_dates_num( year_show INT, -- год quart_show INT, -- квартал month_show INT -- месяц ) RETURNING INT, -- день начала периода INT, -- месяц начала периода INT, -- год начала периода INT, -- день конца периода INT, -- месяц конца периода INT -- год конца периода Навигация (старые функции) Функции возвращают начальные позиции страниц и их названия. Вызовы функций практически иденитчны соответствующим функциям формирования данных. Признак окончания навигации =0 для обыкновенных страниц и =1 для перехода на следующую группу страниц. Необходимо вести историю переходов по группам страниц, так как при возврате на предыдущие группы нужно указывать begin_pos. Для первых вызовов устанавливать begin_pos=0. Для группы страниц можно кэшировать вызовы _sets_ функций, т.к. они идентичны. Пример использования: Вызов: EXECUTE FUNCTION get_data_sets_securies( 0, 'RU0008958863', NULL, DATETIME(200001-28) YEAR TO DAY, DATETIME(2002-02-04) YEAR TO DAY, 0) Result set: 1 21 41 61 81 101 365520071 365660071 365800071 365970071 366110071 366250071 28.01.2000 11.02.2000 25.02.2000 13.03.2000 27.03.2000 10.04.2000 0 0 0 0 0 1 Отобразить нужно в: 28.01.2000 11.02.2000 25.02.2000 13.03.2000 27.03.2000 >>> 365520071 365660071 365800071 365970071 366110071 366250071 Ссылка >>> приведет к формированию сл. сета: Вызов: EXECUTE FUNCTION get_data_sets_securies( 366250071, 'RU0008958863', NULL, DATETIME(2000-01-28) YEAR TO DAY, DATETIME(2002-02- 04) YEAR TO DAY, 0) Result set: 1 21 41 61 81 101 366250071 366390071 366560071 366700071 366840071 366990071 10.04.2000 24.04.2000 11.05.2000 25.05.2000 08.06.2000 23.06.2000 0 0 0 0 0 1 Отобразить нужно в: <<< 10.04.2000 24.04.2000 11.05.2000 25.05.2000 08.06.2000 >>> 365520071 366250071 366390071 366560071 366700071 366840071 366990071 Зеленым выделена начальная позиция для предыдущего сета. При переходе >>> нужно запоминать все начальные позиции для предыдущих сетов. Пять ссылок с датами приводят к одинаковому вызову get_data_sets_securies. Навигация для данных за определенный день по группе бумаг CREATE FUNCTION get_data_day_sets_%%SECTOR%%( begin_pos INT, -- начальная позиция prew_windows INT, -- кол-во предыдущих окон (для правильного формирования номеров страниц) sec_list VARCHAR(20), -- идентификатор набора бумаг board VARCHAR(4), -- идентификатор режима торгов (если NULL то все) date_show DATE, -- дата торгов only_active INT -- если 1 то возвращаются только дни с активностью на рынке (numtrades>0) ) RETURNING INT, -- не используется INT, -- первая позиция строки данных страницы (для передачи в get_data_day в качестве begin_pos) VARCHAR(32), -- строка отображения страницы INT -- признак окончания навигации (=1) Навигация для данных по бумаге за период CREATE FUNCTION get_data_sets_%%SECTOR%%( begin_pos INT, -- начальная позиция securie VARCHAR(12), -- идентификатор бумаги board VARCHAR(4), -- идентификатор режима торгов (если NULL то все) date_from DATE, -- дата начала периода date_to DATE, -- дата конца периода only_active INT-- если 1 то возвращаются только дни с активностью на рынке (numtrades>0) ) RETURNING INT, -- не используется INT, -- первая позиция строки данных страницы (для передачи в get_data в качестве begin_pos) VARCHAR(32), -- строка отображения страницы INT -- признак окончания навигации (=1) Навигация для данных укрупненных CREATE FUNCTION get_data_group_sets_%%SECTOR%%( begin_pos INT, -- начальная позиция prew_windows INT, -- кол-во предыдущих окон (для правильного формирования номеров страниц) securie VARCHAR(12), -- идентификатор бумаги если NULL то учитывается значение sec_list sec_list VARCHAR(20), -- идентификатор набора бумаг board VARCHAR(4), -- идентификатор режима торгов (если NULL то все) year_show INT, -- год: от 1990 до ... если 0, то все года и не учитываются quart_show и month_show quart_show INT, -- квартал: от 1 до 4 (значение month_show не учитывается) если 0 - то в зав-ти от значения month_show month_show INT -- месяц: от 1 до 12 если 0 - то все месяца ) RETURNING INT, -- не используется INT, -- первая позиция строки данных страницы (для передачи в get_data_group в качестве begin_pos) VARCHAR(32), -- строка отображения страницы INT -- признак окончания навигации (=1) Данные в DBF-формате Сформировать данные по сектору (по бумаге/списку, за дату/период) Должна быть указана или бумага, или список; хотя бы одна дата. CREATE FUNCTION get_dbf ( sector VARCHAR(32), -- сектор sec VARCHAR(12), -- идентификатор бумаги sec_list VARCHAR(20), -- идентификатор набора бумаг board VARCHAR(4), -- идентификатор режима торгов (если NULL то все) date_from DATE, -- дата начала периода date_to DATE, -- дата конца периода only_active SMALLINT, -- если 1 то возвращаются только дни с активностью на рынке (numtrades>0) file_name VARCHAR(255) -- если NULL то функция сама формирует имя файла ) RETURNING VARCHAR(255) -- или разделенные плюсом «+» имя файла без расширения и BLOB-идентификатор, если данные успешно сформированы; или строка, содержащая «NO DATA», если данных за период / дату нет; или NULL, если выборка оказалась слишком большой (больше заданной в настройках оператором) Сформировать данные по сделкам по бумаге, режиму торгов и дате CREATE FUNCTION get_rees_dbf ( sector VARCHAR(32), -- идентификатор сектора sec VARCHAR(12), -- идентификатор бумаги board VARCHAR(4), -- идентификатор режима торгов date_show DATE -- дата торгов ) RETURNING VARCHAR(255) -- или разделенные пробелом имя файла без расширения и BLOB-идентификатор, если данные успешно сформированы; или строка, содержащая «NO DATA», если данных за период / дату нет; или NULL, если выборка оказалась слишком большой (больше заданной в настройках оператором) Сформировать данные за месяц по сектору CREATE FUNCTION get_mobth_dbf ( sector VARCHAR(32), -- сектор month SMALLINT – месяц, îò 1 äî 12 year SMALLINT – год, от 1990 до … ) RETURNING VARCHAR(255) -- или разделенные пробелом имя файла без расширения и BLOB-идентификатор, если данные успешно сформированы; или строка, содержащая «NO DATA», если данных за период / дату нет; или NULL, если выборка оказалась слишком большой (больше заданной в настройках оператором) Календарь: Года существования данных по бумаге/списку бумаг CREATE FUNCTION exist_years_%%SECTOR%% ( sec_list VARCHAR(20), -- ид-р списка бумаг, если NULL, то берется ид-р бумаги securie VARCHAR(12), -- ид-р бумаги (не рассматривается, если sec_list не NULL) board VARCHAR(4) -- ид-р режима торгов (если NULL, то по всем) ) RETURNING INT, -- первый год INT -- последний год Месяца существования данных по бумаге/списку бумаг для указанного года CREATE FUNCTION exist_months_%%SECTOR%%( sec_list VARCHAR(20), -- ид-р списка бумаг, если NULL, то берется ид-р бумаги securie VARCHAR(12), -- ид-р бумаги (не рассматривается, если sec_list не NULL) board VARCHAR(4), -- ид-р режима торгов (если NULL, то по всем) year_for INT -- год ) RETURNING INT, -- первый месяц INT -- последний месяц Дни существования данных по бумаге/списку бумаг для указанных года и месяца CREATE FUNCTION exist_days_%%SECTOR%%( sec_list VARCHAR(20), -- ид-р списка бумаг, если NULL, то берется ид-р бумаги securie VARCHAR(12), -- ид-р бумаги (не рассматривается, если sec_list не NULL) board VARCHAR(4), -- ид-р режима торгов (если NULL, то по всем) year_for INT, -- год month_for INT -- месяц ) RETURNING INT, -- день месяца INT, -- номер дня недели (0 – воскресенье, 1 – понедельник и т.д.) DATE -- дата, если не NULL, то за данный день торги были WITH RESUME Пример вызова: execute function exist_days_securies('EQIN', NULL, NULL, 2001, 11) Ответ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 … 4 5 6 0 1 2 3 4 5 6 0 1 2 3 … 01-11-2001 02-11-2001 05-11-2001 06-11-2001 08-11-2001 09-11-2001 12-11-2001 13-11-2001 …