`
linkyou66
  • 浏览: 228406 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

Pro*C 程序概述和结构说明

 
阅读更多
<p>一 Pro*C 程序概述:<br>1.什么是Pro*C程序<br>在<a href="http://writeblog.csdn.net/tag/910/index.html" target="_blank">ORACLE数据库</a>管理和系统中, 有三种访问数据库的方法;<br>(1) 用SQL*Plus, 它有SQL命令以交互的应用程序访问数据库;<br>(2) 用第四代语言应用开发工具开发的应用程序访问数据库,这些工具有SQL*Froms,QL*Reportwriter,SQL*Menu等;<br>(3) 利用在第三代语言内嵌入的SQL语言或ORACLE库函数调用来访问。<br>Pro*C就属于第三种开发工具之一, 它把过程化语言C和非过程化语言SQL最完善地结合起来, 具有完备的过程<a href="http://writeblog.csdn.net/tag/3033/index.html" target="_blank">处理能力</a>,又能完成任何数据库的处理品任务,使<a href="http://writeblog.csdn.net/tag/4100/index.html" target="_blank">用户可以</a>通过编程完成各种类型的报表。在Pro*C程序中可以嵌入SQL语言, 利用这些SQL语言可以完成动态地建立、修改和删除数据库中的表,也可以查询、插入、修改和删除数据库表中的行, 还可以实现事务的提交和回滚。<br>在Pro*C程序中还可以嵌入PL/SQL块, 以改进应用程序的性能, 特别是在网络环境下,可以减少<a href="http://writeblog.csdn.net/z/network/wlcs/index.html" target="_blank">网络传输</a>和处理的总开销。 </p>
<p></p>
<p>2.Pro*C的程序结构图<br>通俗来说,Pro*C程序实际是内嵌有SQL语句或PL/SQL块的C程序, 因此它的组成很类似C程序。 但因为它内嵌有SQL语句或PL/SQL块, 所以它还含有与之不同的成份。为了让大家对Pro*C有个感性的认识, 特将二者差别比较如下:<br>C的全程变量说明<br>C源程序 函数1:同函数K。<br>函数2:同函数K。 <br>C的局部变量说明<br>函数K <br>可执行语句</p>
<p>应用程序首部 C的外部变量说明<br>外部说明段(ORACLE变量说明)<br>通讯区说明</p>
<p>Pro*C源程序 函数1:同函数K。<br>函数2:同函数K。<br>C局部变量说明<br>程序体 内部说明部分 内部说明段<br>通讯区说明<br>函数K C的可执行语句 <br>可执行语句 SQL的可执行语句 <br>或PL/SQL块</p>
<p>二.Pro*C程序的组成结构</p>
<p>每一个Pro*C程序都包括两部分:(1)应用程序首部;(2)应用程序体<br>应用程序首部定义了ORACLE数据库的有关变量, 为在<a href="http://writeblog.csdn.net/keywords/c-language.html" target="_blank">C语言</a>中操纵ORACLE数据库做好了准备。应用程序体基本上由Pro*C的SQL语句调用组成。主要指查询SELECT、INSERT、<a href="http://writeblog.csdn.net/tag/2859/index.html" target="_blank">UPDATE</a>、DELETE等语句。<br>应用程序的组成结构如图所示: <br>EXEC SQL BEGIN DECLARE SECTION (SQL变量的定义)EXEC SQL END DECLARE SECTION;<br>EXEC SQL INCLUDE SQLLA;<br>EXEC SQL CONNECT:&lt; 用户名&gt; IDENTIFIED BY: &lt; 口令 &gt;<br>SQL 语句及游标的使用</p>
<p>1. 应用程序首部<br>应用程序的首部就是Pro*C的开始部分。它包括以下三部分:<br>l C变量描述部分;<br>l SQL变量描述部分(DECLARE部分);<br>l SQL通信区。</p>
<p>(1) .DECLARE部分(描述部分)<br>描述部分说明程序的SQL变量, 定义部分以EXEC SQL BEGIN DECLARE SECTION ;开始和以 EXEC SQL END DECLARE SECTION ;结束的。它可以出现在程序的主部,也可出现在局部<br>l SQL变量的说明和使用<br>在说明段能为SQL变量指定的数据类型如表所示:<br>数据类型 描述<br>CHARCHAR(n)INT SHORT LONG FLOAT DOUBLE VARCHAR 单字符n个字符数组整数短整数单精度浮点数双精度浮点数变长字符串<br>这些数据类型实际上就是C语言的数据类型, 其中VARCHAR中视为C数据类型的扩充。这在以后会谈到。<br>SQL变量的使用应注意以下几点:<br>l 必须在描述部分明确定义<br>l 必须使用与其定义相同的大小写格式<br>l 在SQL语句中使用时,必须在其之前加一个“:”(冒号),但在C语句中引用时不需加冒号。<br>l 不能是SQL命令中的保留字。<br>l 可以带指示变量。<br>例如:EXEC SQL BEGIN DECLARE SECTIONS;<br>VARCHAR programe[30];<br>Int porgsal, pempno;<br>EXEC SQL END DECLARE SECTION;</p>
<p><br>EXEC SQL SELECT ENAME , SAL <br>INTO: programe, : progsal <br>FROM EMP <br>WHERE EMPNO = : pempno;</p>
<p>(2). 指示器变量的说明和引用<br>指示变量实际上也是一类SQL变量,它被用来管理与其相关联的宿主变量(即在SQL语句中充 当输入或输出的变量)。每一个宿主变量都可定义一个指示器变量,主要用于处理空值(NULL)<br>指示器变量的说明基本同一般SQL变量一样, 但必须定义成2字节的整型,如SHORT、INT。在SQL语句中引用时, 其前也应加“:”(冒号),而且必须附在其相关联的宿主变量之后,在C语句中,可独立使用。当指示器变量为-1时,表示空值。例如:<br>EXEC SQL BEGIN DECLARE SECTION ; <br>INT dept- number;<br>SHORT ind – num;<br>CHAR emp –name;<br>EXEC SQL END DECLARE SECTION ; </p>
<p>Scanf(“90d %s”, &amp; dept- number , dept – name );<br>If (dept – number ==0)<br>Ind – num = -1;<br>Else <br>Ind – num = 0;<br>EXEC SQL INSERT INTO DEPT (DEPTNO, DNAME)<br>VALUES(:dept – number : ind- num , :dept – name);<br>其中ind – num是dept – number 的指示器变量。当输入的dept – number 值是0时, 则向DEPT 表的DEPTNO列插入空值。<br>(3).指针SQL变量的说明和使用</p>
<p><br>指针SQL变量在引用前也必须在DECLARE 部分先说明。其说明格式同C语言。在SQL语句中引用时,指针名字前要加前缀“:”(冒号)而不加“*”(星号)。在C语句中用法如同C语言的指针变量。<br>(4).数组SQL变更的说明和引用<br>在SQL语句中引用数组时,只需写数组名(名字前加冒号), 不需写下标,在C语句中用法如同C语言的数组变量。<br>使用数组可大大降低网络传输开销。如要向一表插入100行数据,如果没有数组,就要重复100次, 而引用后,只须执行一次insert语句、便可一次性插入。例如:<br>EXEC SQL BEGIN DECLARE SECTION;<br>Int emp_number[100];<br>Char emp_name[100][15];<br>Float salary[100],commission[100];<br>Int dept_number;<br>EXEC SQL END DECLARE SECTION;<br>….<br>EXEC SQL SELECT EMPNO,ENAME,SAL,COMM<br>INTO :emp_number,:emp_name,:salary,:commission<br>FROM EMP<br>WHERE DEPTNO=:dept_number;<br>在使用数组时,应注意以下几点;<br>l 不支持指针数组<br>l 只支持一维数组, 而 emp-name [100][15]视为一维字符串<br>l 数组最大维数为32767<br>l 在一条SQL语句中引用多个数组时,这些数组维数应相同<br>l 在VALUES , SET, INTO 或WHERE子名中, 不允许把简单SQL变量与数组SQL变量混用<br>l 不能在DELARE部分初始化数组<br>例如:下面的引用是非法的<br>EXEC SQL BEGIN DECLARE SECTION;<br>Int dept – num [3] = ;<br>EXEC SQL END DECLARE SECTION ;</p>
<p>EXEC SQL SELECT EMPNO, ENAME , SAL<br>INTO : emp – num [ i ], : emp – name [ i ], : salarg [ i ]<br>FROM EMP <br>(5) 伪类型VARCHAR的说明和引用<br>VARCHAR变量在引用之前也必须在说明段说明, 说明时必须指出串的最大 <br>长度,如:<br>EXEC SQL BEGIN DECLARE SECTION;<br>Int book – number; <br>VARCHAR book – name [ 50 ];<br>EXEC SQL END DECLARE SECTION ; <br>在预编绎时, book – name 被翻译成C语言中的一个结构变量;<br>Struct { unsigned short len ;<br>Unsigned chart arr [ 20 ] ; <br>} boo – name <br>由此看出, VARCHAR变量实际上是含长度成员和数组成员的结构变量。在SQL语句中引用时,应引用以冒号为前缀的结构名, 而不加下标,在C语句 中引用结构成员。<br>VARCHAR变量在作输出变量时,由ORACLE自动设置, 在作为输入变量时,程序应先把字符串存入数组成员中, 其长度存入长度成员中,然后再在SQL语句中引用。例如:<br>Main( )<br>{ .......<br>scanf(“90s, 90d’, book – name .arr, &amp; book – number );<br>book – name .len = strlen (book – name .arr);<br>EXEC SQL UPDATE BOOK <br>SET BNAME = : book – name ;<br>BDESC = : book – number ;<br>} <br>(6) SQL通信区<br>SQL 通信区是用下列语句描述的:<br>EXEC SQL INCLUDE SQLCA;<br>此部分提供了用户运行程序的成败记录和错误处理。</p>
<p>SQLCA的组成<br>SQLCA是一个结构类型的变量,它是ORACLE 和应用程序的一个接口。在执行 Pro*C程序时, ORACLE 把每一个嵌入SQL语句执行的状态信息存入SQLCA中, 根据这些信息,可判断SQL语句的执行是否成功,处理的行数,错误信息等,其组成如表所示:<br>Struct sqlca<br>{ char sqlcaid [ 8 ] ; ----à标识通讯区<br>long sqlabc; ---à 通讯区的长度<br>long sqlcode; ---à保留最近执行的SQL语句的状态码<br>struct { unsigned short sqlerrml; -----à信息文本长度<br>}sqlerrm;<br>char sqlerrp [ 8 ];<br>long sqlerrd [ 6 ];<br>char sqlwarn [ 8 ];<br>char sqlext [ 8 ];<br>}<br>struct sqlca sqlca;<br>其中, sqlcode在程序中最常用到,它保留了最近执行的SQL语句的状态码。程序员根据这些状态码做出相应的处理。这些状态码值如下:<br>0: 表示该SQL语句被正确执行,没有发生错误和例外。<br>&gt;0:ORACLE执行了该语句,但遇到一个例外(如没找到任何数据)。</p>
<p><br>&lt;0:表示由于数据库、系统、网络或应用程序的错误,ORACLE未执行该SQL语句。 <br>当出现此类错误时,当前事务一般应回滚。 <br>2.应用程序体<br>在Pro*C程序中, 能把SQL语句和C语句自由地混合书写,并能在SQL语句中使用SQL变量,嵌入式SQL语句的书写文法是:<br>l 以关键字EXEC SQL开始<br>l 以C语言的语句终结符(分号)终结<br>SQL语句的作用主要用于同数据库打交道。C语言程序用于控制,输入,输出和数据处理等。<br>(1) 连接到ORACLE数据库<br>在对数据库存取之前,必须先把程序与ORACLE数据库连接起来。即登录到ORACLE上。所连接命令应该是应用程序的第一个可执行命令。连接命令格式如下:<br>EXEC SQL CONNECT:&lt; 用户名 &gt; IDENTIFIED BY : &lt; 口令 &gt;<br>或EXEC SQL CONNECT: &lt; 用户名 &gt; / &lt; 口令 &gt;<br>在使用上述两种格式进行登入时, 应当首先在说明段定义包含用户名和口令的 <br>SQL 变量,并在执行CONNECT之前设置它们,否则会造成登录失败。例如:<br>EXEC SQL BEGIN DECLARE SECTION ;<br>VARCHAR usename [20];<br>VARCHAR password[20];<br>EXEC SQL END DECLARE <br>..........<br>strcpy ( usename.arr, “CSOTT’);<br>usename.len = strlen (username.arr);<br>strcpy (password.arr , “TIGER’);<br>password .len = strlen( password .arr);<br>EXEC SQL WHENEVER SQLERROR GOTO SQLERR;<br>EXEC SQL CONNECT :username INDNTIFIED BY : password;<br>注意: 不能把用户名和口令直接编写到CONNECT语句中,或者把用引号(’)括起来的字母串在CONNECT 语句中, 如下面的语句是无效的。<br>EXEC SQL CONNECT SCOTT INENTIFIED BY TIGER; <br>EXEC SQL CONNECT ‘SCOTT’ IDENTIFIED BY ‘TIGER’;<br>(2). 插入、更新和删除<br>在讲述SQL语言时已详细讲过, 这里就不举例说明了。<br>(3). 数据库查询及游标的使用<br>在PRO*C中, 查询可分为两种类型:<br>l 返回单行或定行数的查询;<br>l 返回多行的查询.此种查询要求使用游标来控制每一行或每一组(主变量用数组).<br>1) 返回单行或定行数的查询<br>在PRO*C中的查询SQL SELECT语句由以下几个子句组成:<br>SELECT<br>INTO<br>FROM<br>WHERE<br>CONNECT BY <br>UNION<br>INTERSECT<br>MINUS<br>GROUP BY <br>HAVING <br>ORDER BY <br>其中WHERE子句中的查询条件可以是一个属性或多个属性的集合,在执行是赋值的主变量也可放在WHERE子句中.WHERE子句中所用的主变量称为输入主变量。如:</p>
<p><br>SELECT EMPNO, JOB, SAL <br>INTO:PNAME,JOB,SAL<br>FROM EMP<br>WHERE EMPNO=:PEMPNO;<br>若没有找到限定的行, 则SQLCA.SQLCODE返回”+1403”, 表明”没有找到”。<br>INTO从句中的主变量叫输出主变量,它提供了查询时所需要的信息。<br>在任何项送给主变量之前,都要求ORACLE把这些项转换成主变量的数据类型。对于数字是通过截断来完成的(如:9.23转换为9)。<br>如果已确定查询只返回一行,那么就不必使用游标,只给SELECT语句增加一个INTO子句即可。在语义上INTO语句在FROM之前的查询中有多少个选择项就有多少个输出主变量。若在SELECT项中表达式的数目不等于INTO子句中主变量的数目,就把SQLCA.SQLWARN[3]置为”W”。 <br>2)多行查询及游标的使用<br>如果查询返回多行或不知道返回多少行,使用带有ORACLE游标(CURSOR)的SELECT语句。<br>游标是ORACLE和PRO*C存放查询结果的工作区域。一个游标(已命名的)与一条SELECT语句相关联。操作游标有由4条命令:(1)DECLARE CURSOR;(2)OPEN CURSOR;(3)FETCH;(4)CLOSE CURSOR。</p>
<p>A. 定义游标<br>一个游标必须首先定义, 才能使用它。语法为:<br>EXEC SQL DECLARE 〈游标名〉CORSOR FOR <br>SELECT 〈列〉<br>FROM 〈表〉<br>例如:<br>EXEC SQL DECLARE CSOR, CURSOR FOR </p>
分享到:
评论

相关推荐

    racle中ProC学习.chm

    一 Pro*C 程序概述: 1.什么是Pro*C程序 在ORACLE数据库管理和系统中, 有三种访问数据库的方法; (1) 用SQL*Plus, 它有SQL命令以交互的应用程序访问数据库; (2) 用第四代语言应用开发工具开发的应用程序访问...

    8086/8088汇编语言程序设计教程

    第一部分是基础部分,以8086/8088为背景,以DOS和PC兼容机为软硬件平台,以MASM和TASM为汇编器,介绍汇编语言的有关概念,讲解汇编语言程序设计技术。第二部分是提高部分,以80386为背景,以新一代微处理器Pentium为...

    80x86汇编语言程序设计教程

    第一部分是基础部分,以8086/8088为背景,以DOS和PC兼容机为软硬件平台,以MASM和TASM为汇编器,介绍汇编语言的有关概念,讲解汇编语言程序设计技术。第二部分是提高部分,以80386为背景,以新一代微处理器Pentium为...

    实战OpenGL三维可视化系统开发与源码精解.part08

     第11章 本章主要对双目立体方式、正射投影方式和透视投影方式的显示模型模式控制和实现、时钟指北针的程序设计和实现、缩略图的实现方法和程序设计进行了详细的讲解和说明。  第12章 本章主要对目前常用的3DS...

    80X86汇编语言程序设计

    1.3.4 Pentium和Pentium Pro 1.4 习题 第2章 8086/8088寻址方式和指令系统 2.1 8086/8088寄存器组 2.1.1 8086/8088 CPU寄存器组 2.1.2 标志寄存器 2.2 存储器分段和地址的形成 2.2.1 存储单元的地址和内容 2.2.2 ...

    实战OpenGL三维可视化系统开发与源码精解.part03.rar

     第11章 本章主要对双目立体方式、正射投影方式和透视投影方式的显示模型模式控制和实现、时钟指北针的程序设计和实现、缩略图的实现方法和程序设计进行了详细的讲解和说明。  第12章 本章主要对目前常用的3DS、...

    实战OpenGL三维可视化系统开发与源码精解.part01.rar

     第11章 本章主要对双目立体方式、正射投影方式和透视投影方式的显示模型模式控制和实现、时钟指北针的程序设计和实现、缩略图的实现方法和程序设计进行了详细的讲解和说明。  第12章 本章主要对目前常用的3DS、...

    实战OpenGL三维可视化系统开发与源码精解.part10

     第11章 本章主要对双目立体方式、正射投影方式和透视投影方式的显示模型模式控制和实现、时钟指北针的程序设计和实现、缩略图的实现方法和程序设计进行了详细的讲解和说明。  第12章 本章主要对目前常用的3DS...

    实战OpenGL三维可视化系统开发与源码精解.part05.rar

     第11章 本章主要对双目立体方式、正射投影方式和透视投影方式的显示模型模式控制和实现、时钟指北针的程序设计和实现、缩略图的实现方法和程序设计进行了详细的讲解和说明。  第12章 本章主要对目前常用的3DS...

    实战OpenGL三维可视化系统开发与源码精解.part02.rar

     第11章 本章主要对双目立体方式、正射投影方式和透视投影方式的显示模型模式控制和实现、时钟指北针的程序设计和实现、缩略图的实现方法和程序设计进行了详细的讲解和说明。  第12章 本章主要对目前常用的3DS、...

    实战OpenGL三维可视化系统开发与源码精解.part09

     第11章 本章主要对双目立体方式、正射投影方式和透视投影方式的显示模型模式控制和实现、时钟指北针的程序设计和实现、缩略图的实现方法和程序设计进行了详细的讲解和说明。  第12章 本章主要对目前常用的3DS...

    实战OpenGL三维可视化系统开发与源码精解.part06.rar

     第11章 本章主要对双目立体方式、正射投影方式和透视投影方式的显示模型模式控制和实现、时钟指北针的程序设计和实现、缩略图的实现方法和程序设计进行了详细的讲解和说明。  第12章 本章主要对目前常用的3DS...

    实战OpenGL三维可视化系统开发与源码精解.part04.rar

     第11章 本章主要对双目立体方式、正射投影方式和透视投影方式的显示模型模式控制和实现、时钟指北针的程序设计和实现、缩略图的实现方法和程序设计进行了详细的讲解和说明。  第12章 本章主要对目前常用的3DS、...

    实战OpenGL三维可视化系统开发与源码精解.part07.rar

     第11章 本章主要对双目立体方式、正射投影方式和透视投影方式的显示模型模式控制和实现、时钟指北针的程序设计和实现、缩略图的实现方法和程序设计进行了详细的讲解和说明。  第12章 本章主要对目前常用的3DS...

    PureBasic 4.51 x86

    外部库是充分优化了的汇编程序,每个程序非常快,命令常常比C/C++还快或等同. PureBasic主要特色  - 支持486, Pentium (Pro, II, III) 以及更高,支持所有最新系统,支持微软的Vista! - 内嵌数组, 动态表, 复合体...

    STM32系列ARM Cortex-M3微控制器原理与实践_清晰版

    3.1存储器和总线的结构 3.1.1系统结构 3.1.2存储器结构 3.1.3存储器映射 3.1.4启动配置 3.2电源控制 3.2.1电源供应 3.2.2电源供应管理 3.2.3低功耗模式 3.2.4电源控制寄存器 3.3复位和时钟控制 3.3.1复位 3.3.2时钟 ...

    oracle+proc中文.pdf

    3.6.9 Pro*C/C++支持结构作为宿主变量么?..........................................................................9 3.6.10 可以在递归函数中嵌入SQL么? ......................................................

    Apress.Pro.WPF.in.C.Sharp.2008.2nd.Edition.Feb.2008

    WPF编程宝典——使用C# 2008和.NET 3.5(第2版)英文版 目录 第1章 WPF概述 1 1.1 理解Windows图形 1 1.1.1 DirectX:新的图形引擎 1 1.1.2 硬件加速与WPF 2 1.2 WPF:高级API 4 1.2.1 分辨率无关性 5 1.2.2 WPF的...

    MIPS CPU体系结构概述之Linux MIPS内核的详细资料说明

    initarch(setup.c)首先监测使用的cPU(通过MIPSCPU的CPO控制寄存器PRID)确定使用的指令集和一些CPU参数,如TLB大小等。然后调用promini做一些底层参数初始化。prominit是和具体的硬件相矢的使用MIPSCPU的平台...

Global site tag (gtag.js) - Google Analytics