目 录
Pro*C&C++
Pro*c简单实例
Unix下Pro*c编译命令
什么是Pro*C&C++
Pro*c中使用plsql获取多条记录
Pro*C能支持什么
--------------------------------------------------------------------------------
Pro*C&C++
[目录]
--------------------------------------------------------------------------------
Pro*c简单实例
/*
* filename:model.pc
* author:alamo
* inc:sinosoft
* create time:2001.3.24
* update time:
* desc:it is a model file for write pro*c programe for oracle+tuxedo
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sqlda.h>
#include <sqlcpr.h>
#include <atmi.h>
#include <fml.h>
#include <userlog.h>
/* set pro*c operation */
exec sql include sqlca;
exec sql include oraca;
exec oracle option (oraca=yes);
/* Define constants for VARCHAR lengths. */
#define UNAME_LEN 20
#define PWD_LEN 40
/* Declare variables. No declare section is
needed if MODE=ORACLE. */
VARCHAR username[UNAME_LEN]; /* VARCHAR is an Oracle-supplied struct */
varchar password[PWD_LEN]; /* varchar can be in lower case also. */
/* Declare error handling function. */
void sql_error(msg)
char *msg;
{
char err_msg[128];
size_t buf_len, msg_len;
EXEC SQL WHENEVER SQLERROR CONTINUE;
printf("\n%s\n", msg);
buf_len = sizeof (err_msg);
sqlglm(err_msg, &buf_len, &msg_len);
printf("%.*s\n", msg_len, err_msg);
EXEC SQL ROLLBACK RELEASE;
exit(EXIT_FAILURE);
}
void main()
{
/* Connect to ORACLE--
* Copy the username into the VARCHAR.
*/
strncpy((char *) username.arr, "sgac_dec", UNAME_LEN);
/* Set the length component of the VARCHAR. */
username.len =
(unsigned short) strlen((char *) username.arr);
/* Copy the password. */
strncpy((char *) password.arr, "dbwork", PWD_LEN);
password.len =
(unsigned short) strlen((char *) password.arr);
/* Register sql_error() as the error handler. */
EXEC SQL WHENEVER SQLERROR DO sql_error("ORACLE error--\n");
/* Connect to ORACLE. Program will call sql_error()
* if an error occurs when connecting to the default database.
*/
EXEC SQL CONNECT :username IDENTIFIED BY :password;
printf("\nConnected to ORACLE as user: %s\n", username.arr);
/* Disconnect from ORACLE. */
EXEC SQL ROLLBACK WORK RELEASE;
exit(EXIT_SUCCESS);
}
[目录]
--------------------------------------------------------------------------------
Unix下Pro*c编译命令
#编译pc文件为c文件
proc include= filename.pc
#编译c文件,生成目标文件
cc -I$ORACLE_HOME/precomp/public -c filename.o filename.c
#连接目标文件,生成可执行程序
cc -L$ORACLE_HOME/lib -lclntsh -o filename filename.o
example
#使用pl/sql块时必须设置sqlcheck
rm model_exe.c
proc include=${TUXDIR}/include model_exe.pc SQLCHECK=FULL userid=scott/tiger
rm model_exe.o
cc -I$ORACLE_HOME/precomp/public -I$TUXDIR/include -c model_exe.o model_exe.c
rm model_exe
cc -L$ORACLE_HOME/lib -lclntsh -o model_exe model_exe.o
[目录]
--------------------------------------------------------------------------------
什么是Pro*C&C++
Pro*C/C++预编译将嵌入在你的C和C++程序中的SQL语句转换成标准的C代码。预编译这些代码后,C和C++程序你可以编译和使用去构造应用和访问ORACLE数据库。
去访问ORACLE数据库,你使用高级查询语言即SQL语言。Pro*C/C++是预编译器转换C语句中的EXEC SQL命令。
ORACLE公司针对ORACLE数据库开发的一种SQL嵌入式开发语言。
在C代码中嵌入SQL语言,C代码用宿主变量与SQL进行交换数据。
预编译后生成标准C代码。
[目录]
--------------------------------------------------------------------------------
Pro*c中使用plsql获取多条记录
valueStr VARCHAR; // 接收查询结果的字符串,注意长度不能小于返回的结果字符的长度
EXEC SQL EXECUTE
DECLARE
resultStr VARCHAR2(行长度*可能的最大行数) := ''; // 行长度要>=各字段长度之和
BEGIN
FOR cur1 IN(sql语句) LOOP // SQL语句中列的写法为 c1||'||'||c2... rowStr
resultStr := resultStr||cur1.rowStr||'!!';
END LOOP;
if(length(resultStr) > 0) then -- 如果为空,出现PROC异常
:valueStr := resultStr;
end if;
END;
END-EXEC;
例子:
var x varchar2(4000);
DECLARE
resultStr varchar2(4000);
begin
for cur1 in(select deptno||dname||loc rowStr from dept) loop
resultStr := resultStr||cur1.rowStr||'!!';
end loop;
:x := resultStr;
end;
/
[目录]
--------------------------------------------------------------------------------
Pro*C能支持什么
1.远程(通过NET8)或者本地访问ORACLE8服务器,版本8.0。
2.可嵌入PL/SQL块。
3.捆绑式数据库调用,在C/S环境下能够达到最好的性能。
4.完全参照ANSI标准的SQL程序。
5.PL/SQL过程中PL/SQL8.0版。
6.多层应用。
7.ANSI标准C。
8.支持Microsoft Visual C++ 5.0版32位应用。
9.支持Borland C++ 5.0版32位应用。