标量函数
升级说明:请阅读!
在的早期版本中作为外部函数 (UDF) 实现的大量函数,Firebird已逐步重新实现为内部(内置)函数。如果某些外部函数与数据库中声明的内置名称相同,它将保留在那里并将覆盖.
任何同名的内部函数。要使内部函数可用,您需要删除 UDF,或使用 ALTER EXTERNAL函数 来更改 UDF 的声明名称。
用于处理上下文变量的函数
RDB$GET_CONTEXT()
注意
RDB$GET_CONTEXT及其对应的RDB$SET_CONTEXT实际上是预先声明的UDF。它们被列出
这里作为内部函数,因为它们始终存在 - 用户不必做任何事情来使它们可用。
有效:DSQL、PSQL * 作为声明的 UDF,它应该在 ESQ 中可用
说明:从SYSTEM、USER_SESSION和USER_TRANSACTION其中一个命名空间中检索上下文变量的值。
语法:
RDB$GET_CONTEXT ('', '')
::= SYSTEM | USER_SESSION | USER_TRANSACTION
::= 区分大小写的字符串,最多 80 个字符。
表 8.3.RDB$GET_CONTEXT 函数参数
参数 | 描述 |
namespace | 名字空间 |
varname | 变量名。 区分大小写的字符串,最多 80 个字符。 |
结果类型:VARCHAR(255)
命名空间:命名空间USER_SESSION和USER_TRANSACTION命名空间初始为空。用户可以
使用RDB$SET_CONTEXT()在其中创建和设置变量,并使用RDB$GET_CONTEXT()取得它们。
SYSTEM命名空间是只读的。它包含许多预定义的变量,如下表所示。
表 8.4.SYSTEM 命名空间中的上下文变量
参数 |
描述 |
DB_NAME |
数据库的完整路径或其别名(如果不允许通过该路径连接)。 |
NETWORK_PROTOCOL |
用于连接的协议:“TCPv4”、“WNET”、“XNET”或 NULL。 |
CLIENT_ADDRESS |
对于 TCPv4,这是 IP 地址。对于 XNET,这指的是本地进程 ID。对于所有其他协议,此变量为 NULL。 |
CURRENT_USER |
与全局CURRENT_USER变量相同。 |
CURRENT_ROLE |
与全局CURRENT_ROLE变量相同。 |
SESSION_ID |
与全局CURRENT_CONNECTION变量相同。 |
TRANSACTION_ID |
与全局CURRENT_TRANSACTION变量相同。 |
ISOLATION_LEVEL |
当前事务的隔离级别:“已提交读取”、“快照”或“一致性”。 |
ENGINE_VERSION |
Firebird引擎(服务器)版本。在 2.1 中添加。 |
返回值和错误行为:如果给定命名空间中存在轮询变量,则将返回其值
作为字符串,最大长度255 个。如果命名空间不存在,或者您尝试访问不存在的变量
在 SYSTEM 命名空间中,将引发错误。如果轮询其他命名空间之一中不存在的变量,
返回 NULL。命名空间和变量名称必须以单引号、区分大小写、非 NULL 的形式的字符串。
例子
select rdb$get_context('SYSTEM', 'DB_NAME') from rdb$database
New.UserAddr = rdb$get_context('SYSTEM', 'CLIENT_ADDRESS');
insert into MyTable (TestField)
values (rdb$get_context('USER_SESSION', 'MyVar'))
参阅: RDB$SET_CONTEXT()
SET_CONTEXT()
注意
RDB$SET_CONTEXT及其对应的RDB$GET_CONTEXT实际上是预先声明的UDF。它们被列出
这里作为内部函数,因为它们始终存在 - 用户不必做任何事情来制作它们
可用。
内置函数和变量
有效:DSQL,PSQL * 作为声明的UDF,它应该在ESQL中可用
说明:在其中一个用户可写命名空间中创建、设置或取消设置变量,USER_SESSION和
USER_TRANSACTION。
语法:
RDB$SET_CONTEXT ('', '', | NULL)
::= USER_SESSION | USER_TRANSACTION
::= A case-sensitive string of max. 80 characters
::= A value of any type, as long as it's castable to a VARCHAR(255)
表 8.5 . RDB$SET_CONTEXT Function Parameters
结果类型:整数
命名空间:USER_SESSION和USER_TRANSACTION命名空间最初为空。用户可以
使用RDB$SET_CONTEXT()在其中创建和设置变量,并使用RDB$GET_CONTEXT()检索它们。这个
USER_SESSION上下文绑定到当前连接。USER_TRANSACTION变量仅存在于它们已被设置的事务中。当事务结束时,上下文和定义的所有变量
在其中被销毁。
返回值和错误行为:如果变量在调用之前已存在,则函数返回 1,反之则返回0
。要从上下文中移除变量,请将其设置为 NULL。如果给定的命名空间不存在,则错误为
提出。命名空间和变量名称都必须以单引号、区分大小写、非 NULL 字符串的形式输入。
例子:
select rdb$set_context('USER_SESSION', 'MyVar', 493) from rdb$database
rdb$set_context('USER_SESSION', 'RecordsFound', RecCounter);
select rdb$set_context('USER_TRANSACTION', 'Savepoints', 'Yes')
from rdb$database
注意:
• 任何单个上下文中的最大变量数为 1000。
• 所有USER_TRANSACTION变量都将在回滚保留(请参阅回滚选项)或回滚到 SAVEPOINT 不变的情况下继续存在,无论它们在事务中的哪个时间点被设置。
• 由于其类似UDF的性质,RDB$SET_CONTEXT可以像void函数一样调用,而无需
分配结果,如上面的第二个示例所示。常规内部函数不允许这种类型的使用
参阅: RDB$GET_CONTEXT()
本文档中文版由海钛瑞OA办公系统研发团队翻译制作,转载请在开始处标明来自于http://www.hitai.com.欢迎交流。