通过在过程化编程语言中嵌入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. 装饰器1、无参数的装饰器 2、有参数的装饰器 3、装饰器本身带参数的以及如果函数带return结果的情况

     装饰器分成三种: 1.无参数的: 2.有参数的: 3.装饰器本身带参数的. 装饰器decorator又叫语法糖 定义:本质是函数,器就是函数的意思.装饰其他函数.就是为其他函数添加附加功能. 原则: ...

  2. ecshop移动端支付宝支付对接

    初始页,提交基本信息到api页面, <?php /* * * 功能:支付宝手机网站支付接口接口调试入口页面 * 版本:3.4 * 修改日期:2016-03-08 * 说明: * 以下代码只是为了 ...

  3. 关于服务端控件textbox的disabled属性设置为disabled后在服务端无法取值的问题

    在asp.net 1.x版本中,当textbox控件的disabled属性设置为disabled的时候看,在服务端还是可以通过控件id.text获取到textbox的值的,只是不能输入值而已.但是在以 ...

  4. windows环境下,安装zookeeper~

    1.   概述 ZooKeeper是Hadoop的正式子项目,它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护.名字服务.分布式同步.组服务等.ZooKeeper的目标就是封装好复杂 ...

  5. shulti模块简述

    #-*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" import shutil shutil.copyfileobj('D:\\3. ...

  6. C语言中字符数据的输入和输出

    字符的输出 C语言中使用putchar函数来输出字符数据 #include <stdio.h> int main() { char a,b,c,d; //定义字符变量a,b,c,d a = ...

  7. 用python40行代码编写的计算器

    效果图 代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 ...

  8. BurpSuite—-Sequencer模块(定序器)

    一.简介 Burp Sequencer是一种用于分析数据项的一个样本中的随机性质量的工具.你可以用它来测试应用程序的session tokens(会话tokens)或其他重要数据项的本意是不可预测的, ...

  9. 最长回文子串(Mirrored String II)

    Note: this is a harder version of Mirrored string I. The gorillas have recently discovered that the ...

  10. springBean之BeanFactory与ApplicationContext

    一.主要区别: 两者都是通过xml配置文件加载bean,ApplicationContext和BeanFacotry相比,提供了更多的扩展功能,但其主要区别在于后者是延迟加载,如果Bean的某一个属性 ...