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操 ...
随机推荐
- Android Studio----- 无法打印---log----问题总结----华为坑深(转)
问题描述:安卓真机调试时 System.out.println 无法输出, err则可以:Log.e,w可以,但其他不行. 解决方法,按如下方式查看酷派手机默认设置日志未warn方式. 酷派手机: * ...
- hbase使用中需要注意一些问题
接触hbase已经两年之久,但是真正的在实际项目中使用却只有半年的时间,使用过程中,一方面在在为hbase强大的性能兴奋之余,另一方面却也给我和我的团队造成了很多的麻烦,起初在使用我的水平也就停留在会 ...
- dpkg安装工具
dpkg --info "软件包名" --列出软件包解包后的包名称. dpkg -l --列出当前系统中所有的包.可以和参数less一起使用在分屏查看. (类似于rpm -qa) ...
- Hyperledger Fabric快速上手
安装go curl -O https://storage.googleapis.com/golang/go1.10.2.linux-amd64.tar.gz tar -xvf go1.10.2.lin ...
- MariaDB存在的问题
MySQL与MariaDB对嵌套的查询语句当中的order by的处理方法不同.MySQL会忠实执行内层查询的排序子句,但是MariaDB会将这个order by去掉,理论依据就是关系理论 --- 一 ...
- C Primer Plus学习笔记(九)- 数组和指针
数组 数组由数据类型相同的同一系列元素组成 需要使用数组时,通过声明数组告诉编译器数组中内含多少元素和这些元素的类型 普通变量可以使用的类型,数组元素都可以用 float candy[365]; // ...
- java成神之——date和calendar日期的用法
date和calendar日期的用法 util的data转换成sql的data 创建Date对象 格式化 Instant ChronoUnit LocalTime LocalDate LocalDat ...
- openstack resize 更新显卡驱动程序解决问题
- python签名设计
将一个签名网站http://www.uustv.com/的内容爬下来显示出来 代码:sign.py from tkinter import * from tkinter import messageb ...
- wordpress 学习笔记
(1) __()函数 function __( $text, $domain = 'default' ) { return translate( $text, $domain ); } 返回一个字符串 ...