SQL内置全局变量是只读的,由IBM®DB2®for i维护,并且是受信任且易于使用的资源。 存在一些全局变量是为了与DB2系列兼容,并且包含在SYSIBM
模式中。 其他全局变量提供IBM i特定的值,并包含在QSYS2
模式中。 全局变量使应用程序和用户可以轻松访问有用的环境信息,这些信息可用于审核和调试。 它们允许改进的应用程序日志记录以及更高级的出口点程序,触发器程序以及行和列访问控制(RCAC)规则文本。
表1包含有关SQL内置全局变量的一般信息。 内置全局变量在IBM i 7.2之前的版本中不可用。
变量名 | 架构图 | 数据类型 | 尺寸 | SF99702等级 | SF99703等级 |
---|---|---|---|---|---|
PROCESS_ID | QSYS2 | 整数 | -- | 11级 | 7.3基 |
THREAD_ID | QSYS2 | 比金特 | -- | 11级 | 7.3基 |
JOB_NAME | QSYS2 | VARCHAR | 28 | 3级 | 7.3基 |
SERVER_MODE_JOB_NAME | QSYS2 | VARCHAR | 28 | 3级 | 7.3基 |
CLIENT_IPADDR | SYSIBM | VARCHAR | 128 | 7.2基 | 7.3基 |
CLIENT_HOST | SYSIBM | VARCHAR | 255 | 7.2基 | 7.3基 |
CLIENT_PORT | SYSIBM | 整数 | -- | 7.2基 | 7.3基 |
ROUTINE_SCHEMA | SYSIBM | VARCHAR | 128 | 7.2基 | 7.3基 |
ROUTINE_SPECIFIC_NAME | SYSIBM | VARCHAR | 128 | 7.2基 | 7.3基 |
ROUTINE_TYPE | SYSIBM | 焦炭 | 1个 | 7.2基 | 7.3基 |
包裹名字 | SYSIBM | VARCHAR | 128 | 7.2基 | 7.3基 |
PACKAGE_SCHEMA | SYSIBM | VARCHAR | 128 | 7.2基 | 7.3基 |
PACKAGE_VERSION | SYSIBM | VARCHAR | 64 | 7.2基 | 7.3基 |
您可以在QSYS2.SYSVARIABLES目录中找到内置的全局变量。 显示所有可用SQL内置全局变量的查询是:
SELECT VARIABLE_SCHEMA, VARIABLE_NAME
FROM QSYS2.SYSVARIABLES
WHERE VARIABLE_SCHEMA = 'QSYS2' OR
VARIABLE_SCHEMA = 'SYSIBM';
在引入这些内置全局变量之前,在SQL中获取此信息的唯一方法是创建一个外部过程或函数,以从系统API获取信息并返回该信息。 具有内置的全局变量消除了这种工作,并提高了效率。
内置的QSYS2.THREAD_ID
全局变量包含当前线程的线程标识符(ID)。 数据为BIGINT
,但是如果您希望以十六进制形式查看值,请使用内置函数HEX()
全局变量。
线程ID用于唯一标识作业中的线程。 虽然在同一作业中启动的两个线程都不会具有相同的线程ID,但是不同作业中的线程可能具有相同的线程ID值。 当线程结束时,其线程ID永远不会在作业中重用。 随着线程信息以更多方式出现,线程ID信息变得越来越重要。 这包括在使用它们的查询中的不同线程中运行的函数。
这是一个示例,用于捕获当前线程持有的SALES
表上的线程范围的记录锁:
SELECT * FROM QSYS2.RECORD_LOCK_INFO
WHERE TABLE_NAME = 'SALES' AND
TABLE_SCHEMA = 'COMPANY' AND
JOB_NAME = QSYS2.JOB_NAME AND
THREAD_ID = QSYS2.THREAD_ID;
内置全局变量QSYS2.PROCESS_ID
包含当前正在运行的作业的进程(ID)。 数据类型为INTEGER
。 进程ID用于唯一地标识系统上的活动作业。 没有两个活动作业具有相同的进程ID。
这是捕获当前作业的详细信息的示例:
SELECT USER, CURRENT SERVER, QSYS2.JOB_NAME, QSYS2.THREAD_ID, QSYS2.PROCESS_ID
FROM SYSIBM.SYSDUMMY1;
QSYS2.JOB_NAME
内置全局变量包含当前作业的名称。 它是VARCHAR(28)
类型。
作业名称用于唯一标识活动作业。 没有两个活动作业具有相同的作业名称。
这是一个使用视图隐藏表函数的大量用法的示例:
CREATE OR REPLACE VIEW QGPL.MYJOBINFO AS
(SELECT QSYS2.JOB_NAME, A.* FROM TABLE(QSYS2.GET_JOB_INFO(QSYS2.JOB_NAME)) A);
SELECT * FROM QGPL.MYJOBINFO;
无论如何建立连接,都可以获取作业信息。 当使用接口(例如命令行界面(CLI),Java数据库连接性(JDBC)或分布式关系数据库体系结构(DRDA))时,找到工作可能会面临挑战,这可以减轻寻找工作的麻烦。 您还可以使用三部分命名来确定远程系统上正在使用的作业:
SELECT * FROM REMOTESYS.QGPL.MYJOBINFO;
参考信息的地方 | THREAD_ID | PROCESS_ID | JOB_NAME |
---|---|---|---|
OBJECT_LOCK_INFO视图 | ✔ | ✔ | |
RECORD_LOCK_INFO视图 | ✔ | ✔ | |
AUTHORITY_COLLECTION视图 | ✔ | ✔ | |
JVM_INFO视图 | ✔ | ||
SYSLIMITS视图 | ✔ | ||
OUTPUT_QUEUE_ENTRIES视图 | ✔ | ||
OUTPUT_QUEUE_ENTRIES表函数 | ✔ | ||
ACTIVE_JOB_INFO表函数 | ✔ | ||
数据库监视器(DBMON) | ✔ | ✔ | |
日记帐分录 | ✔ | ||
系统API | pthread_equal,pthread_getunique_np,pthread_kill,pthread_setname_np,pthread_getname_np,pthread_join_np | getpid,getppid,QlgSpawn,Qp0wChkChld,Qp0wChkPid,Qp0wGetJobID,Qp0wGetPid,Qp0wGetPPid,生成,等待,waitpid | |
系统指令 | WRKJOB,STRAUTCOL,STRWCH | ||
IBM PASE for i命令 | 杀死,ps,等待 |
QSYS2.SERVER_MODE_JOB_NAME
内置全局变量包含建立SQL Server模式连接的作业的名称。 它是VARCHAR(28)
类型。 如果没有服务器模式连接,则值为NULL
。
这是捕获服务器模式作业的详细信息的示例:
SELECT * FROM TABLE(QSYS2.GET_JOB_INFO(QSYS2.SERVER_MODE_JOB_NAME)) A;
内置的SYSIBM.CLIENT_IPADDR
全局变量包含系统返回的当前客户端的IP地址。 它是VARCHAR(128)
类型。 如果客户端未使用TCP / IP或安全套接字层(SSL)协议进行连接,则该值为NULL
。
内置SYSIBM.CLIENT_PORT
内置全局变量包含当前客户机用于与服务器通信的端口号。 它是INTEGER
类型的。 如果客户端未使用TCP / IP协议进行连接,则该值为NULL
。
内置的SYSIBM.CLIENT_HOST
全局变量包含系统返回的当前客户端的主机名。 它的类型为VARCHAR(255)
。
如果客户端连接源自在本地系统上运行的应用程序,则全局变量的值为NULL
。 接受连接后,服务器将从网络获取客户端IP地址。 如果该进程不是源自使用TCP / IP的远程系统,则该值为NULL
。
这是定义RCAC权限以允许客户端使用的特定客户端IP地址,端口号或主机名访问CUSTOMER_TABLE
表的示例。
CREATE OR REPLACE PERMISSION HOST_ACCESS ON CUSTOMER_TABLE
FOR ROWS WHERE
(SYSIBM.CLIENT_IPADDR = '9.181.88.248' OR
SYSIBM.CLIENT_PORT = 51074 OR
SYSIBM.CLIENT_HOST = 'IBMSYSTEM.IBM.COM')
ENFORCED FOR ALL ACCESS
ENABLE;
SYSIBM.ROUTINE_SCHEMA
内置全局变量包含当前正在运行的例程的模式名称。 它是VARCHAR(128)
类型。 如果当前没有例程在运行,则值为NULL
。
ROUTINE_SCHEMA
变量仅为过程和功能设置。 未为触发器设置该变量。
SYSIBM.ROUTINE_SPECIFIC_NAME
内置全局变量包含当前正在运行的例程的名称。 它是VARCHAR(128)
类型。 如果当前没有例程在运行,则值为NULL
。
ROUTINE_SPECIFIC_NAME
变量仅为过程和函数设置。 未为触发器设置该变量。
SYSIBM.ROUTINE_TYPE
内置全局变量包含当前运行的例程的类型。 它是CHAR(1)
类型。 全局变量的值对于过程为' P
'或对于函数为' F
'。 如果当前没有例程在运行,则值为NULL
。
参考信息的地方 | ROUTINE_SCHEMA | ROUTINE_SPECIFIC_NAME | ROUTINE_TYPE |
---|---|---|---|
ROUTINE_PRIVILEGES视图 | ✔ | SPECIFIC_NAME | |
SYSROUTINEAUTH视图 | ✔ | SPECIFIC_NAME | |
SYSFUNCS视图 | ✔ | SPECIFIC_NAME | |
SYSPROCS视图 | ✔ | SPECIFIC_NAME | |
常规视图 | ✔ | SPECIFIC_NAME | ✔ |
SYSPROGRAMSTAT视图 | SPECIFIC_NAME | ✔ | |
SYSROUTINES表 | ✔ | SPECIFIC_NAME | ✔ |
QSQPRCED API | ✔ |
这是一个定义RCAC掩码的示例,以允许仅针对特定的例程模式,例程名称和例程类型查看EMPLOYEE
表中的实际薪水数据:
CREATE MASK EMP_ACCESS ON EMPLOYEE
FOR COLUMN SALARY
RETURN
CASE
WHEN (SYSIBM.ROUTINE_SCHEMA = 'HUMAN_RESOURCE_DEPT' AND
SYSIBM.ROUTINE_SPECIFIC_NAME = 'HRDEPT' AND
SYSIBM.ROUTINE_TYPE = 'P')
THEN SALARY ELSE 00000
END ENABLE;
SYSIBM.PACKAGE_NAME
内置全局变量包含当前用于DRDA连接的软件包的名称。 它是VARCHAR(128)
类型。
如果当前没有正在运行的包,则值为NULL
。
SYSIBM
。 PACKAGE_SCHEMA
内置全局变量包含当前用于DRDA连接的软件包的模式名称。 它是VARCHAR(128)
类型。 如果当前没有正在运行的包,则值为NULL
。
内置SYSIBM.PACKAGE_VERSION
内置全局变量包含当前用于DRDA连接的软件包的版本标识符。 它是VARCHAR(64)
类型。
如果当前没有正在运行的程序包,或者当前正在运行的程序包没有版本标识符,则该值为NULL
。 仅当从DB2 for i以外的服务器创建程序包时,程序包才具有版本标识符。
参考信息的地方 | 包裹名字 | PACKAGE_SCHEMA | PACKAGE_VERSION |
---|---|---|---|
SYSPACKAGE视图 | ✔ | ✔ | |
SYSPACKAGESTAT视图 | ✔ | ✔ | |
SYSPACKAGESTMTSTAT视图 | ✔ | ✔ | |
SYSPACKAGEAUTH视图 | ✔ | ✔ | |
数据库监视器(DBMON) | ✔ |
这是一个示例,用于在每次插入DATATAB
表之前收集包信息(名称,架构和版本):
CREATE TRIGGER RECORD BEFORE INSERT ON DATATAB
REFERENCING NEW ROW AS N
FOR EACH ROW MODE DB2ROW ENABLE SECURED
BEGIN
INSERT INTO INFOCOLLECTION(SYSIBM.PACKAGE_NAME,
SYSIBM.PACKAGE_SCHEMA,
SYSIBM.PACKAGE_VERSION);
END;
SQL内置的全局变量旨在为用户提供对有用的环境信息的轻松访问。 如本文所述,这些SQL内置全局变量可以轻松用于审核和调试。 继续尝试一下吧!
翻译自: https://www.ibm.com/developerworks/ibmi/library/i-use-sql-built-in-global-variables-trs/index.html