PRO*C是Oracle提供的应用程式专用开发工具,它以C语言为宿主语言,能在C程式中嵌入SQL语句,进行资料库操作。这种嵌入式的SQL语句容易掌握,适合初学者。
基本介绍
- 外文名:pro*c
- 性质:工具
- 宿主语言:C语言
- 适合:初学者
工具概述
ORACLE支持在几种高级语言内嵌入SQL语句,或ORACLE库函式调用来访问资料库。它们是C,COBOL,Ada,PASCAL,PL/I等,这些语言称之为宿主语言,用它们开发的程式就称为PRO* 程式,如PRO*C,PRO*COBOL等。
PROC在ORACLE的客户端软体中就有,安装oracle时选上即可。
工具介绍
1.什幺是Pro*C/C++
通过在过程化程式语言C/C++中嵌入SQL语句而开发出的应用程式.
2.简要说明:
在通用程式语言中使用的SQL称为嵌入式SQL.目的是Pro*C/C++将使 C/C++成为访问资料库的工具.在ORACLE资料库管理和系统中, 有三种访问资料库的方法;
(1) 用SQL*Plus, 它有SQL命令以互动的应用程式访问资料库;
(2)用第四代语言套用开发工具开发的应用程式访问资料库,这些工具有SQL*Froms,QL*Reportwriter,SQL*Menu等;
(3) 利用在第三代语言内嵌入的SQL语言或ORACLE库函式调用来访问。
Pro*C就属于第三种开发工具之一, 它把过程化语言C和非过程化语言SQL最完善地结合起来,具有完备的过程处理能力,又能完成任何资料库的处理品任务,使用户可以通过编程完成各种类型的报表。
在Pro*C程式中可以嵌入SQL语言,利用这些SQL语言可以完成动态地建立、修改和删除资料库中的表,也可以查询、插入、修改和删除资料库表中的行, 还可以实现事务的提交和回滚。
在Pro*C程式中还可以嵌入PL/SQL块, 以改进应用程式的性能, 特别是在网路环境下,可以减少网路传输和处理的总开销。
3.Pro*C的程式结构图通俗来说,Pro*C程式实际是内嵌有SQL语句或PL/SQL块的C程式, 因此它的组成很类似C程式
环境设定
(1)C编译器
Solaris系统中常用的C语言编译器是GCC,是GNU组织的免费C编译器,一般Linux版本中预设都安装有GCC,UNIX系统中有的并不自带,因此需要手动安装,本文所採用的GCC版本为3.2。
(2)PRO*C预编译器
PRO*C使用预编译技术,预编译器将源程式中的SQL语句转换为标準的Oracle库函式调用,从而生成C源程式,再经C编译器编译、连结后生成执行档。这个预编译器是Oracle自带的。
(3)C语言头档案和函式馆。
Oracle安装程式将这些档案安装在$ORACLE_HOME/precomp目录下。
Solaris系统中常用的C语言编译器是GCC,是GNU组织的免费C编译器,一般Linux版本中预设都安装有GCC,UNIX系统中有的并不自带,因此需要手动安装,本文所採用的GCC版本为3.2。
(2)PRO*C预编译器
PRO*C使用预编译技术,预编译器将源程式中的SQL语句转换为标準的Oracle库函式调用,从而生成C源程式,再经C编译器编译、连结后生成执行档。这个预编译器是Oracle自带的。
(3)C语言头档案和函式馆。
Oracle安装程式将这些档案安装在$ORACLE_HOME/precomp目录下。
程式开发
(1)说明SQL通讯区
SQL通讯区用来记录执行每一个嵌入SQL语句的状态信息,通过在函式体外使用下列语句实现:
#include <sqlca.h> 或者 EXEC SQL INCLUDE sqlca;
(2)声明宿主变数,即C变数
这些变数是应用程式与Oracle通信的桥樑,应用程式的输入数据通过C变数传递给Oracle,反之,Oracle的输出数据又通过C变数传递给应用程式。举例如下:
EXEC SQL BEGIN DECLARE SECTION;
char szUsername[16];
VARCHAR varPassword[16];
char *szStmt1="CREATE TABLE USERS (USERNAME VARCHAR2(15) NOT NULL,PASSWORD
VARCHAR2(15) NOT NULL)";
char *szStmt2= "SELECT PASSWORD FROM USERS WHERE USERNAME='chen'";
EXEC SQL END DECLARE SECTION;
值得注意的是:在SQL语句中使用C变数时,前面需加冒号,例如上面的变数应表示为:szUsername。其中,VARCHAR为C扩展数据类型,预编译时,PRO*C预编译器将它扩展为一个C结构类型
struct
{
unsigned short len;
unsigned char arr[16];
}varNo;
在SQL语句中使用VARCHAR类型变数时,只需指出结构名称varPassword就可,但在C语句中使用VARCHAR类型变数时,必须具体说明所操作变数的结构元素名称是varPassword.len还是varPassword.arr。另外,如果用VARCHAR类型变数做函式参数的话,只能用指针形式。
(3)连线资料库
EXEC SQL CONNECT :username/password@DBname;
通过sqlca.sqlcode的值来判断连线资料库成是否功。
(4)执行SQL语句(分为静态SQL语句和动态SQL语句)
静态SQL语句是在开发应用程式时就已经明确了的资料库操作,如:
EXEC SQL SELECT password INTO :szPassword FROM USERS WHERE username=:szUsername;
动态SQL语句是在运行时由外部数据提供的,不能直接在C程式中嵌入SQL 语句,但可以调用放在一个字元串变数里的SQL语句,最简单的方法是:EXEC SQL EXECUTE IMMEDIATE :szStmt1;但这样执行的SQL语句不能实现查询,实现查询可用下列方法:
EXEC SQL PREPARE select_stmt FROM :szStmt2;
EXEC SQL EXECUTE select_stmt INTO :szPassword;
如果不再需要已準备好的语句,应释放:EXEC SQL DEALLOCATE PREPARE select_stmt;
(5)提交或回滚所做的资料库处理,并退出资料库
回滚:EXEC SQL ROLLBACK WORK RELEASE;
提交:EXEC SQL COMMIT WORK RELEASE;
注意语句中的RELEASE选项,它要求关闭所有打开的游标,之后断开与资料库伺服器的连线。
SQL通讯区用来记录执行每一个嵌入SQL语句的状态信息,通过在函式体外使用下列语句实现:
#include <sqlca.h> 或者 EXEC SQL INCLUDE sqlca;
(2)声明宿主变数,即C变数
这些变数是应用程式与Oracle通信的桥樑,应用程式的输入数据通过C变数传递给Oracle,反之,Oracle的输出数据又通过C变数传递给应用程式。举例如下:
EXEC SQL BEGIN DECLARE SECTION;
char szUsername[16];
VARCHAR varPassword[16];
char *szStmt1="CREATE TABLE USERS (USERNAME VARCHAR2(15) NOT NULL,PASSWORD
VARCHAR2(15) NOT NULL)";
char *szStmt2= "SELECT PASSWORD FROM USERS WHERE USERNAME='chen'";
EXEC SQL END DECLARE SECTION;
值得注意的是:在SQL语句中使用C变数时,前面需加冒号,例如上面的变数应表示为:szUsername。其中,VARCHAR为C扩展数据类型,预编译时,PRO*C预编译器将它扩展为一个C结构类型
struct
{
unsigned short len;
unsigned char arr[16];
}varNo;
在SQL语句中使用VARCHAR类型变数时,只需指出结构名称varPassword就可,但在C语句中使用VARCHAR类型变数时,必须具体说明所操作变数的结构元素名称是varPassword.len还是varPassword.arr。另外,如果用VARCHAR类型变数做函式参数的话,只能用指针形式。
(3)连线资料库
EXEC SQL CONNECT :username/password@DBname;
通过sqlca.sqlcode的值来判断连线资料库成是否功。
(4)执行SQL语句(分为静态SQL语句和动态SQL语句)
静态SQL语句是在开发应用程式时就已经明确了的资料库操作,如:
EXEC SQL SELECT password INTO :szPassword FROM USERS WHERE username=:szUsername;
动态SQL语句是在运行时由外部数据提供的,不能直接在C程式中嵌入SQL 语句,但可以调用放在一个字元串变数里的SQL语句,最简单的方法是:EXEC SQL EXECUTE IMMEDIATE :szStmt1;但这样执行的SQL语句不能实现查询,实现查询可用下列方法:
EXEC SQL PREPARE select_stmt FROM :szStmt2;
EXEC SQL EXECUTE select_stmt INTO :szPassword;
如果不再需要已準备好的语句,应释放:EXEC SQL DEALLOCATE PREPARE select_stmt;
(5)提交或回滚所做的资料库处理,并退出资料库
回滚:EXEC SQL ROLLBACK WORK RELEASE;
提交:EXEC SQL COMMIT WORK RELEASE;
注意语句中的RELEASE选项,它要求关闭所有打开的游标,之后断开与资料库伺服器的连线。
档案生成
在Solaris平台下可通过命令方式对PRO*C源程式进行预编译,下列命令只列出了最常用的预编译选项:
#proc iname=example.c INCLUDE=path CODE=ANSI_C MODE=ANSI CPP_SUFFIX=cc SQLCHECK=SEMANTICS USERID=username/password@DBname
预编译后的example .cc档案就可以当作普通的C源档案来进行处理了。
#gcc -o exampled –I. -I/oracle/product/8.1.7/precomp/public example .cc
最终生成的exampled档案就是我们的执行档。
#proc iname=example.c INCLUDE=path CODE=ANSI_C MODE=ANSI CPP_SUFFIX=cc SQLCHECK=SEMANTICS USERID=username/password@DBname
预编译后的example .cc档案就可以当作普通的C源档案来进行处理了。
#gcc -o exampled –I. -I/oracle/product/8.1.7/precomp/public example .cc
最终生成的exampled档案就是我们的执行档。