专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »数据库 » vistabootpro使用:Pro*C的使用 »正文

vistabootpro使用:Pro*C的使用

来源: 发布时间:星期日, 2009年2月22日 浏览:1次 评论:0
="t18"> Pro*C 概述:
1.什么是Pro*C
在Oracle数据库治理和系统中 有 3种访问数据库思路方法;
(1) 用SQL*Plus 它有SQL命令以交互应用访问数据库;
(2)用第 4代语言应用开发工具开发应用访问数据库这些工具有SQL*FromsQL*Reportwriter,SQL*Menu等;
(3) 利用在第 3代语言内嵌入SQL语言或ORACLE库来访问
Pro*C就属于第 3种开发工具的 它把过程化语言C和非过程化语言SQL最完善地结合起来
具有完备过程处理能力又能完成任何数据库处理品任务使用户可以通过编程完成各种类型报表在Pro*C中可以嵌入SQL语言
利用这些SQL语言可以完成动态地建立、修改和删除数据库中也可以查询、插入、修改和删除数据库表中 还可以实现事务提交和回滚
在Pro*C中还可以嵌入PL/SQL块 以改进应用性能 非凡是在网络环境下可以减少网络传输和处理总开销

2.Pro*C结构图
通俗来说Pro*C实际是内嵌有SQL语句或PL/SQL块C 因此它组成很类似C它内嵌有SQL语句或PL/SQL块
所以它还含有和的区别成份为了让大家对Pro*C有个感性熟悉 特将 2者差别比较如下:
C全程变量介绍说明
C源 1:同K
2:同K



C局部变量介绍说明
K
可执行语句

应用首部 C外部变量介绍说明
外部介绍说明段(ORACLE变量介绍说明)
通讯区介绍说明

Pro*C源 1:同K
2:同K
C局部变量介绍说明
体 内部介绍说明部分 内部介绍说明段
通讯区介绍说明
K C可执行语句
可执行语句 SQL可执行语句

或PL/SQL块

2.Pro*C组成结构

个Pro*C都包括两部分:(1)应用首部;(2)应用
应用首部定义了ORACLE数据库有关变量
为在C语言中操纵ORACLE数据库做好了预备应用体基本上由Pro*CSQL语句组成主要指查询SELECT、INSERT、UPDATE、DELETE等语句
应用组成结构如图所示:
应用首部
描述部分


SQL通信区

应用
EXEC SQL BEGIN DECLARE SECTION
(SQL变量定义)
EXEC SQL END DECLARE SECTION;
EXEC SQL INCLUDE SQLLA;
EXEC SQL CONNECT:< 用户名>
IDENTIFIED BY: < 口令 >
SQL 语句及游标使用


1. 应用首部
应用首部就是Pro*C开始部分它包括以下 3部分:
l C变量描述部分;
l SQL变量描述部分(DECLARE部分);
l SQL通信区

(1) .DECLARE部分(描述部分)
描述部分介绍说明SQL变量 定义部分以EXEC SQL BEGIN DECLARE SECTION ;开始和以 EXEC SQL END DECLARE
SECTION ;结束它可以出现在主部也可出现在局部
l SQL变量介绍说明和使用
在介绍说明段能为SQL变量指定数据类型如表所示:
数据类型描述
CHAR
CHAR(n)
INT
SHORT
LONG
FLOAT
DOUBLE
VARCHAR单
n个
整数
短整数
单精度浮点数
双精度浮点数
变长

这些数据类型实际上就是C语言数据类型 其中VARCHAR中视为C数据类型扩充这在以后会谈到
SQL变量使用应注重以下几点:
l 必须在描述部分明确定义
l 必须使用和其定义相同大小写格式
l 在SQL语句中使用时必须在其的前加个“:”(冒号)但在C语句中引用时不需加冒号
l 不能是SQL命令中保留字
l 可以带指示变量
例如:EXEC SQL BEGIN DECLARE SECTIONS;
VARCHAR programe[30];
Int porgsal, pempno;
EXEC SQL END DECLARE SECTION;


