EXEC SQL CONTEXT... 是Oracle Pro*C的特有的语法,详细信息参见

http://docs.oracle.com/cd/B28359_01/appdev.111/b28427/pc_11thr.htm#i997959

EXEC SQL ENABLE THREADS;
EXEC SQL CONTEXT ALLOCATE :context_var;
EXEC SQL CONTEXT USE { :context_var | DEFAULT};
EXEC SQL CONTEXT FREE :context_var;

所谓context ,被称为runtime context,其实质就是保留连接数据库的信息,保留连接数据库的通道。

官方解释中,使用 exec sql context ,有几种方式:

1 各个进程之间不共享context

事实上,Oracle的官方例子----  Thread_example1.pc,采用的就是这种方式。

各个进程共通处理一堆转账数据,所以它们之间需要考虑对共同数据(文本格式的转账记录)读取时加mutex。

但是,由于每个进程可以自己拥有一个context---数据库通道,故此基本互相不干涉。

我认为这是合理的,也可能是比较高效率的方式。

2 各个进程之间共享一个context

此时,瓶颈出现在此context之上。可以想像一下,通过多线程来处理数据库之外的数据之后,

还是要回到一个共通的数据库通道来排队等候,是否效率并未发挥出来呢。

3 各个进程之间共享多个context

这个是最复杂的,可能也是最没有道理的。1的方式应该更好些。

而且,上述这些,都没有考虑到连接池的作用,也许是这种技术出现的年代是很早的。

为了备忘,记录oracle官方例子如下:

