---
order: 9
navTitle: sqlTemplates
---
# sqlTemplates - SQL模板配置

配置扩展数据库连接器支持的SQL模板。

每一个SQL模板用于在数据库实现一个特定的功能，兼容各个数据库时会对不同的数据库配置一系列的SQL模板。一般可以直接写入SQL，若功能较为复杂，一般通过[Freemaker](https://freemarker.apache.org/docs/)文件实现SQL模板。

```json
	"sqlTemplates": {
		"getSchemas":"...",
		"getProcedures": "...",
		"getProcedureMeta": "...",
        "dropTableIfExists": "...",
        "dropViewIfExists": "...",
        "renameTable": "...",
		"getTableDDL":"...",
		"getViewDDL": "...",
		"getProcedureDDL": "...",
		"nullFirstDescOrder": "...",
		"getTableTriggers": "...",
		"getTriggerMeta": "...",
		"getTableStorageSpace": "...",
		"insertOnDuplicate": "...",
		"mergeInto": "...",
		"createTable": "...",
		"alterTable": "...",
		"createView": "..."
	}

```

:::tip 提示
SQL模板也支持使用sql文件进行
:::

## 配置选项{#properties}

### getSchemas{#getschemas}

查询当前数据库的schema列表。通常查询数据库的schema列表会调用驱动的`getSchemas()`函数，有些数据库的驱动没有实现这个方法，或者返回空列时，需要执行一个SQL来获取schema列表。

SQL示例：

```sql
SELECT SCHEMA_NAME AS TABLE_SCHEM, CATALOG_NAME AS TABLE_CATALOG FROM INFORMATION_SCHEMA.SCHEMATA;
```

字段列：

- `TABLE_SCHEM`：String  schema名称。
- `TABLE_CATALOG`：String 列表名称。

### getProcedures{#getprocedures}

返回查询存储过程列表的SQL。

示例：

```sql
SELECT ROUTINE_SCHEMA AS PROCEDURE_SCHEMA,SPECIFIC_NAME AS PROCEDURE_NAME,ROUTINE_DEFINITION AS TEXT FROM information_schema.Routines where ROUTINE_TYPE = 'PROCEDURE' [AND ROUTINE_SCHEMA='?1'] order by ROUTINE_SCHEMA,SPECIFIC_NAME,ROUTINE_DEFINITION;
```

字段列：

- `PROCEDURE_SCHEMA`：string 存储过程所在SCHEMA名称
- `PROCEDURE_NAME`：string 存储过程名称
- `TEXT`：string 存储过程内容

SQL模板参数：

1. `storeSchema`：存储过程所在schema，如果是默认schema也会返回默认schema的名字。
2. `scheam`：当前schema，如果是默认schema则返回空值。

### getProcedureMeta{#getproceduremeta}

返回一个查询存储过程元数据内容的SQL，SQL中也会包括参数信息。

示例：

```sql
SELECT ROUTINE_DEFINITION AS TEXT FROM information_schema.Routines where ROUTINE_TYPE = 'PROCEDURE' [AND ROUTINE_SCHEMA='?1'] order by ROUTINE_SCHEMA,SPECIFIC_NAME,ROUTINE_DEFINITION;
```

SQL模板参数：

1. `procedure` 目标存储过程名。
2. `schema` 当前Schema，如果是默认schema则返回空值。
3. `procedureName` 不含schema的存储过程名。
4. `storeSchema` 存储过程所在的schema，如果是默认schema也会返回默认schema的名字。

### dropTableIfExists{#droptableifexists}

删除一个物理表（如果表已存在）。

示例：

```sql
DROP TABLE IF EXISTS ?;
```

SQL模板参数：

1. `table`：目标表名。
2. `schema`：当前Schema，如果是默认schema则返回空值。
3. `tableName`：不含schema的表名。
4. `storeSchema` 目标表所在schema，如果是默认schema也会返回默认schema的名字。

### dropViewIfExists{#dropviewifexists}

删除一个视图（如果视图已存在）。SQL模板参数参考[dropTableIfExists](#droptableifexists)属性。

示例：

```sql
DROP VIEW IF EXISTS ?;
```

### renameTable{#renametable}

将指定schema下的表更名，更名为另一个表名，新的表也在原来的schema下。

```sql
RENAME TABLE ? to ?;
```

SQL模板参数：

1. oldTable 目标表表名，见{@link SQLTemplateParam\_Identifier}。
2. newTable 新表名，见{@link SQLTemplateParam\_Identifier}。
3. schema 原表所在schema，如果是默认schema则返回空值。
4. oldTableName 原表名，表名不包含schema。
5. newTableName 新表名，表名不包含schema。

### getTableDDL{#gettableddl}

返回一个目标表的ddl语句，通常为`create table ...`语句。SQL模板参数参考[dropTableIfExists](#droptableifexists)属性。

示例：

```sql
SHOW CREATE TABLE ?;
```

:::tip 提示

1. 若配置了此SQL模板，则使用此SQL模板的结果当作ddl。
2. 若未配置此SQL模板，会使用[createTable](#createtable)模板的返回ddl结果。
   :::

### getViewDDL{#getviewddl}

返回一个目标视图的DDL语句，通常为`create view ...`语句。SQL模板参数参考[dropTableIfExists](#droptableifexists)属性。

示例：

```sql
SHOW CREATE VIEW ?;
```

### getProcedureDDL{#getprocedureddl}

返回一个查询存储过程的DDL的SQL语句。

示例：

```sql
SHOW CREATE PROCEDURE ?;
```

SQL模板参数：

1. `procedure`：目标存储过程名
2. `schema`：当前Schema，如果是默认schema则返回空值。
3. `procedureName`：不含schema的存储过程名
4. `storeSchema`：存储过程所在schema，如果是默认schema也会返回默认schema的名字。

### nullFirstDescOrder{#nullfirstdescorder}

返回一个根据字段排序的sql。

示例：

```sql
?1 is null desc, ?1 desc;
```

SQL模板参数：
`column`：排序字段名

### getTableTriggers{#gettabletriggers}

返回一个查询触发器信息的SQL。SQL模板参数参考[dropTableIfExists](#droptableifexists)属性。

示例：

```sql
select TRIGGER_NAME,ACTION_STATEMENT TRIGGER_BODY,EVENT_OBJECT_TABLE TABLE_NAME,TRIGGER_SCHEMA,EVENT_OBJECT_SCHEMA from information_schema.TRIGGERS Where EVENT_OBJECT_SCHEMA='?1' and EVENT_OBJECT_TABLE='?2'
```

字段列：

- `TRIGGER_NAME`：String 触发器的名称
- `TRIGGER_BODY`：String 触发器定义的内容
- `TABLE_NAME`：String  表的名称
- `TRIGGER_SCHEMA`：String  触发器所在schema

:::tip 提示
SQL模板中必须包含`TRIGGER_NAME`、`TRIGGER_BODY`、`TABLE_NAME`此三个字段。
:::

### getTriggerMeta{#gettriggermeta}

返回一个用于查询查询触发器信息的SQL。SQL模板参数参考[dropTableIfExists](#droptableifexists)属性。

示例：

```sql
SELECT TRIGGER_NAME,ACTION_STATEMENT TRIGGER_BODY,EVENT_OBJECT_TABLE TABLE_NAME from information_schema.TRIGGERS Where EVENT_OBJECT_SCHEMA='?4' and EVENT_OBJECT_TABLE='?1'
```

字段列：

- `TRIGGER_NAME`：String 触发器的名称
- `TRIGGER_BODY`：String 触发器定义的内容
- `TABLE_NAME`：String  表的名称

:::tip 提示
查询SQL返回的字段顺序以及字段名称必须和字段列中的字段一致。
:::

### getTableStorageSpace{#gettablestoragespace}

查询一个表占用的存储空间的大小，返回一个单行单列的查询结果，单位为byte。SQL模板参数参考[dropTableIfExists](#droptableifexists)属性。

示例：

```sql
SELECT data_length as TABLE_SPACE from information_schema.tables where TABLE_SCHEMA='?4' and TABLE_NAME='?1'
```

### insertOnDuplicate{#insertonduplicate}

保存一行数据，根据主键判断数据是否存在，不存在就执行insert语句，存在执行update语句。

示例：

```sql
INSERT INTO ?1 (?2) VALUES (?3) DUPLICATE KEY UPDATE ?5
```

SQL模板参数：

1. `tableName`：写入的目标表表名。
2. `insertFields`：insert写入的字段名列表。
3. `insertValues`：insertFields字段列表对应的值。
4. `keyFields`：主键列表。
5. `updateFields`：当数据已存在时执行的更新。

### mergeInto{#mergeinto}

构造一个`merge into`语句，将表或者SQL查询结果插入到目标表中，此语句较为复杂，一般通过Freemarker文件独立配置，并在这里指定配置文件路径。详细配置参考[merge.ftl](./merge-ftl.md)。

### createTable{#createtable}

构造一个`create table`语句，此语句较为复杂，一般通过Freemarker文件独立配置，并在这里指定配置文件路径。详细配置参考[create-table.ftl](./createtable-ftl.md)。

### alterTable{#altertable}

构造一个`alter table`语句，此语句较为复杂，一般通过Freemarker文件独立配置，并在这里指定配置文件路径。详细配置参考[alter-table.ftl](./altertable-ftl.md)。

### createView{#createview}

构造一个`create view`语句，此语句较为复杂，一般通过Freemarker文件独立配置，并在这里指定配置文件路径。详细配置参考[create-view.ftl](./createview-ftl.md)。
