码迷,mamicode.com
首页 > 其他好文 > 详细

极简ProC连接TimesTen程序

时间:2016-07-15 21:04:46      阅读:129      评论:0      收藏:0      [点我收藏+]

标签:

TimesTen也支持Pro*C接口,从编程的角度来看,除了连接字符串的指定外,其它和针对Oracle的开发几乎一样。

Pro*C程序连接TimesTen的框架

我们先来看一下Pro*C程序连接TimesTen的框架:

int main(int argc, char** argv)
{

// 连接数据库,可以用以下三种方法之一

// 法一
    EXEC SQL CONNECT :user IDENTIFIED BY :pass USING :svc;
// 法二
    EXEC SQL CONNECT :connstr;
// 法三   
    EXEC SQL CONNECT :user IDENTIFIED BY :pass USING :easyconnstr;

// 执行DDL
    EXEC SQL CREATE TABLE a (a int);    

// 执行DML    
    EXEC SQL INSERT INTO a values(12345);   

// 断开连接
    EXEC SQL COMMIT WORK RELEASE;
    exit(0);

}

Pro*C程序连接TimesTen的三种方法

  1. EXEC SQL CONNECT :user IDENTIFIED BY :pass USING :svc;
    法1是最传统的方法,svc指定的service在tnsnames.ora中定义

  2. EXEC SQL CONNECT :connstr;
    法2是法1的一个变种,connstr的形式为”username/password@service”, service也是在tnsnames.ora中定义,例如
    “tthr/timesten@tnssampledb_1122”;

  3. EXEC SQL CONNECT :user IDENTIFIED BY :pass USING :easyconnstr;
    法3有些特别,不用TNS协议,而是直接使用easy connect字符串。
    easy connect的通用格式为[//]host[:port]/service_name:server[/instance]。
    TimesTen用的没这么复杂,简化的格式为hostname/DSN:driver, driver为timesten_client 或 timesten_direct,例如:
    “localhost/sampledb_1122:timesten_direct”;

我还是建议使用TNS,TNS相当于为应用加了一层虚拟化接口,变动接口时,可以不用改源程序,比较灵活。

预编译Pro*C程序

首先,预编译,是将.pc程序转化为.c程序

$ proc iname=helloworld.pc 

Pro*C/C++: Release 11.2.0.2.0 - Production on Thu Jul 14 07:31:58 2016

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

System default option values taken from: /u01/app/oracle/product/11.2.0/dbhome_1/precomp/admin/pcscfg.cfg


$ ls -l helloworld.c
-rw-rw-r-- 1 oracle oracle 6678 Jul 14 07:31 helloworld.c

编译和链接

[oracle@timesten-hol proc]$ gcc -c helloworld.c -I $INSTANT_CLIENT/sdk/include
[oracle@timesten-hol proc]$ ll helloworld.o
-rw-rw-r-- 1 oracle oracle 5904 Jul 14 08:17 helloworld.o
[oracle@timesten-hol proc]$ gcc -o helloworld helloworld.o -L $INSTANT_CLIENT -lclntsh
[oracle@timesten-hol proc]$ ll helloworld
-rwxrwxr-x 1 oracle oracle 10446 Jul 14 08:18 helloworld

执行程序

这个程序的逻辑和之前的 极简Java连接TimesTen程序 是一样的。

$ ./helloworld

Command> select * from a;
< 12345 >

[oracle@timesten-hol proc]$ ./helloworld 

ORACLE error--

ORA-00955: TT2207: Table A already exists -- file "plittddl.c", lineno 737, procedure "plittCreate"

Command> drop table a;
Command> select * from a;
< 12345 >

$ ./helloworld
Command> select * from a;
< 12345 >

总结

Pro*C可以很简单的连接TimesTen, 和连接Oracle没有区别,不过我还是更建议不用 Pro*C,不伦不类的。
要性能,你可以用C,要简单和灵活性,你就用Java好了。

附录 helloworld.pc程序

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sqlda.h>
#include <sqlcpr.h>

void sql_error(char *msg);

int main(int argc, char** argv)
{
    char  user[32] = "tthr";
    char  pass[32] = "timesten";
    char  svc[32] = "tnssampledb_1122";
    char connstr[128] = "tthr/timesten@tnssampledb_1122";
    char easyconnstr[128] = "localhost/sampledb_1122:timesten_direct";

    EXEC SQL WHENEVER SQLERROR DO sql_error("ORACLE error--\n");

//  EXEC SQL CONNECT :user IDENTIFIED BY :pass USING :svc;
    EXEC SQL CONNECT :connstr;
//  EXEC SQL CONNECT :user IDENTIFIED BY :pass USING :easyconnstr;

    EXEC SQL CREATE TABLE a (a int);    

    EXEC SQL INSERT INTO a values(12345);   

    EXEC SQL COMMIT WORK RELEASE;
    exit(0);

}

void sql_error(char *msg)
{
    char err_msg[128];
    size_t buf_len, msg_len;

    EXEC SQL WHENEVER SQLERROR CONTINUE;

    printf("\n%s\n", msg);
    buf_len = sizeof (err_msg);
    sqlglm((unsigned char *) err_msg, &buf_len, &msg_len);
    printf("%.*s\n", (int) msg_len, err_msg);

    EXEC SQL ROLLBACK RELEASE;
    exit(EXIT_FAILURE);
}

极简ProC连接TimesTen程序

标签:

原文地址:http://blog.csdn.net/stevensxiao/article/details/51917477

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!