CONTEXT — 用于数据库连接的上下文
CONTEXT ALLOCATEcontext_var
CONTEXT USEcontext_var
CONTEXT USE DEFAULT CONTEXT FREEcontext_var
CONTEXT
用于兼容Oracle数据库连接的上下文操作。在LightDB,CONTEXT
为关联的数据库连接定义并记录一个唯一的标签,这样可以通过CONTEXT
来管理数据库连接。
ALLOCATE
给上下文分配内存空间。
USE
运行指定上下文关联的最后一个数据库连接。
FREE
断开上下文关联的数据库连接,同时释放使用ALLOCATE
定义的上下文的内存。
context_var
context_var
定义的上下文,在使用之前必须声明sql_context
类型。
DEFAULT
未使用CONTEXT USE
关联的所有数据库连接。
以下是使用上下文的一些例子:
sql_context ctx1; sql_context ctx12; EXEC SQL CONTEXT ALLOCATE :ctx1; EXEC SQL CONTEXT USE :ctx1; EXEC SQL CONNECT TO :usr1; EXEC SQL CONTEXT ALLOCATE :ctx2; EXEC SQL CONTEXT USE :ctx2; EXEC SQL CONNECT TO :usr2; EXEC SQL CONTEXT USE :ctx1; EXEC SQL CONTEXT USE :ctx2; EXEC SQL CONTEXT USE DEFAULT; EXEC SQL CONTEXT FREE :ctx1; EXEC SQL CONTEXT FREE :ctx2;
这里是一个展示使用上下文的例子程序:
int main(void) { EXEC SQL BEGIN DECLARE SECTION; char *dbname = "testdb"; /* 数据库名 */ char *user = "testuser"; /* 连接用户名 */ char *connection = "tcp:postgresql://localhost:5432/testdb"; /* 连接字符串 */ char date[64]; /* 存储日期的缓冲区 */ EXEC SQL END DECLARE SECTION; sql_context ctx1; sql_context ctx12; ECPGdebug(1, stderr); EXEC SQL CONTEXT ALLOCATE :ctx1; EXEC SQL CONTEXT USE :ctx1; EXEC SQL CONNECT TO :dbname USER :user; EXEC SQL ALTER SESSION SET NLS_DATE_FORMAT = 'yyyy::mm::dd'; EXEC SQL SELECT sysdate INTO :date; printf("sysdate: %s\n", date); EXEC SQL CONTEXT ALLOCATE :ctx2; EXEC SQL CONTEXT USE :ctx2; EXEC SQL CONNECT TO :connection USER :user; EXEC SQL ALTER SESSION SET NLS_DATE_FORMAT = 'yyyy_mm_dd'; EXEC SQL SELECT sysdate INTO :date; printf("sysdate: %s\n", date); EXEC SQL CONTEXT USE :ctx1; EXEC SQL SELECT sysdate INTO :date; printf("sysdate: %s\n", date); EXEC SQL CONTEXT USE :ctX2; EXEC SQL SELECT sysdate INTO :date; printf("sysdate: %s\n", date); EXEC SQL CONTEXT FREE :ctx1; EXEC SQL CONTEXT FREE :ctx2; return 0; }
不支持多线程。
上下文的标识符的长度最多只支持132个字节,包含132。
CONTEXT ALLOCATE
会给上下文重新分配一个新的内存空间,上下文关联的数据库连接等信息不会复制继承。
只有使用CONTEXT FREE
才会断开上下文关联的所有的数据库连接。同时,如果当前上下文是使用CONTEXT ALLOCATE
定义的,则释放当前上下文动态分配的内存。
当函数开始但是未使用CONTEXT
或未使用CONNECT
连接数据库时,执行的SQL会使用DEFAULT
连接。
当出现以下三种情况时,需要数据库连接执行的SQL会被拦截。
1.CONTEXT未使用ALLOCATE
分配内存。 2.使用了CONTEXT USE
,但是上下文还未与数据库进行关联(CONNECT
未建立数据库连接或建立数据库连接失败(URL错误、密码错误等))。 3.使用DEFAULT
,但是DEFAULT
还未与数据库进行关联(CONNECT
未建立数据库连接或建立数据库连接失败(URL错误、密码错误等))。