CONTEXT

CONTEXT — 用于数据库连接的上下文

Synopsis

      CONTEXT ALLOCATE context_var
      CONTEXT USE context_var
      CONTEXT USE DEFAULT
      CONTEXT FREE context_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错误、密码错误等))。