EXEC SQL SELECT ENAME , SAL
INTO: programe, : progsal
FROM EMP
WHERE EMPNO = : pempno;


(2). 指示器变量介绍说明和引用
指示变量实际上也是类SQL变量,它被用来治理和其相关联宿主变量(即在SQL语句中充
当输入或输出变量)个宿主变量都可定义个指示器变量主要用于处理空值(NULL)
指示器变量介绍说明基本同般SQL变量 但必须定义成2字节整型如SHORT、INT
在SQL语句中引用时
其前也应加“:”(冒号)而且必须附在其相关联宿主变量的后在C语句中可独立使用当指示器变量为-1时表示空值例如:
EXEC SQL BEGIN DECLARE SECTION ;
INT dept- number;
SHORT ind – num;
CHAR emp –name;
EXEC SQL END DECLARE SECTION ;



Scanf(“90d %s”, & dept- number , dept – name );
If (dept – number 0)
Ind – num = -1;
Else
Ind – num = 0;
EXEC SQL INSERT INTO DEPT (DEPTNO, DNAME)
VALUES(:dept – number : ind- num , :dept – name);
其中ind – num是dept – number 指示器变量当输入dept – number 值是0时 则向DEPT 表DEPTNO列插入空值
(3).指针SQL变量介绍说明和使用
指针SQL变量在引用前也必须在DECLARE
部分先介绍说明其介绍说明格式同C语言在SQL语句中引用时指针名字前要加前缀“:”(冒号)而不加“*”(星号)在C语句中使用方法如同C语言指针变量
(4).SQL变更介绍说明和引用
在SQL语句中引用只需写名(名字前加冒号) 不需写下标在C语句中使用方法如同C语言变量
使用可大大降低网络传输开销如要向表插入100行数据假如没有就要重复100次 而引用后只须执行次insert语句、便可次性插入例如:
EXEC SQL BEGIN DECLARE SECTION;
Int emp_number[100];
Char emp_name[100][15];
Float salary[100],commission[100];
Int dept_number;
EXEC SQL END DECLARE SECTION;
….
EXEC SQL SELECT EMPNO,ENAME,SAL,COMM
INTO :emp_number,:emp_name,:salary,:commission
FROM EMP
WHERE DEPTNO=:dept_number;
在使用应注重以下几点;
l 不支持指针
l 只支持 而 emp-name [100][15]视为
l 最大维数为32767
l 在条SQL语句中引用多个这些维数应相同
l 在VALUES , SET, INTO 或WHERE子名中 不答应把简单SQL变量和SQL变量混用
l 不能在DELARE部分
例如:下面引用是非法
EXEC SQL BEGIN DECLARE SECTION;
Int dept – num [3] = {10,20,30};
EXEC SQL END DECLARE SECTION ;

EXEC SQL SELECT EMPNO, ENAME , SAL
INTO : emp – num [ i ], : emp – name [ i ], : salarg [ i ]
FROM EMP
(5) 伪类型VARCHAR介绍说明和引用
VARCHAR变量在引用的前也必须在介绍说明段介绍说明 介绍说明时必须指出串最大
长度如:
EXEC SQL BEGIN DECLARE SECTION;
Int book – number;
VARCHAR book – name [ 50 ];
EXEC SQL END DECLARE SECTION ;
在预编绎时 book – name 被翻译成C语言中个结构变量;
StrUCt { unsigned len ;
Unsigned chart arr [ 20 ] ;
} boo – name
由此看出 VARCHAR变量实际上是含长度成员和成员结构变量在SQL语句中引用时应引用以冒号为前缀结构名 而不加下标在C语句 中引用结构成员
VARCHAR变量在作输出变量时由ORACLE自动设置 在作为输入变量时应先把串存入成员中
其长度存入长度成员中然后再在SQL语句中引用例如:
Main( )
{ .......
scanf(“90s, 90d’, book – name .arr, & book – number );
book – name .len = strlen (book – name .arr);
EXEC SQL UPDATE BOOK
SET BNAME = : book – name ;
BDESC = : book – number ;
}
(6) SQL通信区
SQL 通信区是用下列语句描述:
EXEC SQL INCLUDE SQLCA;
此部分提供了用户运行成败记录和处理

