Skip to content

适用虚谷数据库版本

v12.9



适用虚谷数据库版本

v12.9


SET

📄字数 4.6K
👁️阅读量 加载中...

一、概述

SET语句用于设置运行时参数,参数可以是系统级配置参数、连接会话级参数,或者用户自定义变量。

  1. 设置系统级配置参数:
    • 使用SET语句设置系统级参数,系统参数变更影响整个集群;
    • 系统级参数主要包括xugu.ini系统参数配置内置全局变量
    • 设置xugu.ini文件中参数配置时,会将新参数值写入xugu.ini文件,且不能被回滚。
  2. 设置连接会话级参数:
    • 会话级参数,特定于当前会话,其生命周期由会话决定;
    • 使用SET语句设置会话级参数;会话参数参阅连接会话参数
    • 使用SET SESSION AUTHORIZATION语句设置当前用户;
    • 使用SET TRANSACTION语句设置事务特性,包括隔离级别或访问模式;
    • 使用SET AUTO COMMIT语句设置自动提交;
    • 使用SET SCHEMA语句设置当前模式;
    • 使用SET NAMES语句设置当前会话字符集;
    • 使用SET NULL语句设置空字符串处理方式。
  3. 设置用户自定义变量:
    • 用户自定义变量是会话级参数,特定于当前会话,其生命周期由会话决定;
    • 访问任何未经定义的自定义变量都将返回一个NULL值;
    • 自定义变量由一个客户端定义、其它客户端无法查看和使用;
    • 自定义变量会在客户端会话结束时自动回收释放;
    • 自定义变量不支持右值为一个查询语句。

二、设置系统参数

SET语句用于整个集群范围内更改服务端系统级的配置参数。系统参数是全局变量,部分系统参数无对应的会话级参数,更改其值,会影响整个服务端的所有会话,并且立即生效。另一部分系统参数作为会话参数的初始化值,更改其值,不影响当前会话,也不影响其他已建立连接的会话,但影响后续所有会话。

2.1 语法格式

2.2 参数说明

  • var_name:待设置的系统参数名。
  • var_value:指定参数的新值,可以是布尔类型(BOOLEN)、字符类型(VARCHAR)、整形(INTEGER)、单精度浮点型(FLOAT)。参数不同,取值范围不同。
    - opt_boolean:布尔类型。
    - TRUEON:取值TRUE
    - FALSEOFF:取值FALSE
    - SCONST:字符类型,字符串常量。
    - ('-')? ICONST:整型。
    - ('-')? FCONST:单精度浮点型。
  • opt_on_node:节点选择。
    • 未指定:等效于ON ALL NODE,对集群中所有节点设置系统参数。
    • ON ALL NODE:对集群中所有节点设置系统参数。
    • ON LOCAL NODE:对当前节点设置系统参数。
    • ON NODE NODE_ID:对指定节点设置系统参数,其中NODE_ID为节点ID,对应系统虚表集群信息-SYS_CLUSTERS的字段 NODE_ID。

2.3 示例

  • 设置系统参数 backslash_escape,是否启用反斜杠转义。

    sql
    SQL> SET backslash_escapes TO OFF
    SQL> SELECT '\'\'';
    
    Error: [E19132] 语法错误
            [E19260 L1 C11] 期待符号: syntax error, unexpected invalid token, expecting end of file
    
    SQL> SET backslash_escapes TO ON
    SQL> SELECT '\'\'';
    
    +-------+
    | EXPR1 |
    +-------+
    | ''    |
    +-------+
  • 对指定节点设置系统参数 reg_command,指定节点2,打开记录SQL命令。

    sql
    SQL> SET reg_command TO TRUE ON NODE 2;

三、设置会话参数

会话参数即会话变量,在客户端与服务端建立连接时,在连接控制变量区中创建会话参数,赋值连接字串上的参数值,如果连接字串上未指定,则赋值系统默认值。在会话创建后,客户端可以发送命令修改会话变量。

修改会话参数,只在当前会话有效,直至再次修改为不同值,或会话结束,不影响其他连接。

3.1 语法总览

3.1.1 语法格式

3.1.2 参数说明

  • session_variable_clauseAlterSetStmt:设置会话级参数,
    • var_name:指定设置的参数名。
    • var_value:指定参数的新值。
  • authorization_clause:设置当前会话用户,参见authorization_clause
  • transaction_clause:设置事务隔离级别或访问模式,参见transaction_clause
  • auto_commit_clause:设置是否自动提交,参见auto_commit_clause
  • schema_clause:设置当前会话的模式,参见schema_clause
  • names_clause:设置当前会话的字符集,参见names_clause
  • empty_str_clause:设置当前会话的空字符串转NULL功能,参见empty_str_clause

3.2 SET SESSION AUTHORIZATION

SET SESSION AUTHORIZATION设置当前会话的用户标识符,等同于设置会话参数当前用户(session_user)

3.2.1 语法格式

3.2.2 参数说明

  • user_name:指定当前会话用户名,可以是用户标识符或字符串。

3.3.3 示例

