VPF::Работа с датами в Firebird — Форум программистов

* Тем не менее ничто не теряется. Вы можете получить дату и время сервера с десятитысячными долями секунды, используя UDF GetExactTimestamp (…) из библиотеки UDF Firebird. Более подробную информацию см. в приложении 1.

Неявное преобразование типов в литералах даты и времени

Когда литералы даты — неважно, обычные или предварительно определенные — используются в SQL в контексте с соответствующим типом даты/времени столбца или переменной, синтаксический анализатор SQL может корректно их интерпретировать без преобразования. При этом в небольшом количестве случаев, когда не существует типизированного значения, которому синтаксический анализатор мог бы присвоить литерал даты, он трактует любой литерал даты как строку.

Например, совершенно верным является затребовать, чтобы запрос SELECT вернул константу, которая не связана ни с каким столбцом в базе данных. Основное «хакерство» в Firebird- использование системной таблицы RDB$DATABASE в запросе, поскольку эта таблица имеет одну и только одну строку, и всегда можно получить скалярное значение: единственное контекстное значение от сервера. Следующие два примера иллюстрируют типичное использование этого приема:

SELECT ‘NOW’ FROM RDB$DATABASE;

Так как запрос возвращает константу, а не значение столбца, ее тип данных интерпретируется как CHAR(3), ‘NOW’. Этот пример

SELECT ‘2.09.2004’ FROM RDB$DATABASE;

вернет CHAR(9), ‘2.09.2004’.

Чтобы получить от синтаксического анализатора правильную интерпретацию литерала даты при условии, что анализатор не может определить тип данных, используйте функцию CAST():

* для диалекта 3:

SELECT CAST(‘NOW’ AS TIMESTAMP) FROM RDB$DATABASE;

SELECT CAST(‘2.09.2004’ AS TIMESTAMP) FROM RDB$DATABASE;

* для диалекта 1:

SELECT CAST(‘NOW’ AS DATE) FROM RDB$DATABASE;

SELECT CAST(‘2.09.2004’ AS DATE) FROM RDB$DATABASE;

Контекстные переменные даты и времени

Контекстные переменные даты и времени CURRENT_DATE, CURRENT_TIME и CURRENT_TIMESTAMP возвращают значение даты и времени, полученные с сервера на момент начала выполнения оператора SQL, содержащего контекстную переменную.

Табл.

10.6 описывает эти переменные.

Таблица 10.6. Контекстные переменные даты и времени

Переменная

Тип диалекта 3

Тип диалекта 1

Значение

CORRENT_TIMESTAMP

TIMESTAMP

DATE

Текущая дата и время, округленное до секунд. Дробная часть секунд всегда возвращается равной ‘.0000’

CURRENT_DATE

DATE

Не поддерживается

Текущая дата

CURRENT_TIME

TIME

Не поддерживается

Текущее время, выраженное в часах, минутах и секундах после полуночи. Дробная часть секунд всегда возвращается равной ‘ .0000’

Операции, использующие значения даты и времени

Использование арифметических операций в манипулировании данными, в вычислениях и в отношениях между двумя датами были ранее рассмотрены в разд. «Интервал времени» этой главы. Возможность вычитания значения более ранней даты, времени или даты-времени из более поздней существует благодаря способу хранения типов дата и время в Firebird. Способ хранения использует одно или два 32-битовых целых для даты/времени, только для даты или только для времени дня. Данные, представленные в этих числах, являются днями в длинном слове даты и дробной частью дней в слове времени. Дата представлена количеством дней с «нулевой даты»- 17 ноября 1898 г[26]. Время представлено в десятитысячных долях секунд, прошедших с полуночи.

В диалекте 3 DATE хранит только дату. В диалекте 3 TIME хранит только время. TIMESTAMP и в диалекте 1 DATE хранят обе части.

С этими числовыми структурами можно довольно просто оперировать, используя несложные выражения сложения и вычитания для вычисления разницы во времени (интервал), увеличения или уменьшения дат, установления диапазонов даты или времени. В табл. 10.7 описываются доступные операции и получаемые результаты.

Таблица 10.7. Арифметические операции для типов данных даты и времени

Операнд 1

Оператор

