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操 ...
随机推荐
- Ambari的资源池管理
操作: YARN→Config→Advanced→Schedule capacity-scheduler=null yarn.scheduler.capacity.default.minimum-us ...
- 关于yum
1. yum的本地安装 yum install --downloadonly --downloaddir=/opt/software cd /opt/software yum localinstall ...
- 第15篇 PSR-04 规范
1. Overview This PSR describes a specification for autoloading classes from file paths. It is fully ...
- php-excel 与 laravel-excel
php-excel: http://blog.csdn.net/evkj2013/article/details/65441170 php-excel中文手册(前端的jqury) http://www ...
- 蓝桥杯 算法训练 ALGO-108 最大的体积
算法训练 最大体积 时间限制:1.0s 内存限制:256.0MB 问题描述 每个物品有一定的体积(废话),不同的物品组合,装入背包会战用一定的总体积.假如每个物品有无限件可用,那么有些体积是永 ...
- java代码从键盘输入n的值,计算1+1/2+1/3+...+1/n的值,,
总结:谢谢陈勇老师.很棒的指导.超有爱. 总是不思考++++如内存的分析.堆和栈.堆内存里对象,字符串,栈里基本数据类型 来龙去脉,属性方法的调用,都不是很理解.... package com.c2; ...
- 1041 Be Unique
题意:找到一串数字序列中首个出现的不重复的数字. 思路:用哈希,因为数值大小在[1,10^4],所以可以直接开数组.输入数据时记录每个数字出现过的次数.然后遍历原序列,遇到第一个次数为1的数字就是所求 ...
- C# 结构体集合元素属性不可修改疑惑
背景:用C#的人都知道结构体在C#中是值类型的,由于这个原因出现了一个有趣的问题,那就是结构体集合通过数字索引修改对应属性的值能不能影响到集合中的结构体呢?答案很多人可能会说不能,因为结构体是值类型的 ...
- java中的类型安全问题-Type safety: Unchecked cast from Object to ...
首先,java语言室类型安全的,通常我们遇到这个问题是出现在Object转化为目标类型时, 这个转化并不是安全的.这个问题普遍认为因为使用了jdk1.5或者1.6的泛型, request.getAtt ...
- 优于jdbc的mybatis框架入门
1.什么是mybatis? MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架. MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置以及对结果集的检索. MyB ...