热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

极简ProC连接TimesTen程序

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

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

编译和链接

export INSTANT_CLIENT=$TT_HOME/ttoracle_home/instantclient_11_2
$ gcc -c helloworld.c -I $INSTANT_CLIENT/sdk/include
$ ll helloworld.o
-rw-rw-r-- 1 oracle oracle 5904 Jul 14 08:17 helloworld.o
$ gcc -o helloworld helloworld.o -L $INSTANT_CLIENT -lclntsh
$ ll helloworld
-rwxrwxr-x 1 oracle oracle 10446 Jul 14 08:18 helloworld

在此阶段定义了INSTANT_CLIENT,所谓instant client,就是一个简版的oracle client。

Oracle Instant Client is a light-weight software which helps to run OCI, OBDBC, Pro*C, JDBC without installing full Oracle client.

这就很好理解TimesTen自带的sqlplus可以连接Oracle数据库了。

执行程序

这个程序的逻辑和之前的 极简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 
#include 
#include 
#include 
#include 

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);
}

附件 tnsnames.ora

tnssampledb_1122 =(DESCRIPTION=(CONNECT_DATA = (SERVICE_NAME = sampledb_1122)(SERVER = timesten_direct))) 

附件 DSN定义

这个是缺省安装自动产生的DSN,没有做修改

[sampledb_1122]
Driver=/home/oracle/TimesTen/tt1122/lib/libtten.so
DataStore=/home/oracle/TimesTen/tt1122/info/DemoDataStore/sampledb_1122
PermSize=40
TempSize=32
PLSQL=1
DatabaseCharacterSet=US7ASCII

Makefile

SHELL=/bin/sh

TT_MVL_LINUX    = 0

INSTDIR         = /home/oracle/TimesTen/tt1122
COMMDIR         = $(INSTDIR)/quickstart/sample_code/common
TTORACLE_HOME   = $(INSTDIR)/ttoracle_home/instantclient_11_2
OCIINCS         = $(TTORACLE_HOME)/sdk/include

CC              = gcc

PLATCFLAGS      = -Os -finline-functions
LDFLAGS         =

EXTRALIBS       = -lpthread -lm -lrt

ifeq ($(TT_MVL_LINUX),1)
EXTRALIBS       += -ldl -lnsl -lnnz11
endif

INCS        = -I$(INSTDIR)/include -I$(COMMDIR) -I$(OCIINCS)

CSDEFS          = -DTTCLIENTSERVER
CFLAGS          = $(PLATDEFS) $(PLATCFLAGS) $(INCS)

TTLINK           = -L$(INSTDIR)/lib -L$(TTORACLE_HOME) -Wl,-rpath,$(INSTDIR)/lib

ICLIBS          = $(TTLINK) -lclntsh  $(EXTRALIBS)

HELLOWORLD  = helloworld
HELLOWORLDOBJS = helloworld.o

PROGS           = $(HELLOWORLD)
C_FILES         = helloworld.c

#
# Top level targets
#

all: $(PROGS)

clean:
    rm -f $(PROGS) *.o *.lis $(C_FILES)


#
# Targets for building executables
#

$(HELLOWORLD): $(HELLOWORLDOBJS)
    $(CC) -o $@ $(LDFLAGS) $(HELLOWORLDOBJS) $(ICLIBS)


#
# Target for building object files
#

.c.o:
    $(CC) $(CFLAGS) -o $@ -c $<


#
# Targets for Oracle Pro*C Pre-compilation
#

helloworld.c: helloworld.pc
    @proc include=$(COMMDIR) iname=helloworld.pc cOnfig=pcscfg.cfg 

补充:第四中连接方法TWO_TASK

在连接串中可以不指定服务,如下面的形式:

EXEC SQL CONNECT :user IDENTIFIED BY :pass

然后在环境变量中指定数据库名,环境变量的值既可以是TNS名,也可以是easy connect字符串。

环境变量的名字在Unix/Linux下是TWO_TASK,在Windows下是LOCAL。

如下例. 先测试TNS名:

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

ORACLE error--

ORA-00955: name is already used by an existing object

$ export TWO_TASK=tnssampledb_1122
$ ./helloworld 

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

再测试easy connect 字符串:

$ export TWO_TASK='localhost/sampledb_1122:timesten_direct'
$ echo $TWO_TASK
localhost/sampledb_1122:timesten_direct
$ ./helloworld 
Command> select * from a;
<12345 >

参考

  • TimesTen C Developer’s Guide
  • http://psoug.org/oraerror/PCC-02362.htm
  • [Oracle Instant Client](http://www.oracle.com/techne
  • twork/database/features/instant-client/index-097480.html)
  • https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:89412348059
  • Introduction to Pro*C

推荐阅读
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文介绍了基于c语言的mcs51单片机定时器计数器的应用教程,包括定时器的设置和计数方法,以及中断函数的使用。同时介绍了定时器应用的举例,包括定时器中断函数的编写和频率值的计算方法。主函数中设置了T0模式和T1计数的初值,并开启了T0和T1的中断,最后启动了CPU中断。 ... [详细]
  • 本文介绍了为什么要使用多进程处理TCP服务端,多进程的好处包括可靠性高和处理大量数据时速度快。然而,多进程不能共享进程空间,因此有一些变量不能共享。文章还提供了使用多进程实现TCP服务端的代码,并对代码进行了详细注释。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 移动端常用单位——rem的使用方法和注意事项
    本文介绍了移动端常用的单位rem的使用方法和注意事项,包括px、%、em、vw、vh等其他常用单位的比较。同时还介绍了如何通过JS获取视口宽度并动态调整rem的值,以适应不同设备的屏幕大小。此外,还提到了rem目前在移动端的主流地位。 ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • WhenIusepythontoapplythepymysqlmoduletoaddafieldtoatableinthemysqldatabase,itdo ... [详细]
author-avatar
hh呢喃_845
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有