Встроенные функции
Материал из DevelopmenOnTheEdge
Основные функции
Для удобства работы предопределены некоторые функции:
- addDays: создаёт SQL-предложение для получения даты, отличающейся от заданной на указанное количество дней. Требуется два параметра: дата и количество дней
- addMillis: создаёт SQL-предложение для получения даты, отличающейся от заданной на указанное количество миллисекунд. Требуется два параметра: дата и количество миллисекунд.
- addMonths: создаёт SQL-предложение для получения даты, отличающейся от заданной на указанное количество месяцев. Требуется два параметра: дата и количество месяцев.
- chr: создаёт SQL-предложение для нахождения символа по коду (обычно пригождаться не должно, сейчас используется для идентичных метаданных со старым BE).
- coalesce: создаёт SQL-предложение COALESCE.
- concat: создаёт SQL-предложения для конкатенации переданных строк. Пример:
-
SELECT ${concat('name', ' = '?str, 'value')} FROM myDictionary
->
(в MySQL)SELECT CONCAT( name, ' = ', value ) FROM myDictionary
-
- genericRef: создаётся generic-ссылка. Требуется два аргумента: entity и колонка-идентификатор.
- if: создаёт SQL-предложение IF. Требуется три аргумента: условие, значение, если условие истинно, и значение, если условие ложно. Если третий опущен, предполагается пустая строка.
- indexOf: создаёт SQL-предложение для поиска подстроки в строке. Требуется два аргумента: строка и подстрока.
- joinGenericRef: создаёт JOIN-предложение для подключения таблицы через generic reference. Требудется три аргумента: целевая таблица, алиас для неё и колонка-идентификатор.
- length: создаёт SQL-предложение для подсчёта количества символов в строке. Не путайте со стандартным Freemarker-суффиксом ?length, который вычислит длину поданной строки во время выполнения скрипта.
- limit: создаёт SQL-предложение для ограничения числа строк в запросе (если это позволяет СУБД)
- lpad: создаёт SQL-предложение LPAD. Требудется три аргумента: исходная строка, требуемая длина и строка-заполнитель, которая будет использована для удлиннения исходной строки слева в случае необходимости.
- replace: создаёт SQL-предложение REPLACE. Требуется три аргумента: исходная строка, искомая подстрока, строка замены.
- substring: создаёт SQL-предложение SUBSTRING. Требуется три аргумента: исходная строка, номер начального символа, количество символов.
Функции для DDL-манипуляций
Обычно таблицы задаются в BE4 в декларативном стиле в файлах сущностей, и новые таблицы добавляются автоматически при синхронизации. DDL-манипуляции из FTL-скриптов могут потребоваться для обновления таблиц, определённых в старых m4-модулях. В целом манипулировать схемой таблиц из FTL не рекомендуется.
- columnDef(columnName, columnDefinition): создаёт фрагмент SQL-предложения CREATE TABLE или ALTER TABLE для определения колонки. Первый параметр — имя колонки, второй — хэш с её свойствами. Свойства в точности такие же, как в structure.yaml. Пример:
-
ALTER TABLE test ADD COLUMN ${columnDef('myCol', {'type': 'BOOL', 'canBeNull': true})}
->
(в Postgres)ALTER TABLE test ADD COLUMN mycol VARCHAR(3) CHECK(mycol IN ('no', 'yes') )
-
- tableDef(tableName, columns[, indices]): создаёт SQL-предложение для создания новой таблицы (если таблица уже существовала, старая удаляется). Первый параметр — имя таблицы, второй — хэш, где ключи — имена колонок, а значения — хэш со свойствами колонок (как в columnDef). Необязательный третий параметр: список индексов (ключи — имена индексов, значения — хэш, описывающий индекс так же, как в structure.yaml). Пример:
${tableDef('uiSocialBlocks', { 'CODE': {'type': 'VARCHAR(2)', 'primaryKey': true}, 'name': {'type': 'VARCHAR(250)'}, 'parentCode': {'type': 'VARCHAR(2)', 'canBeNull': true} })}
- Результат в Postgres:
DROP TABLE IF EXISTS uisocialblocks; CREATE TABLE uisocialblocks ( code VARCHAR(2) NOT NULL PRIMARY KEY, name VARCHAR(250) NOT NULL, parentcode VARCHAR(2));
- Результат в Oracle:
call drop_if_exists( 'uiSocialBlocks' ); CREATE TABLE UISOCIALBLOCKS ( CODE VARCHAR2(2 CHAR) NOT NULL PRIMARY KEY, NAME VARCHAR2(250 CHAR) NOT NULL, PARENTCODE VARCHAR2(2 CHAR));