SQLCA组成
SQLCA是个结构类型变量它是ORACLE 和应用个接口在执行 Pro*C ORACLE
把每个嵌入SQL语句执行状态信息存入SQLCA中 根据这些信息可判定SQL语句执行是否成功处理行数信息等其组成如表所示:
Struct sqlca
{ char sqlcaid [ 8 ] ; ----à标识通讯区
long sqlabc; ---à 通讯区长度
long sqlcode; ---à保留最近执行SQL语句状态码
struct { unsigned sqlerrml; -----à信息文本长度
}sqlerrm;
char sqlerrp [ 8 ];
long sqlerrd [ 6 ];
char sqlwarn [ 8 ];
char sqlext [ 8 ];
}
struct sqlca sqlca;
其中 sqlcode在中最常用到它保留了最近执行SQL语句状态码
员根据这些状态码做出相应处理这些状态码值如下:
0: 表示该SQL语句被正确执行没有发生和例外
>0:ORACLE执行了该语句但碰到个例外(如没找到任何数据)
<0:表示由于数据库、系统、网络或应用ORACLE未执行该SQL语句
当出现此类当前事务般应回滚

2.应用
在Pro*C 能把SQL语句和C语句自由地混合书写并能在SQL语句中使用SQL变量嵌入式SQL语句书写文法是:
l 以要害字EXEC SQL开始
l 以C语言语句终结符(分号)终结
SQL语句作用主要用于同数据库打交道C语言用于控制输入输出和数据处理等
(1) 连接到ORACLE数据库
在对数据库存取的前必须先把和ORACLE数据库连接起来即登录到ORACLE上所连接命令应该是应用个可执行命令连接命令格式如下:
EXEC SQL CONNECT:< 用户名 > IDENTIFIED BY : < 口令 >
或EXEC SQL CONNECT: < 用户名 > / < 口令 >
在使用上述两种格式进行登入时 应当首先在介绍说明段定义包含用户名和口令
SQL 变量并在执行CONNECT的前设置它们否则会造成登录失败例如:
EXEC SQL BEGIN DECLARE SECTION ;
VARCHAR usename [20];
VARCHAR passWord[20];
EXEC SQL END DECLARE
..........
strcpy ( usename.arr, “CSOTT’);
usename.len = strlen (username.arr);
strcpy (password.arr , “TIGER’);
password .len = strlen( password .arr);
EXEC SQL WHENEVER SQLERROR GOTO SQLERR;
EXEC SQL CONNECT :username INDNTIFIED BY : password;
注重: 不能把用户名和口令直接编写到CONNECT语句中或者把用引号(’)括起来字母串在CONNECT 语句中 如下面语句是无效
EXEC SQL CONNECT SCOTT INENTIFIED BY TIGER;
EXEC SQL CONNECT ‘SCOTT’ IDENTIFIED BY ‘TIGER’;
(2). 插入、更新和删除
在讲述SQL语言时已具体讲过 这里就不举例介绍说明了
(3). 数据库查询及游标使用
在PRO*C中, 查询可分为两种类型:
l 返回单行或定行数查询;
l 返回多行查询.此种查询要求使用游标来控制每行或每组(主变量用).
1) 返回单行或定行数查询
在PRO*C中查询SQL SELECT语句由以下几个子句组成:
SELECT
INTO
FROM
WHERE
CONNECT BY
UNION
INTERSECT
MINUS
GROUP BY
HAVING
ORDER BY
其中WHERE子句中查询条件可以是个属性或多个属性集合,在执行是赋值主变量也可放在WHERE子句中.WHERE子句中所用主变量称为输入主变量如:
SELECT EMPNO, JOB, SAL
INTO:PNAME, :PJOB, :PSAL
FROM EMP
WHERE EMPNO=:PEMPNO;
若没有找到限定行, 则SQLCA.SQLCODE返回”+1403”, 表明”没有找到”
INTO从句中主变量叫输出主变量它提供了查询时所需要信息
在任何项送给主变量的前都要求ORACLE把这些项转换成主变量数据类型对于数字是通过截断来完成(如:9.23转换为9)
假如已确定查询只返回那么就不必使用游标只给SELECT语句增加个INTO子句即可在语义上INTO语句在FROM的前查询中有多少个选择项就有多少个输出主变量若在SELECT项中表达式数目不等于INTO子句中主变量数目就把SQLCA.SQLWARN[3]置为”W”