Операнд 2

Результат

DATE

+

TIME

TIMESTAMP (арифметическая конкатенация)

DATE

+

Числовое значение n**

DATE, увеличенная на n целых дней (игнорируется дробная часть n, если указана)

TIME

+

DATE

TIMESTAMP (арифметическая конкатенация)

TIME

+

Числовое значение n**

TIME, увеличенное на n секунд*

TIMESTAMP

+

Числовое значение n**

TIMESTAMP, где дни увеличены на целую часть числа n плюс дробная часть числа n (если указана) как количество десятитысячных долей секунды в дне (8.64 x 10(^5^))

DATE

DATE

Количество дней в интервале: DECIMAL(9,0)

DATE

Числовое значение N**

DATE, уменьшенная на n дней (игнорируется дробная часть n, если указана)

TIME

TIME

Количество секунд в интервале: DECIMAL(9,4)

TIME

Числовое значение n**

TIME, уменьшенное на n секунд*

TIMESTAMP

TIMESTAMP

Количество дней и части дня в интервале: DECIMAL (18, 9)

TIMESTAMP

Числовое значение n**

TIMESTAMP, где дни уменьшены на целую часть числа n плюс дробная часть числа n (если указана) как количество десятитысячных долей секунды в дне (8.64×10(^5^))

* При необходимости повторяется (result=modulo(result, (24*60*60))) пока не будет выделена результирующая часть дней.

** В диалекте 3 для типа DATE n является целым, представляющим количество дней.

Для типов данных TIMESTAMP и для диалекта 1 DATE n может быть числом, представляющим количество дней слева от десятичной точки (целая часть) и части дня справа от десятичной точки (дробная часть). Для типа TIME n является целым числом, представляющим количество секунд.

Общие правила для операций

Одно значение даты или времени может быть вычтено из другого, если:

* оба значения имеют один и тот же тип даты/времени;

* первый операнд является более поздним, чем второй.

Вычитание, использующее типы дата/время, дает результаты: масштабируемое DECIMAL в диалекте 3 и DOUBLE PRECISION В диалекте 1.

Типы данных дата/время не могут складываться друг с другом. Однако можно выполнить конкатенацию части даты и части времени, используя:

* дополнительный бинарный синтаксис для конкатенации пар полей или переменных;

* объединение строк для конкатенации литерала дата/время с другим литералом дата/время или с полем, или переменной типа дата/время.

Операции умножения и деления, включающие типы данных дата/время, недопустимы.

Выражения в качестве операндов

Операндом при увеличении или уменьшении значения TIMESTAMP, TIME, DATE или DATE в диалекте 1 может быть константа или выражение. Выражение может быть особенно полезным в ваших приложениях, когда вам надо увеличить или уменьшить значение в секундах, минутах, часах или, например, требуется половина дня, а не целое количество дней.

Диалект 3 использует правило SQL-92 для деления целого на целое: результатом всегда будет целое, округленное при необходимости в меньшую сторону. При использовании выражений в диалекте 3 убедитесь, что один из операндов является действительным числом с достаточным количеством десятичных знаков, чтобы избежать возможной арифметической ошибки или потери точности результата при выполнении целочисленного деления SQL-92.

В табл. 10.8 показаны некоторые примеры.

Таблица 10.8. Примеры использования выражений в качестве операндов

Вводимый операнд n

Сложение или вычитание

Альтернатива

В секундах

n/86400.0

(n*1,0)/(60* 60*24)

В минутах

n/1440.0

(n*1.0)/(60*24)

В часах

n/24.0

Зависит от желаемого результата. Например, если n=3, а делитель для половины дня — 2, результат будет 1, а не 1.5

Половина дня

n/2

То же

Методические указания к лабораторной работе №4

по курсу «Базы данных»

CИСТЕМА БЕЗОПАСНОСТИ Firebird

В этой методичке кратко описываются основные понятия системы безопасности СУБД Firebird1.5.

Определения:

Пользователь– это регистрационная запись на сервере, состоящая из имени пользователя (username) и пароля (password). Имя пользователя состоит из латинских букв (большие и маленькиенеразличаются) и цифр, длиной до 31 символа.

