极简ProC连接TimesTen程序
2016-07-15 14:26
483 查看
TimesTen也支持Pro*C接口,从编程的角度来看,除了连接字符串的指定外,其它和针对Oracle的开发几乎一样。
法1是最传统的方法,svc指定的service在tnsnames.ora中定义
EXEC SQL CONNECT :connstr;
法2是法1的一个变种,connstr的形式为”username/password@service”, service也是在tnsnames.ora中定义,例如
“tthr/timesten@tnssampledb_1122”;
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相当于为应用加了一层虚拟化接口,变动接口时,可以不用改源程序,比较灵活。
要性能,你可以用C,要简单和灵活性,你就用Java好了。
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的三种方法
EXEC SQL CONNECT :user IDENTIFIED BY :pass USING :svc;法1是最传统的方法,svc指定的service在tnsnames.ora中定义
EXEC SQL CONNECT :connstr;
法2是法1的一个变种,connstr的形式为”username/password@service”, service也是在tnsnames.ora中定义,例如
“tthr/timesten@tnssampledb_1122”;
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); }
相关文章推荐
- 欢迎使用CSDN-markdown编辑器
- 准备 KVM 实验环境 - 每天5分钟玩转 OpenStack(3)
- 虚拟化 - 每天5分钟玩转 OpenStack(2)
- java.lang.NoClassDefFoundError:org/apache/commons/lang/exception/NestableRuntimeException报错的原因
- 11. vSphere PowerCLI试用(二):常用命令
- mysqladmin: connect to server at 'localhost' failed error: 'Access denied for user 'root'@'localho
- CSS布局
- Mac 系统 Versions配置(SNV)添加新路径
- windows下mysql忘记root密码的解决方法
- 机器学习中的数学(2)-线性回归,偏差、方差权衡
- linux下自动完整备份数据库
- ACM[数论公式]
- 关于xxe外部实体注入的一个问题 一个实例 20160715
- 文件操作
- 【转】【C#】ColorMatrix
- 一种新的隐藏-显示模式诞生——css3的scale(0)到scale(1)
- 线程池的作用
- Flume+Hadoop+Hive的离线分析系统基本架构
- Android ANR和Crash问题小结--分析log
- Linux内核 TCP/IP、Socket参数调优