2)多行查询及游标使用
假如查询返回多行或不知道返回多少行使用带有ORACLE游标(CURSOR)SELECT语句
游标是ORACLE和PRO*C存放查询结果工作区域个游标(已命名)和条SELECT语句相关联操作游标有由4条命令:(1)DECLARE
CURSOR;(2)OPEN CURSOR;(3)FETCH;(4)CLOSE CURSOR

A. 定义游标
个游标必须首先定义 才能使用它语法为:
EXEC SQL DECLARE 〈游标名〉CORSOR FOR
SELECT 〈列〉
FROM 〈表〉
例如:
EXEC SQL DECLARE CSOR CURSOR FOR
SELECT ENAME JOB SAL
FROM EMP
WHERE DEPTNO=:DEPTNO;
当赋给个和查询相关联游标CURSOR的后 当SELECT查询EMP时可从数据库中返回多行这些行就是CURSOR个活动区域
注重:
1) 定义游标必须在对游标操作的前完成;
2) PRO*C不能引用没有定义游标;
3) 游标定义后其作用范围是整个所以对来讲 同时定义两个相同游标是

B. 打开游标
打开游标OPEN语句主要用来输入主变量内容这些主要是WHERE中使用主变量打开游标语句是:EXEC SQL OPEN 〈游标名〉
当打开游标后可以从相关查询中取出多于结果
所有满足查询标准行组成集合叫做“游标活动集”通过取操作活动集中行或每组是个返回查询完成后
游标就可关闭了如图所示:
定义游标:DECLARE

开始查询:SELECT
打开游标:OPEN


从活动集取数据:FETCH

查询完成


关闭游标:CLOSE


注重:1)游标处于活动集行前面;
2)若改变了输入主变量就必须重新打开游标

C. 取数据
从活动集中取出行或组把结果送到输出主变量中过程叫取数据输出主变量定义在取数据语句中取数据语句如下:
EXEC SQL FETCH〈游标名〉INTO:主变量1主变量2……
FETCH工作过程如图所示:

查询结果
游标
FETCH
查询结果
在游标打开后
输出至当前

……


如图所示查询结果指满足查询条件查询结果使用FETCH应注重以下几点:
l 游标必须先定义再打开
l 只有在游标打开的后才能取数据即执行FETCH语句
l
FETCH语句每执行从当前行或当前组取数据行或下组向上移游标每次所指行或组都为当前行或当前组而FETCH每次都是取游标所指定行或组数据
l 当游标活动集空的后ORCLE返回个SQLCASQLCA(=1403)
l 若希望此游标再操作 必须先关闭再打开它
l 在C中可以开辟个内存空间来存放操作结果这样就能利用开辟空间来灵活操纵查询结果

D.关闭游标
取完活动集中所有行后必须关闭游标以释放和该游标有关资源
关闭游标格式为:
EXEC SQL CLOSE 游标名;
例如:
EXEC SQL CLOSE C1;
ORACLE V5.0版支持SQL格式“CURRENT OF CURSOR”这条语句将指向个游标中最新取出
以用于修改和删除操作该语句必须有取操作的后使用它等同存储个ROWID并使用它