Пароль состоит из латинских букв и цифр (большие и маленькие буквыразличаются), длиной до 8 символов (теоретически длина до 32 символов, однако используются первые 8, остальные игнорируются).

Есть один стандартный пользователь с именем SYSDBAи паролем (при установке сервера)masterkey, точнееmasterke. Это системный администратор СУБД. Его нельзя удалить или понизить его права, можно только сменить пароль.

Понятие «пользователь» было задумано, чтобы каждый человек, работающий с базой данных, имел персональный usernameи пароль. Когда сотрудник увольняется, удаляется соответствующий «пользователь», и далее он уже не может работать с базой.

Вся информация о пользователях хранится в системной базе данных isc4.gdb.Создавать новых пользователей черезIBExpertнельзя. Для этого имеется утилитаgsec.exe(лежит в каталогеBINдиректории, где установленFirebird). Опишем работу с ней.

1. Запуститеcmd.exe

2. В консоли перейдите в каталогFirebird\bin. Запустите с командной строки команду

C:\Program Files\Firebird\bin>gsec.exe –user sysdba –password masterkey

Если пароль masterkeyбыл сменен, указывается текущий пароль пользователяSYSDBA.

3. Программаgsecперейдет в интерактивный режим – появится приглашение

GSEC>

после которого можно вводить любые команды:

quit– выйти из программы;

help– вывести справку по командам;

display– вывести список всех зарегистрированных пользователей;

display имя_пользователя– вывести информацию о пользователе;

delete имя_пользователя– удалить пользователя;

add имя_пользователяпараметры– добавить нового пользователя;

modify имя_пользователяпараметры– изменить настройки пользователя;

в последних двух командах параметрымогут указываться такие:

–pw пароль

–fname first_имя

–mname middle_имя

–lname last_имя

–uid значение_uid

–gid значение_gid

Например, для регистрации пользователя с ником IVAN, именемIvanFedorovи паролем 123 вводится команда

GSEC> add ivan –pw 123 –fname Ivan –lname Fedorov

Роли(ROLE), или категории пользователей – это группы пользователей, обладающих одинаковыми правами на доступ к данным. Обычно заводят столько ролей, сколько должностей в организации. Сотрудники с одинаковыми ролями (должностями) имеют доступ к одному и тому же ограниченному набору данных. Когда приходит новый сотрудник, егоusernameвключают в роль, соответствующую его должности, и уровню «секретности».

Роли действуют в пределах своей базы данных.

Существует две стандартных роли: PUBLIC(роль с минимальными правами доступа, в нее автоматически входят все новые пользователи) иOWNER(создатель базы данных, максимальные права).

Новая роль создается SQL-командой

CREATE ROLE ИмяРоли

Или роли можно создавать в IBExpert, щелкая на вкладкеROLES(NewRole…).

Каждый пользователь (username) в базе данных может сопоставляться с одной или несколькими ролями, при подключении к БД он выбирает нужную роль. Присвоить роль пользователю можноSQL-командой

GRANTИмя_роли TOИмя_пользователя;

Права(permissions) – это разрешение пользователям или ролям осуществлять какое-то действие над таблицей, представлением или хранимой процедурой. Регламентируются следующие действия:

1. Для таблиц целиком и отдельных столбцов таблиц:

SELECT– право читать данные,INSERT– право добавлять строки;UPDATE – модификация данных;DELETE– право удалять строки;REFERENCES– право создаватьForeignKey, ссылающийся на эту таблицу.

2. Для представлений (view) и их столбцов:SELECT,

Права на изменение данных в представлениях (INSERT,UPDATE,DELETE) фактически относятся либо к триггерам, которые делают представление модифицируемым, либо к таблицам, на которых основано представление.

3. Для хранимых процедур: EXECUTE– право на выполнение процедуры.

Если пользователю выдаются права на объекты, которые ссылаются на другие объекты, то аналогичные права должны быть выданы и на ссылочные объекты. Например, если какой-то роли выдано право на запуск хранимой процедуры, вставляющей строки в какую-то таблицу, то роль должна обладать правом INSERTна эту таблицу.

Права выдаются SQL-оператором

GRANT список_прав ON Имя_объекта TO Имя_пользователя или роли