/*                                    * Name:        Thread_example1.pc                                    *                                    * Description: This program illustrates how to use threading in                                    *      conjunction with precompilers. The program creates as many                                    *      sessions as there are threads. Each thread executes zero or                                    *      more transactions, that are specified in a transient                                    *      structure called 'records'.                                    * Requirements:                                    *      The program requires a table 'ACCOUNTS' to be in the schema                                    *      scott/tiger. The description of ACCOUNTS is:                                    *  SQL> desc accounts                                    *   Name                            Null?    Type                                    *  ------------------------------- -------  ------                                    *  ACCOUNT                                  NUMBER(36)                                    *  BALANCE                                  NUMBER(36,2)                                    *                                    *  For proper execution, the table should be filled with the accounts                                    *      10001 to 10008.                                    *                                    *                                    */                                    #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sqlca.h>                                    #define      _EXC_OS_    _EXC__UNIX
#define      _CMA_OS_    _CMA__UNIX                                    #ifdef DCE_THREADS                                    #include <pthread.h>
#else                                    #include <thread.h>
#endif                                    /* Function prototypes */
void   err_report();                                    #ifdef DCE_THREADS                                    void   do_transaction();
#else                                    void   *do_transaction();
#endif                                    void   get_transaction();
void   logon();
void   logoff();                                    #define CONNINFO "scott/tiger"                                    #define THREADS  3                                     struct parameters                                     { sql_context * ctx;                                    int thread_id;
};                                    typedef struct parameters parameters;                                    struct record_log
{                                     char action;                                unsigned int from_account;                                unsigned int to_account;                                float  amount;
};                                    typedef struct record_log record_log;                                    record_log records[]= { { 'M', 10001, 10002, 12.50 },                                    { 'M', 10001, 10003, 25.00 },                                    { 'M', 10001, 10003, 123.00 },                                    { 'M', 10001, 10003, 125.00 },                                    { 'M', 10002, 10006, 12.23 },                                    { 'M', 10007, 10008, 225.23 },                                    { 'M', 10002, 10008, 0.70 },                                    { 'M', 10001, 10003, 11.30 },                                    { 'M', 10003, 10002, 47.50 },                                    { 'M', 10002, 10006, 125.00 },                                    { 'M', 10007, 10008, 225.00 },                                    { 'M', 10002, 10008, 0.70 },                                    { 'M', 10001, 10003, 11.00 },                                    { 'M', 10003, 10002, 47.50 },                                    { 'M', 10002, 10006, 125.00 },                                    { 'M', 10007, 10008, 225.00 },                                    { 'M', 10002, 10008, 0.70 },                                    { 'M', 10001, 10003, 11.00 },                                    { 'M', 10003, 10002, 47.50 },                                    { 'M', 10008, 10001, 1034.54}};                                    static unsigned int trx_nr=0;                                    #ifdef DCE_THREADS                                    pthread_mutex_t mutex;
#else                                    mutex_t mutex;
#endif                                    /*********************************************************************                                    *  Main                                    ********************************************************************/
main()
{                                    sql_context ctx[THREADS];                                #ifdef DCE_THREADS                                pthread_t thread_id[THREADS];                            pthread_addr_t status;                            #else                                thread_t thread_id[THREADS];                            int status;                            #endif                                parameters params[THREADS];                                int i;                                EXEC SQL ENABLE THREADS;                                EXEC SQL WHENEVER SQLERROR DO err_report(sqlca);                                /* Create THREADS sessions by connecting THREADS times */                                for(i=0;i<THREADS;i++)                                {                                printf("Start Session %d....",i);                            EXEC SQL CONTEXT ALLOCATE :ctx[i];                            logon(ctx[i],CONNINFO);                            }                                /*Create mutex for transaction retrieval */                                #ifdef DCE_THREADS                                if (pthread_mutex_init(&mutex,pthread_mutexattr_default))                            #else                                if (mutex_init(&mutex, USYNC_THREAD, NULL))                            #endif                                {                                printf("Can't initialize mutex\n");                            exit(1);                            }                                /*Spawn threads*/                                for(i=0;i<THREADS;i++)                                {                                params[i].ctx=ctx[i];                            params[i].thread_id=i;                            printf("Thread %d... ",i);                            #ifdef DCE_THREADS                                if (pthread_create(&thread_id[i],pthread_attr_default,                            (pthread_startroutine_t)do_transaction,                            (pthread_addr_t) &params[i]))                            #else                                if (status = thr_create                            (NULL, 0, do_transaction, &params[i], 0, &thread_id[i]))                            #endif                                printf("Cant create thread %d\n",i);                        else                            printf("Created\n");                        }                                /* Logoff sessions....*/                                for(i=0;i<THREADS;i++)                                {                                /*wait for thread to end */                            printf("Thread %d ....",i);                            #ifdef DCE_THREADS                            if (pthread_join(thread_id[i],&status))                        printf("Error when waiting for thread % to terminate\n", i);                    else                        printf("stopped\n");                    printf("Detach thread...");                        if (pthread_detach(&thread_id[i]))                        printf("Error detaching thread! \n");                        else                        printf("Detached!\n");                        #else                            if (thr_join(thread_id[i], NULL, NULL))                        printf("Error waiting for thread to terminate\n");                        #endif                            printf("Stop Session %d....",i);                            logoff(ctx[i]);                            EXEC SQL CONTEXT FREE :ctx[i];                            }                                /*Destroys mutex*/                                #ifdef DCE_THREADS                                if (pthread_mutex_destroy(&mutex))                            #else                                if (mutex_destroy(&mutex))                            #endif                                {                                printf("Can't destroy mutex\n");                            exit(1);                            }
}                                    /*********************************************************************                                    * Function: do_transaction                                    *                                    * Description:  This functions executes one transaction out of the                                     *               records array. The records array is 'managed' by                                    *               the get_transaction function.                                    *                                    *                                    ********************************************************************/
#ifdef DCE_THREADS                                    void do_transaction(params)
#else                                    void *do_transaction(params)
#endif
parameters *params;
{                                    struct sqlca sqlca;                                record_log *trx;                                sql_context ctx=params->ctx;                                /* Done all transactions ? */                                while (trx_nr < (sizeof(records)/sizeof(record_log)))                                {                                get_transaction(&trx);                            EXEC SQL WHENEVER SQLERROR DO err_report(sqlca);                            EXEC SQL CONTEXT USE :ctx;                            printf("Thread %d executing transaction\n",params->thread_id);                            switch(trx->action)                            {                            case 'M':  EXEC SQL UPDATE ACCOUNTS                            SET    BALANCE=BALANCE+:trx->amount                            WHERE  ACCOUNT=:trx->to_account;                            EXEC SQL UPDATE ACCOUNTS                            SET    BALANCE=BALANCE-:trx->amount                            WHERE  ACCOUNT=:trx->from_account;                            break;                            default:  break;                            }                            EXEC SQL COMMIT;                            }
}                                    /*****************************************************************                                    * Function: err_report                                    *                                    * Description: This routine prints out the most recent error                                    *                                    ****************************************************************/
void      err_report(sqlca)
struct sqlca sqlca;
{                                    if (sqlca.sqlcode < 0)                                    printf("\n%.*s\n\n",sqlca.sqlerrm.sqlerrml,sqlca.sqlerrm.sqlerrmc);                                    exit(1);
}                                    /*****************************************************************                                    * Function: logon                                    *                                    * Description: Logs on to the database as USERNAME/PASSWORD                                    *                                    *****************************************************************/
void      logon(ctx,connect_info)
sql_context ctx;
char * connect_info;
{                                    EXEC SQL WHENEVER SQLERROR DO err_report(sqlca);                                EXEC SQL CONTEXT USE :ctx;                                EXEC SQL CONNECT :connect_info;                                printf("Connected!\n");                                }                                    /******************************************************************                                    * Function: logoff                                    *                                    * Description: This routine logs off the database                                    *                                    ******************************************************************/
void      logoff(ctx)
sql_context ctx;
{                                    EXEC SQL WHENEVER SQLERROR DO err_report(sqlca);                                    EXEC SQL CONTEXT USE :ctx;                                    EXEC SQL COMMIT WORK RELEASE;                                    printf("Logged off!\n");
}                                    /******************************************************************                                    * Function: get_transaction                                    *                                    * Description: This routine returns the next transaction to process                                    *                                    ******************************************************************/
void get_transaction(trx)
record_log ** trx;
{                                    #ifdef DCE_THREADS                                if (pthread_mutex_lock(&mutex))                            #else                                if (mutex_lock(&mutex))                            #endif                                printf("Can't lock mutex\n");                            *trx = &records[trx_nr];                                trx_nr++;                                #ifdef DCE_THREADS                                if (pthread_mutex_unlock(&mutex))                            #else                                if (mutex_unlock(&mutex))                            #endif                                printf("Can't unlock mutex\n");
}                                    
本文转自健哥的数据花园博客园博客,原文链接:http://www.cnblogs.com/gaojian/p/3328430.html,如需转载请自行联系原作者

