-
Notifications
You must be signed in to change notification settings - Fork 111
sys_get_config()
xiaoboluo768 edited this page Jun 9, 2020
·
2 revisions
-
返回给定sys schema配置选项名称的设置值,两个传参,第一个是要查看的配置变量名称,第二个是传入的默认值,如果在sys.sys_config表中查询到了该变量的非null值,则直接返回,如果查询到是null值,则使用第二个传参返回(如果在sys.sys_config表中没有查询到第一个传参的变量名---即可能传入的配置选项名称在sys.sys_config表中不存在,返回第二个传参值)
- 按照惯例,调用者在sys_get_config()函数之前需要先检查相应的用户定义变量是否存在并且是否非NULL。如果存在所需配置选项的自定义变量,且值不为NULL,该调用者直接使用自定义配置选项变量值而不是第哦啊用sys_get_config()函数读取sys.sys_config表中的值,除此之外,其他情形都需要调用sys_get_config()函数读取sys.sys_config表中的值并赋值给用户自定义配置选项变量,以便下次优先使用自定义配置选项变量中的值而不是直接查询sys.sys_config表中的值,关于配置选项和自定义配置选项变量详见 2.2.1. sys_config表 小节
- 当调这需要获取配置选项值时,如果要检查配置选项是否设置了自定义配置选项变量,那么可以使用IFNULL(...)语句IF(...)THEN ... END IF;语句把这一些逻辑封装在一个流程控制语句里,但是,这两个语句中,IFNULL(...)语句在需要反复查询一个配置选项值时其执行速度会显著比IF(...)THEN ... END IF;语句慢,因为IFNULL(...)语句无法在加入一个干活的逻辑在里边,IF(...)THEN ... END IF;语句可以把一些干活的逻辑加入到里边,只在第一次调用时才需要去判断自定义变量知否存在以及是否为NULL值(两个语句如何使用详见函数定义语句中的注释示例文本)
-
参数:
- in_variable_name VARCHAR(128):给定的配置选项名称字符串
- in_default_value VARCHAR(128):如果在sys_config表中找不到给定的配置选项名称,则返回该参数给定的值
-
返回值:一个VARCHAR(128)文本值
-
定义语句
DROP FUNCTION IF EXISTS sys_get_config;
DELIMITER $$
CREATE DEFINER='root'@'localhost' FUNCTION sys_get_config (
in_variable_name VARCHAR(128),
in_default_value VARCHAR(128)
)
RETURNS VARCHAR(128)
COMMENT '
Description
-----------
Returns the value for the requested variable using the following logic:
1. If the option exists in sys.sys_config return the value from there.
2. Else fall back on the provided default value.
Notes for using sys_get_config():
* If the default value argument to sys_get_config() is NULL and case 2. is reached, NULL is returned.
It is then expected that the caller is able to handle NULL for the given configuration option.
* The convention is to name the user variables @sys.<name of variable>. It is <name of variable> that
is stored in the sys_config table and is what is expected as the argument to sys_get_config().
* If you want to check whether the configuration option has already been set and if not assign with
the return value of sys_get_config() you can use IFNULL(...) (see example below). However this should
not be done inside a loop (e.g. for each row in a result set) as for repeated calls where assignment
is only needed in the first iteration using IFNULL(...) is expected to be significantly slower than
using an IF (...) THEN ... END IF; block (see example below).
Parameters
-----------
in_variable_name (VARCHAR(128)):
The name of the config option to return the value for.
in_default_value (VARCHAR(128)):
The default value to return if the variable does not exist in sys.sys_config.
Returns
-----------
VARCHAR(128)
Example
-----------
-- Get the configuration value from sys.sys_config falling back on 128 if the option is not present in the table.
mysql> SELECT sys.sys_get_config(''statement_truncate_len'', 128) AS Value;
+-------+
| Value |
+-------+
| 64 |
+-------+
1 row in set (0.00 sec)
-- Check whether the option is already set, if not assign - IFNULL(...) one liner example.
mysql> SET @sys.statement_truncate_len = IFNULL(@sys.statement_truncate_len, sys.sys_get_config(''statement_truncate_len'', 64));
Query OK, 0 rows affected (0.00 sec)
-- Check whether the option is already set, if not assign - IF ... THEN ... END IF example.
IF (@sys.statement_truncate_len IS NULL) THEN
SET @sys.statement_truncate_len = sys.sys_get_config(''statement_truncate_len'', 64);
END IF;
'
SQL SECURITY INVOKER
DETERMINISTIC
READS SQL DATA
BEGIN
DECLARE v_value VARCHAR(128) DEFAULT NULL;
-- Check if we have the variable in the sys.sys_config table
SET v_value = (SELECT value FROM sys.sys_config WHERE variable = in_variable_name);
-- Protection against the variable not existing in sys_config
IF (v_value IS NULL) THEN
SET v_value = in_default_value;
END IF;
RETURN v_value;
END $$
DELIMITER ;
上一篇: quote_identifier()函数 | 下一篇: version_major()函数
- 验证、测试、整理:罗小波
- QQ:309969177
- 提示:本系列文章的主体结构遵循Oracle MySQL 官方 5.7 手册中,关于information_schema、mysql schema、performance_schema、sys schema的章节结构体系,并额外添加了一些验证、测试数据。鉴于本人精力和能力有限,难免出现一些纰漏,欢迎大家踊跃指正!