Можно использовать вместо списка прав слово ALL– выдать все права.

Например, для роли TEACHERвыдаются права на просмотр строк в таблицеStudentsи модификацию столбца (Diploma_Theme):

GRANT SELECT ON Students TO TEACHER;

GRANT UPDATE ON Students(Diploma_Theme) TO TEACHER;

Выдавать права можно с помощью IB Expert.

Права можно выдавать как отдельным пользователям, так и ролям. Использование ролей упрощает администрирование. Вместо того, чтобы выдавать одинаковые права каждому пользователю в отдельности, достаточно создать роль, выдать на нее права и включить пользователя в эту роль.

Кто-нибудь подключался из 1С к базе firebird?

Я
   baands

 

03.08.17 — 16:45

Здравствуйте, коллеги Есть такая ситуация, база firebird лежит в сети, пытаюсь подключиться к ней из1С (код ниже), отваливается с ошибкой
Невозможно установить соединение с Firebird:
{ВнешняяОбработка.ЛВР_ЗагрузкаИзКассПрямоеПодключение.Форма.Форма.Форма(18)}: Ошибка при вызове метода контекста (Open): Произошла исключительная ситуация (Microsoft OLE DB Provider for ODBC Drivers): [Microsoft][Диспетчер драйверов ODBC] Источник данных не найден и не указан драйвер, используемый по умолчанию

Драйвер ставил, пытался даже ставить базу на рабочем месте, подключаться к ней, та же ошибка.

Утилиты для работы с бд подключаются без проблем. Например: DatabaseBrowserPortable.exe   Т.е. база доступна для подключения

Соединение      = Новый COMОбъект("ADODB.Connection");     Команда         = Новый COMОбъект("ADODB.Command");     НаборЗаписей    = Новый COMОбъект("ADODB.RecordSet");     Соединение.ConnectionString     = "DRIVER=Firebird/InterBase® driver; DBNAME=192.168.151.225:D:\CR\MAIN.GDB;UID=sysdba;PWD=masterkey";     Соединение.ConnectionTimeOut    = 1200;     Соединение.CursorLocation       = 3;     try         Соединение.Open(Соединение.ConnectionString);         Сообщить("Соединение успешно уставнолено !!!");     except         Сообщить("Невозможно установить соединение с Firebird:         | "+ОписаниеОшибки());         Возврат;     endtry; Помогите, не знаю, куда копнуть

 
 
   Garykom

 

1 — 03.08.17 — 16:51

1С запускать с админскими правами!!!
http://firebirdsql.su/doku.php?id=podkljuchenie_k_baze_dannyx_iz_1s

   Garykom

 

2 — 03.08.17 — 16:52

(1)+ Попробуй источник данных создать http://break-people.ru/cmsmade/index.php?page=ado-interbase-firebird

   dezss

 

3 — 03.08.17 — 16:54

Не указан порт, + SYSDBA…большими буквами же, вроде должно быть

   baands

 

4 — 03.08.17 — 17:09

(1) Спасибо, статью тоже нашёл, оказывается пропустил слэш в имени базы и не указывал библиотеку
(3) Порт не обязателен, регистр тоже неважен, под этими данными менеджеры подключаются. Вам тоже спасибо

   baands

 

5 — 03.08.17 — 17:11

Хотя не, слэш не влияет, библиотеку просто надо подрубить, но это ни в одной статье до этого не было ((

   Масянька

 

6 — 03.08.17 — 17:14

(5) Ты — конченный человек :)))))))) (ШУТКА)
У меня муж сидит ковыряет — уже 2 недели засыпаю в обнимку с подушкой 🙂

   baands

 

7 — 03.08.17 — 17:19

(6) Тоже самое ковыряет? 🙂

   baands

 

8 — 03.08.17 — 17:19

У меня тоже вторая неделя пошла 🙂 Жена, ты ли это? ))))) Шучу 🙂

   Масянька

 

9 — 03.08.17 — 17:20

(7) С эской не связано. Делфи.

   baands

 

10 — 03.08.17 — 17:20

(9) Значит сегодня сможешь обнять мужа ))

 
 

   Масянька

 

11 — 03.08.17 — 17:22