(4).举例
EXEC SQL DECLARE SALESPEOPLE CURSOR FOR
SELECT SSNO NAME SALARY
FROM EMPLOYEE
WHERE DNAME=‘Sales’;
EXEC SQL OPEN SALESPEOPLE;
EXEC SQL FETCH SALESPEOPLE
INTO :SS:NAME:SAL;
EXEC SQL CLOSE SALESPEOPLE;

(5)SQL嵌套思路方法及应用
嵌入SQL和交互式SQL在形式上有如下差别:
1) 在SQL语句前增加前缀“EXEC SQL”小小差别其目是在于预编译时轻易识别出来
以便把每条SQL作为条高级语言来处理
2) 每SQL语句分为介绍说明性语句和可执行语句两大类可执行语句又分为数据定义、数据控制、数据操纵、数据检索 4大类
可执行性SQL语句写在高级语言可执行处;介绍说明性SQL语句写在高级语言介绍说明性地方
例如:在PRO*C中建立个名为BOOK表结构过程如下:
#〈stdio.h〉
EXEC SQL BEGIN DECLARE SECTION;
VARCHAR uid[20] pwd[20];
EXEC SQL END DECLARE SECTION;
EXEC SQL INCLUDE SQLCA;
Main()
{
/*login database*/
strcpy(uid.arr,’wu’);
uid.len=strlen(uid,arr);
strcpy(pwd.arr,’wu’);
pwd.len=strlen(pwd.arr);
EXEC SQL CONNECT:uid IDENTIFEED BY:pwd;
EXEC SQL CREATE TABLE book
( acqnum number, copies number , price number);
EXEC SQL COMMIT WORK RELEASE;
EXIT;
PRO*C可非常简便灵活地访问ORCLE数据库中数据同时又具有C语言高速特点因而可完成些ORACLE产品不能完成任务例如以下个固定非凡格式输出结果
SQL嵌套源举例
#unclude
typedef char asciz[20];
EXEC SQL BEGIN DECLARE SECTION;
EXEC SQL TYPE asciz IS STRING (20) REFERENCE;
asciz username;
asciz password;
asciz emp_name(5);
emp_number(5a);
float salary[5];
EXEC SQL END DECLARE SECTION;
EXEC SQL INCLUDE sqlca;
Void pr_rows;
Void sqlerror;
Main
{
num_ret;
strcpy(username,”SCOTT’);
strcpy(password, “TYGER”);
EXEC SQL WHENEVER SQLERROR DO sqlerror;
EXEC SQL CONNECT:username IDENTIFIED BY:password;
Pr (“\nConnected to ORACLE as user:%s\n”, username);
EXEC SQL DECLARE c1 CURSOR FOR
SELECT EMPNO , ENAME , SAL FROM EMP;
EXEC SQL OPEN c1;
Num_ret = 0;
For(;;)
{
EXEC SQL WHENEVER NOT FOUND DO ;
EXEC SQL FETCH c1 INTO : emp_number , :emp_name , :salary;
Pr_rows (sqlca.sqlerrd[2] – num_ret);
Num_ret=sqlca.sqlerrd[2];
}
((sqlca.sqlerrd[2] – num_ret)>0);
pr _rows(sqlca.sqlerrd[2] –num_ret);
EXEC SQL CLOSE c1;
Prf(“\Have a good day.\n”);
EXEC SQL COMMIT WORK RELEASE;
}

void pr_rows(n);
n;
{
i;
prf(“\nNumber Employee Salary\n”);
prf(“------------------------------\n”);
for (i=0;i> prf(“% - 9d%- 8s%9.2f\n”,emp-number[i], emp---name[i],salary[i];
}
void sqlerror
{
EXEC SQL WHENEVER SQLERROR CONTINUE;
Prf(“\noracle error detected:\n”);
Prf(‘\n%.70s\n”, sqlca.sqlerrm.sqlerrmc);
EXEC SQL ROLLBACK WORK RELEASE;
Exit(1);
}


(6) 检测和恢复
在使用SQL语句和PRO*C对数据库进行操作时经常有字段空值无条件删除无行返回数据溢出和截断等现象发生这种现象可以用SQLCA和指示器变量来检测


1 SQLCA结构
在PRO*C中SQLCA结构如下:
STRUCT SQLCA{
Char sqlcaid[8];
Long sqlabc;
Long sqlcode;
STRUCT{
Unsigned sqlerrm1;
Char sqlerrmc[10];
}sqlerrm;
Char sqlerrp[8];
Long sqlerrd[6];
Char sqlwarn[8];
Char sqlext[8];
}
其中:
1) SQLCA.sqlerrm.sqlerrmc:带有SQLCASQLCODE正文
2) SQLCA.sqlerrd:当前ORACLE状态只有SQLCA.SQLERRD[2]有意义表示DML语句处理行数
3) SQLCA.sqlwarn:提供可能碰到条件信息

