PROC程序设计
宿主语言 Pro程序
C/C++ Pro*C/C++
FORTRAN Pro*FORTRAN
PASCAL Pro*PASCAL
COBOL Pro*COBOL
PROC INAME=filename [OptionName1=value1]…[OptionNameN=valueN]
选项 |
值 |
说明 |
INAME |
Filename |
proc源文件名称 |
INCLUDE |
Pathname |
指示proc去哪里找#include中包含的头文件 |
ONAME |
Filename |
预编译完成后输出文件名称 |
CPOOL |
YES,NO |
是否支持连接共享 |
MODE |
ANSI,ISO,ORACLE |
代码对 Oracle 或 ANSI 规则的顺应性 |
CODE |
ANSI_C,CPP,KR_C |
所要生成的代码类型 |
PARSE |
FULL,PARITIAL,NONE |
控制对哪一 非 SQL 代码进行语法分析 |
THREADS |
YES,NO |
是否支持多线程的应用程序 |
-L${ORACLE_HOME}/lib –lclntsh
指示编译器需要链接相关的库文件
首先定义几个常量
.SUFFIXES: .c .o
CC=gcc
PROC=proc PROCSRCS=oracle.pc
SRCS=$(PROCSRCS:.pc=.c)
OBJS=$(SRCS:.c=.o) ORACLE_HOME=/opt/oracle/product/11.2.
ORAFLAGS1=/usr/include/linux
ORAFLAGS2=/usr/lib/gcc/i686-redhat-linux/4.4./include
定义编译命令
EXEC=abc
all: $(OBJS)
$(CC) -L${ORACLE_HOME}/lib -lclntsh -o $(EXEC) $(OBJS)
@echo '^_^ ^_^ ^_^ ^_^ ^_^ ^_^ OK ^_^ ^_^ ^_^ ^_^ ^_^ ^_^'
.c.o: $(SRCS)
$(CC) -Wall -g -o $@ -c $<
$(SRCS):
${PROC} INAME=$(PROCSRCS) INCLUDE=$(ORAFLAGS1) INCLUDE=$(ORAFLAGS2) CPOOL=YES MODE=ANSI CODE=ANSI_C PARSE=PARTIAL THREADS=YES ONAME=$(SRCS)
clean:
rm -f $(OBJS)
rm -f $(SRCS)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
EXEC SQL BEGIN DECLARE SECTION;
sql_context pContext;
long SQLCODE;
EXEC SQL END DECLARE SECTION;
安装错误处理函数:
extern void sqlglmt(void*, char*, size_t*, size_t* );
void sql_error()
{
char sErrorString[];
size_t tMessageSize = ;
size_t tErrorSize = sizeof(sErrorString);
memset(sErrorString, , sizeof(sErrorString));
sqlglmt(pContext, sErrorString, &tErrorSize, &tMessageSize);
sErrorString[tMessageSize] = ;
printf("%s\n", sErrorString);
}
初始化数据库:
void sql_init()
{
SQLCODE = ;
pContext = NULL;
EXEC SQL ENABLE THREADS;
EXEC SQL CONTEXT ALLOCATE :pContext;
EXEC SQL CONTEXT USE :pContext;
}
连接到数据库:
int sql_connect(const char *User, const char *Password, const char *DBName)
{
EXEC SQL BEGIN DECLARE SECTION;
const char *sUser;
const char *sPassword;
const char *sServer;
EXEC SQL END DECLARE SECTION;
SQLCODE = ; sUser = User; sPassword = Password; sServer = DBName;
EXEC SQL CONNECT :sUser IDENTIFIED BY :sPassword USING :sServer;
if (SQLCODE != )
{
sql_error();
return ;
}else
return ;
}
执行一个非SELECT SQL语句:
int sql_exec(const char *DySQL)
{
EXEC SQL BEGIN DECLARE SECTION;
const char *sDySQL;
EXEC SQL END DECLARE SECTION; SQLCODE = ;
sDySQL = DySQL;
EXEC SQL EXECUTE IMMEDIATE :sDySQL;
if (SQLCODE != )
{
sql_error();
return ;
}else
{
return ;
}
}
提交事务:
int sql_commit()
{
SQLCODE = ;
EXEC SQL COMMIT WORK;
if (SQLCODE != )
{
sql_error();
return ;
}else
{
return ;
}
}
回滚事务:
int sql_rollback()
{
SQLCODE = ;
EXEC SQL ROLLBACK WORK;
if (SQLCODE != )
{
sql_error();
return ;
}else
{
return ;
}
}
执行一个SELECT语句,并查看返回结果(一):
int sql_open(const char *DySQL)
{
EXEC SQL BEGIN DECLARE SECTION;
int i, iOutput_count, iOccurs, iType, iLen;
short iInd;
char sData[];//result buffer;
char sOutput[];
char sInput[];
const char *sDySQL;
EXEC SQL END DECLARE SECTION;
执行一个SELECT语句,并查看返回结果(二):
SQLCODE = ;
iLen = sizeof(sData);
iType = ;//set type is varchar;
sDySQL = DySQL;
sprintf(sOutput, "output%p", pContext);
sprintf(sInput, "input%p", pContext);
EXEC SQL ALLOCATE DESCRIPTOR :sOutput;
EXEC SQL ALLOCATE DESCRIPTOR :sInput;
EXEC SQL PREPARE S FROM :sDySQL;
执行一个SELECT语句,并查看返回结果(三):
if (SQLCODE != )
{
sql_error();
EXEC SQL DEALLOCATE DESCRIPTOR :sInput;
EXEC SQL DEALLOCATE DESCRIPTOR :sOutput;
return ;
}
执行一个SELECT语句,并查看返回结果(四):
EXEC SQL DECLARE C CURSOR FOR S;
EXEC SQL OPEN C USING DESCRIPTOR :sInput;
/*选择输出区域*/
EXEC SQL DESCRIBE OUTPUT S USING DESCRIPTOR :sOutput;
/*取得选择列表的个数*/
EXEC SQL GET DESCRIPTOR :sOutput :iOutput_count = COUNT;
for(i=;i<iOutput_count;i++)
{
iOccurs = i + ;
EXEC SQL SET DESCRIPTOR :sOutput
VALUE :iOccurs TYPE = :iType, LENGTH = :iLen;
}
执行一个SELECT语句,并查看返回结果(五):
EXEC SQL WHENEVER NOT FOUND DO BREAK;
while()
{
/*行数据,输出描述区*/
EXEC SQL FETCH C INTO DESCRIPTOR :sOutput;
for(i=;i < iOutput_count;i++)
{
iOccurs = i + ;
memset(sData, , sizeof(sData));
iInd = ;
EXEC SQL GET DESCRIPTOR :sOutput
VALUE :iOccurs :sData = DATA, :iInd = INDICATOR;
if (iInd == -)
{
printf("%s\t", "NULL");
}
else
{
printf("%s\t", sData);
}
}
printf("\n");
}
执行一个SELECT语句,并查看返回结果(六):
EXEC SQL CLOSE C;
EXEC SQL DEALLOCATE DESCRIPTOR :sOutput;
EXEC SQL DEALLOCATE DESCRIPTOR :sInput;
return ;
}
断开连接:
int sql_disconnect()
{
SQLCODE = ;
EXEC SQL ROLLBACK WORK RELEASE;
if (SQLCODE != )
{
sql_error();
return ;
}else
{
return ;
}
}
释放相关资源:
int sql_free()
{
SQLCODE = ;
EXEC SQL CONTEXT FREE :pContext;
if (SQLCODE != )
{
sql_error();
return ;
}else
{
return ;
}
}
main函数调用的例子:
int main()
{
sql_init();
sql_connect("dbuser1", "dbuser1", "orcl");
sql_open("select * from baidu");
//sql_commit();
sql_disconnect();
sql_free();
return ;
}
PROC程序设计的更多相关文章
- 读书笔记——Windows环境下32位汇编语言程序设计(9)ANSII字符大小写转大写
在罗云彬的<Windows环境下32位汇编语言程序设计>中第321页 ... .const szAllowedChar db '0123456789ABCDEFabcdef',08h .. ...
- 【MPI学习5】MPI并行程序设计模式:组通信MPI程序设计
相关章节:第13章组通信MPI程序设计. MPI组通信与点到点通信的一个重要区别就是:组通信需要特定组内所有成员参与,而点对点通信只涉及到发送方和接收方. 由于需要组内所有成员参与,因此也是一种比较复 ...
- 《汇编语言程序设计》——仿windows计算器
<汇编语言程序设计> ——计算器程序设计 目录 一. 题目与目标 1. 题目 2. 学习目的 二. 分析与设计 1. 系统分析 2. ...
- /proc/xxx/maps简要记录
定位内存泄漏基本上是从宏观到微观,进而定位到代码位置. 从/proc/meminfo可以看到整个系统内存消耗情况,使用top可以看到每个进程的VIRT(虚拟内存)和RES(实际占用内存),基本上就可以 ...
- MSSQL 视图/事务(TRAN[SACTION])/存储过程(PROC[EDURE])/触发器(TRIGGER )
--视图 视图是一张虚拟表,它表示一张表的部分数据或多张表的综合数据,其结构和数据是建立在对表的查询基础上 视图在操作上和数据表没有什么区别,但两者的差异是其本质是不同: 数据表是实际存储记录的地方, ...
- 虚拟网卡TUN/TAP 驱动程序设计原理
昨天韦哥写了<Linux下Tun/Tap设备通信原理>一文,只提到了两个使用Tun的用户进程之间的通信路径,并没有说明Tun虚拟网卡驱动是如何实现的,而正好看到了这里的一篇讲解这方面的文章 ...
- 《80x86汇编语言程序设计》保护模式第一个例题
<80x86汇编语言程序设计>保护模式第一个例题的一些个人理解和注视 ; 16位偏移的段间直接转移指令的宏定义 jump macro selector, offsetv db 0eah ...
- Intel汇编语言程序设计学习-第五章 过程-下
5.3.3 库测试程序 测试程序#1:整数I/O 该测试程序把输出文本的颜色改为蓝底黄字,然后以十六进制数显示七个数组的内容,最后提示用户输入一个有符号整数,再分别以十进制.十六进制和二进制格式重复 ...
- Intel汇编语言程序设计学习-第四章 数据传送、寻址和算术运算-下
4.3 和数据相关的操作符和伪指令 操作符和伪指令并非机器可执行的指令,相反,它们是由汇编器进行解释的.开发者可以使用一系列的MASM操作符或伪指令获取数据的地址以及大小等特征信息: OFFSET操 ...
随机推荐
- Python学习系列(六)(模块)
Python学习系列(六)(模块) Python学习系列(五)(文件操作及其字典) 一,模块的基本介绍 1,import引入其他标准模块 标准库:Python标准安装包里的模块. 引入模块的几种方式: ...
- 一个靠谱的maven仓库镜像地址
<mirror> <id>sprintio</id> <mirrorOf>central</mirrorOf> <name&g ...
- 关于Gateway
为什么要有gateway?就是因为如果没有,很多的功能需要在在每个微服务中都实现,这样成本很高.
- 手把手教你在Eclipse中使用CVS Branch功能
Brach 的作用: 开发新版本的人员就基于 main trunk 工作,而 fix bug 的人员就基于 branch 工作. 一旦在 branch上将 Release_1_0的 bug修复了,我们 ...
- cpu 核数及逻辑数统计
查看逻辑CPU个数:cat /proc/cpuinfo |grep "processor"|sort -u|wc -l24 查看物理CPU个数:grep "physica ...
- Avalon总线概述
Nios系统的所有外设都是通过Avalon总线与Nios CPU相接的,Avalon总线是一种协议较为简单的片内总线,Nios通过Avalon总线与外界进行数据交换. Avalon总线接口分类 可分为 ...
- web.config 权限设置
<system.web> <authorization> <!--未登陆用户不可以访问--> <deny users="?" /> ...
- PHP获取路径
//获取域名或主机地址 echo $_SERVER['HTTP_HOST']."<br>"; #jiqing.nikon.com echo 'http://'.$_SE ...
- xunsearch进阶使用
目录 设置分页 设置排序 读取文档结果 搜索结果高亮处理 获取数量 获取热门搜索词 获取相关搜索词 设置分页 $search->setLimit(5); // 设置返回结果为前 5 条 $sea ...
- Java学习之Dubbo+ZooKeeper分布式服务Demo
背景:在之前的一个<Java学习之SpringBoot整合SSM Demo>分享中说到搭建ZooKeeper和Dubbo分布式框架中遇到了一些技术问题没能成功,只分享了其中的一个中间产物, ...