(10) Не… Меня уже поставили перед фактом 🙁
Ничё… Скалку скоро возьму :)))))

   Torquader

 

12 — 04.08.17 — 03:21

Чего у вас с FireBird не летает ?
ODBC-драйвер поставили ?
Про битность драйвера и платформы не забыли (должна быть равна).
Имя драйвера в строке подключения вписали ?

Если к "жареной курице" лезем по сети, то нужно посмотреть, а не ограничили ли её в конфиге на приём запросов по сети.

P.S. сколько "курицу пасу" ни разу не было такого, что нельзя было подключиться, причём не важно, с какого языка программирования.

Функция ефПодключитьFireBird(псткНастройки,побПодключение)Экспорт     ПЕРЕМ лстрСервер;     ПЕРЕМ лстрБаза;     ПЕРЕМ лстрПользователь;     ПЕРЕМ лстрПароль;     Если НЕ псткНастройки.Свойство("Сервер",лстрСервер)Тогда         лстрСервер="127.0.0.1";     КонецЕсли;     Если НЕ псткНастройки.Свойство("База",лстрБаза)Тогда         епСообщениеОбОшибке("Не указана база, к которой выполняется подключение");         Возврат ЛОЖЬ;     КонецЕсли;     Если НЕ псткНастройки.Свойство("Пользователь",лстрПользователь)Тогда         лстрПользователь="SYSDBA";     КонецЕсли;     Если НЕ псткНастройки.Свойство("Пароль",лстрПароль)Тогда         лстрПароль="masterkey";     КонецЕсли;     Попытка         побПодключение=Новый COMОбъект("ADODB.Connection");     Исключение         епСообщениеОбОшибке("Ошибка при создании объекта доступа в базам данных:"+ОписаниеОшибки());         Возврат ЛОЖЬ;     КонецПопытки;     Если Найти(лстрСервер,"""")>0 Тогда         епСообщениеОбОшибке("В имени сервера нельзя использовать кавычки");         Возврат ЛОЖЬ;     КонецЕсли;     Если Найти(лстрБаза,"""")>0 Тогда         лстрБаза=СтрЗаменить(лстрБаза,"""","""""");     КонецЕсли;     Попытка         побПодключение.Open("Driver=Firebird/Interbase(r) driver;Dialect=3;CHARSET=UTF-8;DBNAME="+лстрСервер+":"+лстрБаза+";",лстрПользователь,лстрПароль);     Исключение         епСообщениеОбОшибке("Не удалось выполнить подключение к серверу:"+ОписаниеОшибки());         Возврат ЛОЖЬ;     КонецПопытки;     Возврат ИСТИНА; КонецФункции

   Дебет

 

13 — 04.08.17 — 04:14

(0)попробуй подключиться IBEXPERTOM что бы быть увереным что со своего пк можешь подкл.Да еще ставлю всегда для подключения ibgem-site

   mikeA

 

14 — 04.08.17 — 04:59

(0) Подключался через внешнии источники данных.

Сначала были танцы с бубном, какие уж точно и не вспомню, но потом всё заработало.
Очень удобно что видно всю структуру базы, работает быстро и стабильно.

Только реквизиты через точку не надо получать)

   baands

 

15 — 08.08.17 — 12:18

(12) Вопрос решен. Вопрос был с прописанием в строке подключения адреса библиотеки
(13) Да, согласен, первое, что проверил. Я подключался к базе вот этой штукой DatabaseBrowserPortable

Вот такая строка в итоге Соединение.ConnectionString = "Driver=Firebird/InterBase(r) driver;" +      "Dbname=<ip компа в сети и порт>:<путь>\MAIN.GDB;" + &nbsp// Исправьте на свой IP, порт и путь к базе данных !      "UID=SYSDBA;" +                                    // Исправьте на свое имя пользователя !      "PWD=masterkey;" +                                 &nbsp// Исправьте на правильный пароль !      "CHARSET=WIN1251;" +                               &nbsp// Исправьте на свою кодировку подключения !!!      "client=C:\Program Files (x86)\FireBird\FireBird_2_1\BIN\fbclient.dll";

   v77

 

16 — 08.08.17 — 12:21

офигеть работнички. неделю к базе коннектились 🙂

   Два Плюс Два

 

17 — 08.08.17 — 12:32

(17) Завтра напишут: FBI раскрыта группа русских хакеров, которые неделю пытались подключиться к архивам Пентагона…

 

Автоматизируйте рутинные операции с базами 1С через пакетный режим конфигуратора.

ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку «Обновить» в браузере.

Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.

SUBSTRING()

SUBSTRING() является внутренней функцией, реализующей функцию ANSI SQL SUBSTRING(). Она возвращает поток, состоящий из байта с номером начальная-позиция и всех последующих байтов до конца строки значение. Если указано необязательное предложение FOR длина, она вернет меньшее из длина байт и количество байт до конца входного потока.

Доступность

DSQL, PSQL, ISQL, ESQL, Firebird 1.5 и выше. Любая платформа.

Синтаксис

SUBSTRING(значение FROM начальная-позиция [FOR длина])

Необязательные ключевые слова

Необязательное предложение FOR задает длину возвращаемой подстроки.

Аргументы

значение может быть любым выражением, константой или идентификатором столбца, который преобразуется в строку.

начальная-позиция должна преобразовываться в целое >= 1. Не может быть заменяемым параметром.

длина должна преобразовываться в целое >= 1.

Не может быть заменяемым параметром.

Возвращаемое значение

Возвращаемое значение является строкой.

Замечания

Значения начальная-позиция и длина являются позициями байтов, что имеет значение для многобайтовых наборов символов.

Для строкового аргумента функция будет обрабатывать любой набор символов.

Вызывающий оператор ответственен за обработку всех проблем, связанных с многобайтовыми наборами символов.

Для аргументов столбцов BLOB указанный столбец должен быть двоичным BLOB (SUB_TYPE 0) или текстовым BLOB (SUB_TYPE 1) с набором символов один байт на символ. В настоящий момент функция не обрабатывает текстовые BLOB с наборами символов Chinese (максимум два байта на символ) и Unicode (максимум три байта на символ).

Пример

Следующий оператор будет изменять значение столбца COLUMNB, присваивая ему строку до 99 символов, начиная с четвертой позиции оригинальной строки:

UPDATE ATABLE

SET COLUMNB = SUBSTRING (COLUMNB FROM 4 FOR 99)

WHERE …

Связанные или похожие функции

См. также внешние функции SUBSTR(), SUBSTRLEN() и RTRIM().

UPPER()

Преобразует все символы строки в верхний регистр.

Доступность

DSQL, PSQL, ISQL, ESQL; обеспечивает работу со строками в тех наборах символов и последовательностях сортировки, которые поддерживают преобразование нижний/верхний регистры. Любая платформа.

Синтаксис

UPPER(значение)

Аргументы

значение является столбцом, переменной или выражением, которое преобразуется в строковый тип.

Возвращаемое значение

Если набор символов и последовательность сортировки поддерживают преобразование в верхний регистр, функция возвращает строку, в которой все символы преобразованы в верхний регистр. Строка имеет ту же длину, что и входное значение. Для наборов символов, не поддерживающих преобразование в верхний регистр, функция возвращает неизмененное входное значение,[76]

Замечания

Входное значение не может иметь тип данных BLOB.

Пример

Следующее ограничение CHECK проверяет входную строку, выясняя, содержит ли она все символы в верхнем регистре:

ALTER TABLE MEMBERSHIP

ADD CONSTRAINT CHECK_LOCALITY_CASE

CHECK(LOCALITY = UPPER(LOCALITY));

Связанные или похожие функции

См. также внешние функции LOWER() и F_PROPERCASE().

Функция для получения значения генератора

Функция GEN_ID() является механизмом, с помощью которого модули PSQL и приложения получают числа от генераторов. Генераторы подробно обсуждаются в главе 9. См. также разд. «Реализация автоинкрементных ключей» главы 31.

GEN_ID()

GEN_IDO вычисляет и возвращает значение генератора.

Доступность

DSQL, PSQL, ISQL, ESQL, Firebird 1.5 и выше. Любая платформа. Синтаксис

GEN_ID(значение1, значение2)

Аргументы

значение1 является идентификатором существующего генератора.

значение2 является значением шага — целый тип или выражение, которое преобразуется в целый тип.

Возвращаемое значение

Возвращается значение типа BIGINT.

Замечания

Обычно значение шага- единица. Значение шага 0 вернет последнее значение генератора. Возможно большее значение шага, так же как и отрицательное значение. При этом вам не следует использовать отрицательные значения, если только вы действительно не хотите получить последующее значение.

GEN_IDO всегда выполняется вне контекста какой-либо транзакции. Эта операция в Firebird доступна только пользователю. Как только число будет получено от генератора, оно никогда не будет создано тем же генератором, за исключением случаев, когда пользователь изменит последовательность, используя отрицательную величину шага, или с помощью оператора SET GENERATOR.

Пример

Следующий оператор возвращает новое значение генератора GEN_SERIAL:

SELECT GEN_ID(GEN_SERIAL, 1) FROM RDB$DATABASE;

В приведенном далее примере генератор используется в триггере BEFORE INSERT для получения значения первичного ключа:

CREATE TRIGGER BI_AUTHORS FOR AUTHORS

ACTIVE BEFORE INSERT POSITION 0

AS

BEGIN

IF (NEW.AUTHOR_ID IS NULL) THEN

NEW.AUTHOR_ID = GEN_ID(GEN_AUTHOR_ID, 1);

END ^

Агрегатные функции

Агрегатные (обобщенные) функции выполняют вычисления над значениями столбца, например, значениями, выбранными из числового столбца запрашиваемого набора.

Firebird имеет группу агрегатных функций, которые чаще всего используются в комбинации с условиями группирования для вычисления итогов или статистики на уровне группы. Агрегатными функциями являются: SUM(), вычисляющая итог, MAX() и MIN(), возвращающие наибольшее и наименьшее значение соответственно, и AVG(), вычисляющая среднее значение. Функция COUNT() также ведет себя как агрегатная функция в сгруппированных запросах.

В главе 23 более подробно рассматривается участие агрегатных функций в сгруппированных запросах.

«Негруппированные» объединения

В небольшом количестве случаев агрегатные функции могут оперировать с наборами, которые не являются субъектами предложения GROUP BY и возвращающими не более одной строки.

Логически результат подобного запроса не может выводить значения любого столбца базы данных или значения, полученные от неагрегатных функций. Для иллюстрации рассмотрим следующий запрос, который объединяет бюджеты одного проекта за один фискальный год. Таблица имеет одну запись бюджета для каждого из пяти отделов:

SELECT

‘MKTPR-1994’ AS PROJECT,

SUM(PROJECTED_BUDGET) AS TOTAL_BUDGET

FROM PROJ_DEPT_BUDGET

WHERE PROJ_ID = ‘MKTPR’ AND FISCAL_YEAR = 1994;

Выходом будет одна строка: строковое поле времени выполнения и вычисленный итог.

Внешние функции (UDF)

Внешние функции являются вспомогательными программами, написанными на языке программирования, таком как С, C++ или Pascal, и скомпилированными как совместно используемые двоичные библиотеки- DLL в Windows или совместно используемые объекты для других платформ, которые поддерживают динамическую загрузку. Как и стандартные встроенные функции SQL, внешние функции могут быть разработаны для выполнения преобразований или вычислений, реализация которых либо слишком сложна, либо вовсе невозможна средствами языка SQL.

Вы можете использовать внешние функции, используя их в выражениях, так же, как вы используете встроенные функции SQL. Как и внутренние функции, они могут возвращать значения для переменных или выражений SQL в хранимых процедурах и триггерах.

Фрагмент «определенные пользователем» в названии функций означает, что вы можете писать свои собственные функции. Возможности создания пользовательских функций для вашего сервера Firebird ограничиваются лишь вашей изобретательностью и умением программировать на включающем языке. Допустимо включение статистических, строковых, математических функций, функций даты, подпрограмм форматирования данных и даже пользовательского процессора для выполнения регулярных выражений (regular expression, regexes).

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

Форум: «Базы»;
Поиск по всему сайту: www.delphimaster.net;
Текущий архив: 2005.10.30;
Скачать: [xml.tar.bz2];

Вниз

Длина строки в Firebird 1.5 

Rule ©   (2005-09-20 16:23) [0]

необходима функция длины строки, ну допустим чтоб сделать такой запрос select length(field1) from table1 …
спасибо всем за помощь …
неужели только УДФ ???


Rule ©   (2005-09-20 16:24) [1]

забыл главное :-))), доки уже перерыл :-)))


Desdechado ©   (2005-09-20 16:26) [2]

ib_udf


Johnmen ©   (2005-09-20 16:28) [3]

Не обязательно удф, но чуть-чуть кода в хп, можно…


Rule ©   (2005-09-20 16:32) [4]

Desdechado ©   (20.09.05 16:26) [2]
ща поищу, но вроед смотрел …


Rule ©   (2005-09-20 16:33) [5]

Johnmen ©   (20.09.05 16:28) [3]
а подтолкнуть на мысль как это сделать ???


Rule ©   (2005-09-20 16:36) [6]

Johnmen ©   (20.09.05 16:28) [3]

нашел

CREATE PROCEDURE Len (str VARCHAR(100))
 RETURNS (len INTEGER) AS
DECLARE VARIABLE pat VARCHAR(100);
BEGIN
 len = null;
 IF (str IS NULL) THEN EXIT;

 pat = "";
 len = 0;
 WHILE (NOT str LIKE pat) DO BEGIN
   pat = pat || "_";
   len = len + 1;
 END
END


Rule ©   (2005-09-20 16:36) [7]

Desdechado ©   (20.09.05 16:26) [2]

посмотрел не нашел ???, мож подскажешь ???


Johnmen ©   (2005-09-20 16:43) [8]

Можно ещё так попробовать (не уверен насчет работоспособности параметра в сабстринге для FB1.5):


Rule ©   (2005-09-20 16:53) [9]

Johnmen ©   (20.09.05 16:43) [8]
ну я думаю так будет дольше …


Johnmen ©   (2005-09-20 16:55) [10]

>Rule ©   (20.09.05 16:53) [9]
>ну я думаю так будет дольше …

Я думаю, что нет.
Да и не важно это — экономить на спичках 🙂


Desdechado ©   (2005-09-20 16:58) [11]

DECLARE EXTERNAL FUNCTION strlen
CSTRING(4096)
RETURNS INTEGER BY VALUE
ENTRY_POINT "IB_UDF_strlen" MODULE_NAME "ib_udf";
UDF — самое быстрое решение


Rule ©   (2005-09-20 17:15) [12]

Desdechado ©   (20.09.05 16:58) [11]
спасибо, действительно самое быстрое решение, с этим я согласен …

токо вот в сторедах преимущество, что после восттановления базы не надо опять объявлять внешнюю функцию …


Андрей Жук ©   (2005-09-20 17:40) [13]


> токо вот в сторедах преимущество, что после
> восттановления базы не надо опять объявлять внешнюю
> функцию …

UDF также не нужно опять объявлять


Desdechado ©   (2005-09-20 17:52) [14]

в ХП другое преимущество — права
а с восстановлением проблемы только тогда, когда dll отсутствует


Rule ©   (2005-09-20 17:59) [15]

Андрей Жук ©   (20.09.05 17:40) [13]
эта имел ввиду что надо наличие длл или со на сервере


Rule ©   (2005-09-20 18:00) [16]

Desdechado ©   (20.09.05 17:52) [14]
в ХП другое преимущество — права

кстати да, но думаю в данном случае это не актуально


Андрей Жук ©   (2005-09-20 18:38) [17]


> эта имел ввиду что надо наличие длл или со на сервере

ib_udf — в штатной поставке firebird/interbase


Rule ©   (2005-09-20 19:04) [18]

Андрей Жук ©   (20.09.05 18:38) [17]
эт я знаю, опять жеж шла речь не о конекретно этой удф, а о целесообразности подключать удф или писать сторед …


Форум: «Базы»;
Поиск по всему сайту: www.delphimaster.net;
Текущий архив: 2005.10.30;
Скачать: [xml.tar.bz2];

Наверх

Память: 0.75 MB
Время: 0.041 c

Добавить комментарий

Закрыть меню