在每执行个SQL语句后ORACLE就把返回结果放入SQLCA中但介绍说明语句除外
用SQLCA可以查看SQL语句执行结果往往有 3种结果:
=0:执行成功;
SQLCA.SQLCODE= >0:执行成功状态值;
<0:失败不答应继续执行

2 指示器变量
指示器变量有时也称指示变量.指示变量和个主变量相关联,指出主变量返回情况.
=0:返回值不为空, 未被截断,值放在主变量中;
返回值= >0:返回值为空, 忽略主变量值;
<0:主变量长度不够就被截断
使用指示变量要注重:
l 在WHERE子句中不能用指示变量用NULL属性来测试空值
例如下列子句:
SELECT…
FROM…
WHERE ENAME IS NULL;
是正确
WHERE ENAME=:PEME:PEME1

l 指示变量在插入空值的前为—1
l 可输出空值

3 WHENEVER语句
WHENEVER是介绍说明语句不返回SQLCODE 只是根据SQLCA中返回码指定相关措施格式为
EXEC SQL WHENEVER [SQLERRORSQLWARNINGNOTFORUND]
[STOPCONTINUEGOTO<标号>];
其中
(1)[STOPCONTINUEGOT<标号>]缺省值为CONTINUE
(2)SQLERROR:SQLCA.SQLCODE<0;
(3)SQLWARNIGN:SQLCA.SQLWARN[0]=“W”;
(4)NOTFOUND:SQLCA.SQLCODE=1403;
下面给出来介绍说明WHENEVER使用方法:
EXEC SQL BEGIN DEELARE SECTION;
VARCHAR UID[20];
VARCHAR PASW[20];
……
EXEC SQL END DECLARE SECTION;
EXEC SQL INCLUDE SQLCA;
Main()
{
……
EXEC SQL WHENEVER SQLERROR GOTO ERR;
EXEC SQL CONNECT:UID/:PWD;
……
EXEC SQL DECLARE CSOR1 CURSOR FOR
SELECT 〈字段〉
FORM〈表〉
EXEC SQL OPEN CSOR1;
SQL
……
EXEC SQL WHENEVER NOT FOUND GOTO good;
For(;;)
EXEC SQL FETCH CSOR INTO……
Good:
……
prf(“\n查询结束\n”);
EXEC SQL CLOSE C1;
EXEC SQL WHENEVER SQLERROR CONTINUE.
EXEC SQL COMMIT WORK RELEASE:
Exit;
Prf(“\n%70sn”, sqlca.sqlerrm.sqlerrmc);
EXEC SQL ROLLBACK WORK RELEASE:
Exit(1);
}

(7) 动态定义语句
SQL语句分动态定义语句和静态定义语句两种:
(1) 静态定义语句:SQL语句事先编入PRO*C中在经过预编译器编译的后形成目标*BOJ然后执行目标预即可
(2) 动态定义语句:有些语句不能事先嵌入到PRO*C要根据运行情况用户自己从输入设备上(如终端上)实时输入即将执行SQL语句
动态定义语句有:
l EXECUTE IMMEDIATE;
l PREPARE 和EXECUTE;
l PREPARE和FETCH 和 OPEN ;
l BIND和DEFINE DESCRIPTOR

