Встроенные функции — различия между версиями
Материал из DevelopmenOnTheEdge
								
												
				Lan  (обсуждение | вклад)  | 
				Lan  (обсуждение | вклад)   (→Функции для DDL-манипуляций)  | 
				||
| Строка 19: | Строка 19: | ||
=== Функции для DDL-манипуляций ===  | === Функции для DDL-манипуляций ===  | ||
| − | Обычно таблицы задаются в BE4 в декларативном стиле в   | + | Обычно таблицы задаются в BE4 в декларативном стиле в файлах [[entity|сущностей]], и новые таблицы добавляются автоматически при синхронизации. DDL-манипуляции из FTL-скриптов могут потребоваться для обновления таблиц, определённых в старых m4-модулях. В целом манипулировать схемой таблиц из FTL не рекомендуется.  | 
* '''columnDef(columnName, columnDefinition)''': создаёт фрагмент SQL-предложения CREATE TABLE или ALTER TABLE для определения колонки. Первый параметр — имя колонки, второй — хэш с её свойствами. Свойства в точности такие же, как в structure.yaml. Пример:  | * '''columnDef(columnName, columnDefinition)''': создаёт фрагмент SQL-предложения CREATE TABLE или ALTER TABLE для определения колонки. Первый параметр — имя колонки, второй — хэш с её свойствами. Свойства в точности такие же, как в structure.yaml. Пример:  | ||
Текущая версия на 15:31, 2 ноября 2015
Основные функции
Для удобства работы предопределены некоторые функции:
- 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));