Oracle的 EXEC SQL CONTEXT学习相关推荐

  1. 判断题:oracle自带的sql语言环境是pl/sql,Oracle之PL/SQL学习笔记之数据类型(三)

    Oracle之PL/SQL学习笔记之数据类型(三) 所有的编程语言中变量是使用最频繁的.PL/SQL作为一个面向过程的数据库编程语言同样少不了变量,利用变量可以把PL/SQL块需要的参数传递进来,做到 ...

  2. Oracle之PL/SQL学习笔记之有名块练习

    2019独角兽企业重金招聘Python工程师标准>>> Oracle之PL/SQL学习笔记之有名块练习 存储过程案例: 案例1: 根据雇员姓名跟新雇员工资,如果雇员不存在输出没有该雇 ...

  3. 从永远到永远-Oracle的PL/SQL学习(存储过程学习)

    工作原因,涉及到了Oracle数据库的存储过程.以前没有接触过,请教了很多大佬,被喷的.被误导.被折腾的半4.总算是领悟了一点点的东西,现有时间总结下自己的一些感触. 1.关于PL/SQL 1.1 是 ...

  4. ORACLE SQL and SQL*PLUS 学习

    前言: 关系数据库的简单介绍 1970.Dr.E.F.codded 创建了关系数据库的模型(类似现在常用的二维表格) 关系数据库由许多数据对象组成, 被关系操作 SQL命令管理着, 数据之间有完整性的 ...

  5. oracle protocol=beq 不可用,学习笔记:Oracle数据库坏块 深入研究obj$坏块导致exp/expdp不能执行原因...

    天萃荷净 深入研究Oracle坏块obj$导致exp/expdp不能执行导出的原因 上篇(案例:Oracle出现obj$坏块exp/expdp导出不能导出的解决办法ORA-01578 ORA-0111 ...

  6. oracle基础之sql基础知识

    1. sql(Structured Query Language)是关系型数据库的基本操作语言. 包括数据库查询(Data Query),数据操纵(Data Manipulation),数据定义(Da ...

  7. Oracle 12c 新SQL提示(hint)

    Oracle 12c 新SQL提示(hint) Oracle 12c中引入了许多新特性,其中部分是和SQL相关的特性.而一些新的SQL提示也随着这些新特性被引入. enable_parallel_dm ...

  8. 下面为初学者分享一下SQL 数据库学习资料

    一.基础 1.说明:创建数据库 CREATE DATABASE database-name 2.说明:删除数据库 drop database dbname 3.说明:备份sql server --- ...

  9. SQL Server 学习系列之五

    SQL Server 学习系列之五 SQL Server 学习系列之一(薪酬方案+基础) SQL Server 学习系列之二(日期格式问题) SQL Server 学习系列之三(SQL 关键字) SQ ...

最新文章

  1. Worktile旗下智能化研发管理工具PingCode 宣布25人以下免费
  2. 年度第一效率神器:你一定不想错过它!
  3. cdr文件过大导出pdf打不开_PDF快速导出JPG对应的分辨率技巧
  4. 安装setuptools与pip
  5. 4.14 | 学习笔记
  6. FileOutStream
  7. 求生之路 服务器优化参数,《求生之路2》服务器及网络参数优化指南
  8. 80%的程序员都不了解的调试技巧
  9. 安卓模拟器网页游戏连不上服务器,关于夜神模拟器游戏无法联网的原因和解决方法,请逐一排查...
  10. 【mac】vmware tools 在菜单上显示灰色无法安装的问题
  11. 快去换电池!苹果召回6.3万台MacBook Pro 有你的吗?
  12. centos 5.11 mysql_CentOS 5.11rpm方式安装mysql
  13. Git学习总结(25)——Git 常用的分支开发模式及规范总结
  14. 对于开发 0 bug 代码的思考——Design by Contract 契约设计
  15. 偶师傅说过的很有意思的话
  16. Web端高保真动态交互Axure元件库
  17. 错题合集1_JavaSE章节测试
  18. npz文件转为npy_numpy文件存取-npz,npy
  19. 贪心 C - Kayaking
  20. drupal 的简单模板修改

热门文章

  1. iconfont 无法导入 svg_Figma绘制图标上传至iconfont的正确姿势
  2. android 双系统 一加5,[一加2][双ROM]一加手机2安装双系统教程
  3. 浏览器html5视频抓取,检测浏览器是否支持html5视频的代码
  4. ios10发邮件服务器拒绝,IOS10用户拒绝网络权限后,如何引导开启?
  5. 细数音频放大器的分类
  6. Proxmark3 Easy Gui 4.0 5.0 5.1加强版免费获取啦
  7. 【转】VB中NEW的用法(申请内存空间)
  8. Java8中String.join方法,让我们的代码更优美
  9. 《我的世界》AI大战降临:6000万帧超大数据集已发布,NeurIPS 19向你约战
  10. 中国首家干线物流联合创新中心成立