通过在过程化编程语言中嵌入SQL语句而开发出的应用程序称为Pro程序。
在C/C++语言中嵌入SQL语句而开发出的应用程序称为Pro*C/C++程序。
  –在通用编程语言中使用的SQL称为嵌入式SQL;
  –在SQL标准中定义了多种语言的嵌入式SQL。
 
 

宿主语言     Pro程序

C/C++            Pro*C/C++

FORTRAN          Pro*FORTRAN

PASCAL           Pro*PASCAL

COBOL            Pro*COBOL

ProC/C++预编译程序
  –完成pc源程序到c/c++源程序的转换。
基本命令格式

  PROC INAME=filename [OptionName1=value1]…[OptionNameN=valueN]

proc常用选项说明

选项

说明

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

是否支持多线程的应用程序

–在命令行输入不带选项的proc命令就可以列出所有选项以及当前默认值
–proc 选项=?就可以查看选项说明
 
gcc或者g++链接时需要增加

-L${ORACLE_HOME}/lib –lclntsh

指示编译器需要链接相关的库文件

开发之前先写一个适合proc使用的makefile
 
 
 
首先定义几个常量
.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)
 
使用proc编程步骤
  –头文件包含和相关说明定义;
  –安装错误处理函数;
  –初始化数据库;
  –连接到数据库;
  –执行SQL语句;
  –断开连接;
  –释放相关资源。
 
pc文件的编写
首先包含三个最基本的头文件

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

pc文件中如果在内嵌SQL语句中使用的变量,一定需要在EXEC SQL BEGIN DECLARE SECTION块语句中申明:

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程序设计的更多相关文章

  1. 读书笔记——Windows环境下32位汇编语言程序设计(9)ANSII字符大小写转大写

    在罗云彬的<Windows环境下32位汇编语言程序设计>中第321页 ... .const szAllowedChar db '0123456789ABCDEFabcdef',08h .. ...

  2. 【MPI学习5】MPI并行程序设计模式:组通信MPI程序设计

    相关章节:第13章组通信MPI程序设计. MPI组通信与点到点通信的一个重要区别就是:组通信需要特定组内所有成员参与,而点对点通信只涉及到发送方和接收方. 由于需要组内所有成员参与,因此也是一种比较复 ...

  3. 《汇编语言程序设计》——仿windows计算器

    <汇编语言程序设计> ——计算器程序设计 目录 一.     题目与目标 1.      题目 2.      学习目的 二.     分析与设计 1.      系统分析 2.      ...

  4. /proc/xxx/maps简要记录

    定位内存泄漏基本上是从宏观到微观,进而定位到代码位置. 从/proc/meminfo可以看到整个系统内存消耗情况,使用top可以看到每个进程的VIRT(虚拟内存)和RES(实际占用内存),基本上就可以 ...

  5. MSSQL 视图/事务(TRAN[SACTION])/存储过程(PROC[EDURE])/触发器(TRIGGER )

    --视图 视图是一张虚拟表,它表示一张表的部分数据或多张表的综合数据,其结构和数据是建立在对表的查询基础上 视图在操作上和数据表没有什么区别,但两者的差异是其本质是不同: 数据表是实际存储记录的地方, ...

  6. 虚拟网卡TUN/TAP 驱动程序设计原理

    昨天韦哥写了<Linux下Tun/Tap设备通信原理>一文,只提到了两个使用Tun的用户进程之间的通信路径,并没有说明Tun虚拟网卡驱动是如何实现的,而正好看到了这里的一篇讲解这方面的文章 ...

  7. 《80x86汇编语言程序设计》保护模式第一个例题

    <80x86汇编语言程序设计>保护模式第一个例题的一些个人理解和注视 ; 16位偏移的段间直接转移指令的宏定义 jump macro selector, offsetv db 0eah   ...

  8. Intel汇编语言程序设计学习-第五章 过程-下

    5.3.3  库测试程序 测试程序#1:整数I/O 该测试程序把输出文本的颜色改为蓝底黄字,然后以十六进制数显示七个数组的内容,最后提示用户输入一个有符号整数,再分别以十进制.十六进制和二进制格式重复 ...

  9. Intel汇编语言程序设计学习-第四章 数据传送、寻址和算术运算-下

    4.3  和数据相关的操作符和伪指令 操作符和伪指令并非机器可执行的指令,相反,它们是由汇编器进行解释的.开发者可以使用一系列的MASM操作符或伪指令获取数据的地址以及大小等特征信息: OFFSET操 ...

随机推荐

  1. Delphi 连接 Paradox

    应用TDataBase控件把DataBase的DriveName设为STANDARD,然后设置DataBase的Params中设置PATH=*.db文件地点目录DEFAULT DRIVER=PARAD ...

  2. substr的学习(PHP学习)

    substr的用法: 首先看PHP手册 ,手册上是这样说的 string substr ( string $string , int $start [, int $length ] ) 执行subst ...

  3. ODBC、OLEDB、ADO、SQL的关系

    对于一个刚接触数据库的菜鸟来说(比如我),总是搞不清SQL.ADO.OLE DB.ODBC,大脑中一片混乱,好像懂了,又好像没懂,非常的苦恼,今天下了点功夫研究了一下,贴出来,其中肯定有好多错误,希望 ...

  4. 你知道PORT吗?

    在TCP协议中,有端口(PORT)的概念,很多人都不知道端口到底是什么.之前介绍过物理地址,也就是网卡地址,做个不恰当的比喻,物理地址(MAC)地址,相当于身份证(唯一),家庭地址是几幢几单元相当于I ...

  5. lua语法基本

    lua的下载 http://luabinaries.sourceforge.net/点击所要下载的版本比如我下的是5.3.3https://sourceforge.net/projects/luabi ...

  6. php排序集合

    如果你已经使用了一段时间PHP的话,那么,你应该已经对它的数组比较熟悉了——这种数据结构允许你在单个变量中存储多个值,并且可以把它们作为一个集合进行操作. 经常,开发人员发现在PHP中使用这种数据结构 ...

  7. ITextSharp Table使用 (转)

    原文:http://www.cnblogs.com/LifelongLearning/archive/2011/05/16/2048116.html 表格是我们在制作文档时,经常使用的一个元素.对布局 ...

  8. Linq语句:三表联查

    var db = new DataEntities2();            var sss = ( from c in db.AIRPORT_HELIPORT                   ...

  9. 匿名类型与Select方法实现自定义对象插入局部表结构中

    在提取局部表结构数据时,通过Select选取需要的字段,如下句,此时其实产生了一个不用于_menuMan的原新数据类型new { c.SYS_COMMANDS_ID,c.TXT_COMMANDTITL ...

  10. 分布式爬虫搭建系列 之三---scrapy框架初用

    第一,scrapy框架的安装 通过命令提示符进行安装(如果没有安装的话) pip install Scrapy 如果需要卸载的话使用命令为: pip uninstall Scrapy 第二,scrap ...