sql
-- 创建用户usr_auth
SQL> CREATE USER usr_auth IDENTIFIED BY '123QWE!@#';

-- 查看当前会话的用户名
SQL> SELECT USER;

+--------+
| EXPR1  |
+--------+
| SYSDBA |
+--------+

-- 设置当前会话的用户为usr_auth
SQL> SET SESSION AUTHORIZATION usr_auth;
-- 查看当前会话的用户名
SQL> SHOW session_user;

+--------------+
| SESSION_USER |
+--------------+
| USR_AUTH     |
+--------------+

3.3 SET TRANSACTION

SET TRANSACTION语句设置当前事务隔离级别、事务访问模式(只读或读写)。此语句只影响当前事务,不影响其他用户或其他事务。

3.3.1 语法格式

3.3.2 参数说明

  • SESSIONCHARACTERISTICS AS:关键字可选,用于修饰关键字TRANSACTION
  • opt_access_mode:指定事务访问模式,等同于设置会话参数TRANS_READONLY
    • READ ONLY:设置当前事务为只读事务,确保事务读一致性。
    • READ WRITE:设置当前事务为读写事务,确保事务写一致性。
  • opt_level:指定事务隔离级别,等同于设置会话参数ISO_LEVEL
    • READ ONLY:设置事务隔离级别为只读。
    • READ COMMITTED:设置事务隔离级别为读已提交。
    • REPEATABLE READ:设置事务隔离级别为可重复读。
    • SERIALIZABLE:设置事务隔离级别为序列化。

3.4 SET AUTO COMMIT

SET AUTO COMMIT设置自动提交。等同于设置会话参数AUTO_COMMIT

3.4.1 语法格式

3.4.2 参数说明

  • AUTO COMMIT:事务的提交模式。
    • ON:自动提交。
    • OFF:非自动提交。

3.4.3 示例

  • 打开自动提交。

    sql
    SQL> SET AUTO COMMIT ON;

3.5 SET SCHEMA

SET SCHEMA设置当前会话的模式,可用于切换模式。等同于设置会话参数schema

3.5.1 语法格式

3.5.2 参数说明

  • schema_name:模式标识符或字符串。
  • DEFAULT:切换到当前会话所登录用户的默认同名模式下。

3.5.3 示例

sql
SQL> SET SCHEMA DEFAULT;

3.6 SET NAMES

SET NAMES设置当前客户端、连接会话的字符集。等同于设置会话参数CHAR_SET

3.6.1 语法格式

3.6.2 参数说明

  • charset_name:字符集名的字符串,对应系统内置字符集SYS_CHARSETS,字段 CHARSET_NAME

3.6.3 示例

  • 设置会话字符集为GBK。

    sql
    SQL> SET NAMES 'GBK';
  • 设置会话字符集为UTF8。

    sql
    SQL> SET NAMES 'UTF8';

3.7 SET NULL

SET NULL语句设置服务端接收当前会话的SQL数据时,是否将空串(长度为 0 的字符串)作为空值(NULL)处理,等同于设置会话参数EMPTY_STR_AS_NULL

3.7.1 语法格式

3.7.2 参数说明

  • NULL:空串(长度为 0 的字符串)不作为空值(NULL)处理。
  • SCONST:空串''或任意字符串,将空串(长度为 0 的字符串)作为空值(NULL)处理。

3.7.3 示例

  • 设置空串(长度为 0 的字符串)不作为空值(NULL)处理。

    sql
    SQL> SET NULL NULL;
    SQL> SHOW EMPTY_STR_AS_NULL;
    
    +-------------------+
    | EMPTY_STR_AS_NULL |
    +-------------------+
    | F                 |
    +-------------------+
  • 设置将空串(长度为 0 的字符串)作为空值(NULL)处理。

    sql
    SQL> SET NULL '';
    SQL> SHOW EMPTY_STR_AS_NULL;
    
    +-------------------+
    | EMPTY_STR_AS_NULL |
    +-------------------+
    | T                 |
    +-------------------+

四、设置自定义会话变量

自定义会话变量支持在SQL、块语句、存储过程或函数中使用。

4.1 语法格式

4.2 参数说明

  • variable_el:变量列表。
    • var_name:变量名。可以是字母或下划线开头的,且由大小写字母、数字、下划线、$或#中任意字符组成的的标识符。
    • b_expr:变量值或表达式。

4.3 示例

  • 设置两个自定义变量 var_test1 和 var_test2,并查询变量值。

    sql
    SQL> SET @var_test1 = ('test1'), @var_test2 = ('test2');
    
    SQL> SELECT @var_test1;
    
    +-------+
    | EXPR1 |
    +-------+
    | test1 |
    +-------+
    
    SQL> SELECT @var_test2;
    +-------+
    | EXPR1 |
    +-------+
    | test2 |
    +-------+
  • 设置自定义变量var_dt,赋值为当前时间。

    sql
    SQL> SET @var_dt = SYSDATE();
    
    SQL> SELECT @var_dt;
    
    +--------------------------+
    |          EXPR1           |
    +--------------------------+
    | 2025-08-02 16:05:31.290  |
    +--------------------------+