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