1. EXECUTE IMMEDIATE语句
此语句表示立即执行 并且只向SQLCA返回执行结果无其它信息例如:
EXEC SQL BEGIN DECLARE SECTION;
VARCHAR abcd[89];
VARCHAR deay[20];
EXEC SQL END DECLARE SECTION;
/** 输出串到abcd **/
EXEC SQL EXECUTE IMMEDIATE :abcd;
注重:
1) EXECUTE IMMEDIATE只能运行带个参数动态语句其中abcd是参数不是要害字
2) EXECUTE IMMEDIATE使用先决条件是:SQL语句不能包含主变量;SQL语句不能是查询语句
3) 可用任何主变量作为EXECUTE IMMEDIATE参数;也可用串作为主变量

2. PREPARE和EXECUTE语句
此语句表示“预编译/执行”
此语句能够预编译次而执行多次语法为:
EXEC SQL PREPARE 〈语句名〉FROM:主变量;
EXEC SQL EXECUTE〈语句名〉[USING:替换主变量];
PREPARE语句做两件事:
(1) 预编译SQL语句;
(2) 给出SQL语句语句名
注重:
l SQL语句不能是查询语句;
l PREPARE和EXECUTE可包含主变量;
l PREPARE不能多次执行
例如:
# USERNAME “SCOTT”
# PASSWORD “TIGER”
#
EXEC SQL INCLUDE sqlca;
EXEC SQL BEGIN DECLARE SECTION;
Char * username=USERNAME;
Char * password=PASSWORD;
VARCHAR sqlstmt[80];
Int emp_number;
VARCHAR emp_name[15];
VARCHAR job[50];
EXEC SQL END DECLARE SECTION;
Main
{
EXEC SQL WHENEVER SQLERROR GOTO :sqlerror;
EXEC SQL CONNECT :username IDENTIFIED BY :password;
Sqlstmt.len=sprf(sqlstmt.arr,”INSERT INTO EMP (EMPNO,ENAME,JOB,SAL)
VALUES(:V1,:V2,:V3,:V4)”);
Puts(sqlstmt.arr);
EXEC SQL PREPARE S FROM :sqlstmt;
For(;;)
{
prf(“\nenter employee number:”);
scanf(“%d”,&emp_number);
(emp_number0) ;
prf(“\nenter employee name:”);
scanf(“%s”,&emp_name.arr);
emp_name.len=strlen(emp_name.arr);
prf(“\nenter employee job:”);
scanf(“%s”,job.arr);
job.len=strlen(job.arr);
prf(“\nenter employee salary:”);
scanf(“%f”,&salary);
}
EXEC SQL EXECUTE S USING :emp_number,:emp_name,:job,:salary;
}


3. FETCH语句和OPEN语句
FETCH语句和OPEN语句这组动态语句是对游标进行操作其执行过程如下:


PREPARE〈语句名〉FROM 〈主变量串〉;


DECLARE〈游标名〉FOR〈语句名〉;



OPEN 〈游标名〉[USING:替换变量1[:替换变量变…]]


FETCH〈游标名〉INTO: 主变量1[:主变量2…]



CLOSE〈游标名〉


注重:
l SQL语句答应使用查询语句;
l SELECT子句中列名不能动态改变只能预置;
l WHERE和ORDER BY 子句可以动态改变条件

、 Pro*C编译和运行

1.
先用ORACLE预编译器PROC对PRO*C进行预处理该编译器将源中嵌入SQL语言翻译成C语言产生个C语言编译器能直接编译文件生成文件扩展名为
.C
2. 用C语言编译器CC 对扩展名为 .c文件编译,产生目标码文件,其扩展名为 .o
3. 使用MAKE命令,连接目标码文件,生成可运行文件
例如: 对上面example.pc进行编译运行
PROC iname=example.pc
CC example.c
MAKE EXE=example OBJS=”example.o”
example

0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: