sql语言范文

时间:2023-12-12 12:50:06

sql语言

sql语言篇1

关键词:SAP; R/3系统; ABAP语言;OPEN SQL;数据库

中图分类号:TP391文献标识码:A文章编号:1009-3044(2008)34-1658-02

The Applications of ABAP Language Open SQL Based on SAP R/3 System

JIANG Yong-peng

(Software School,Tongji University, Shanghai 201804, China)

Abstract: The basic knowledge of SAP R/3 system and the ABAP language is reviewed briefly, then from the system's structure, the relevant modules were explained specifically. And the practical examples illustrate the features of the OPENSQL subset which used in this system.

Key words: SAP; R/3 System; ABAPlanguage; OPEN SQL; Database

1 引言

SAP R/3系统是德国SAP公司开发的几乎适用于所有行业的一整套集成化的企业管理系统软件,该系统可以为大中型企业提供从生产到销售等一系列过程的整体解决方案,集资金流、物流和信息流三流合一的有高度的集成性,并且提供了一系列编程接口对它系统进行二次开发。

2 SAP R/3系统概述

2.1 SAP R/3系统架构

SAP R/3系统是一个典型的基于CLIENT/SERVER技术架构的三层服务体系的,开放的,系统的,集成的企业资源计划系统。

1) 表示服务层(Presentation Service)。是基于Windows或X―Windows的SAP前端图形界面;用户通过安装SAP客户端(SAPGUI)来访问SAP。

2) 应用服务层(Application Service)。系统处理及开发平台,也即应用服务器。

3) 数据库服务层(Database Service)。由其他厂商提供的数据库管理系统,如Oracle,DB2,Sybase,Informix等。

2.2 SAP R/3系统采用模组化结构

它们既可以单独使用,也可以和其它解决方案相结合。从流程导向的角度而言。各模块的整合程度越高,它们带来的好处就越多。SAP R/3系统包括十二个产品模块:

SD (销售与分销):积极支援销售和分销活动,具有出色的定价,订单快速处理,按时交货,交互式多层次可变定制功能,并直接与盈利分析和生产计划模组连接。

MM(物料管理):以工作流程为导向的处理功能对所有采购处理最佳化,可以自动评估供货商,透过精确度库存和仓储管理降低采购和仓储成本,并与发票核查相整合。

PP(生产计划):提供各种制造类型的全面处理,从重复性生产,订制生产,订装生产,加工制造,批量及订存生产直至过程生产,具有扩展MPR的功能。另外还可以选择连接PDC,制程控制系统,CAD和PDM。

QM(质量管理):监控,输入和管理整个供应链与品质保证相关的各类处理,协调检查处理,启动校正措施,以及与实验室资讯系统整合。

PM(工厂维护):提供对定期维护,检查,耗损维护与服务管理的规划,控制和处理,以确保各个操作系统的可用性。

HR(人事管理):采用涵盖所有人员管理任务和帮助简化与加速处理的整合式应用程序,为公司提供人力资源规划和管理解决方案。

FI(财务会计):集中有关会计的所有资料,提供完整的文献和全面的资讯,同时作为企业实行控制和规划的最新基础。

CO(管理会计):是公司管理系统中规划与控制的工具的完整体系,具有统一的报表系统,协调公司内部处理业务的内容和过程。

AM(资产管理):电子化地监控固定资产和商品(如零件和原材料),以控制并优化企业资产的使用。

PS(项目管理):协调和控制项目的各个阶段,直接与采购及控制合作,从报价,设计到批准以及资源管理与结算。

WF(工作流程管理): 对企业整个工作运作的流程进行管理,使流程得以最优化。

IS(工业方案):针对特定行业所量身定做的实施方案。

其中,在中国大陆使用较多的是PP,MM,SD,FI,CO,AM,QM和HR模块。

R/3系统所支持的功能是非常多的,为了能够使得R/3系统具有高度的灵活性以及可集成性,R/3系统提供了系统定制这项强大的功能,根据企业的具体业务需要而取舍。但是由于在某些特殊的环境下,系统定制不能够解决企业的具体情况,那么需要利用R/3系统的开发平台以及所提供的ABAP/4编程语言来解决特殊的问题。

3 ABAP语言及OPEN SQL子集介绍

ABAP全称是Advanced Business Application Programming(高级商业应用程序设计语言),它是由SAP公司开发的一种编程语言,用于SAP系统内部商业应用程序的设计开发。ABAP程序是使用ABAP语言开发通过SAP开发平台编译并应用于SAP系统的程序。ABAP程序实现了R/3系统三个层次的数据传递和交互控制。SAP客户使用ABAP进行用户级的开发,即客户化定制开发,这样的开发使R/3标准解决方案能适应各行业的特殊要求。目前ABAP最新版本是ABAP/4,其中不仅包含了事件驱动机制(Event Driven)和模块化(Modularization)技术,还加入了完整的面向对象的概念及实现方法。

ABAP/4开发平台如图1所示。

程序结构:

作为一种时间驱动语言,ABAP程序的源代码包括数据定义和处理快两个部分。1)数据定义:包含整个程序中可见的全局数据类型和数据对象,选择屏幕元素以及ABAP Objects中自定义的类和接口;2)处理块: 是ABAP程序的主要结构单元,定义了程序在不同状态下执行的具体功能,在程序编译运行过程中,每个块都是一个独立的实体。ABAP程序中,数据定义和生命是独立于任何处理快递,其他所有语句都必须隶属于某个处理块。

处理块有三种类型:

1) 事件块:每个事件块都需要有一个时间关键字引导,其后续语句隶属于该关键字的时间块,直到下一个事件关键字出现为止才结束。

2) 对话模块:开始和结束都有相应的关键字作为标志,是相对独立的程序单元。用于用户对话程序。

3) 过程块:开始和结束也有相应的关键字作为标志,包括功能模块和子程序,以及ABAP的类方法,可以被其他模块调用。

每一个ABAP/4程序必须以PROGRAM 或者以REPORT语句打头;一般建议如下,REPORT语句用于ABAP/4 reports,PROGRAM 语句用于一般的ABAP/4程序,全局数据声明必须在程序的起始部分的数据声明部分中,语句体可以包含不同的子模块以完成不同的处理功能。

ABAP程序基本结构如图2所示。

图2 ABAP程序基本结构

程序类型:

在创建ABAP程序时均需要制定其类型,程序类型将决定在该程序中可以包含哪些处理块,以及运行环境是如何处理该程序的。主要分为两大类:一类是可以分配事务代码并通过事务代码直接运行的应用程序,往往用于完成一种系统功能;另一类不是为了实现特定功能,可能只是在系统开发过程中具有意义,例如包含程序或功能模块程序,近提供一些模块化的功能,方便系统设计开发,而不是可以直接运行的。

程序元素和语法:

在ABAP程序中,不仅有源代码作为元素,还有变量,属性,文本元素,文档和屏幕等。

一般来说ABAP/4程序由一系列独立的语句组成,每个语句必须以句号结尾,句子中的第一个单词是关键词,词与词之间至少有一个或者以上的空格,语句可以缩进几列,也可以跨越几行,一般来说语句由四个单词组成,除第一个为关键词外,第二、三、四个单词一般为参数、字段、常量等。语句的基本类型及基本性质由关键字确定。如果连续使用相同关键字引导的语句,可以使用关键字后的“:”和语句间的 “,”符号形成语句链,将它们连接在一起,以简化代码。

一个简单的ABAP程序:

REPORT z_simple_program.

DATAtext(20) VALUE 'This is a example'.

START-OF-SELECTION.

WRITE text.

其中REPORT关键字引导的声明性语句表明该程序为可执行程序,该关键字后面接程序名,作为程序开始的标志;第二个语句DATA语句为一个数据声明语句,不属于任何处理块;语句START-OF-SELECTION.是事件块声明语句,表示后续语句隶属于该事件块。

4 ABAP的OPEN SQL子集在SAP R/3系统中的应用及定制

OPEN SQL 是由可以操作R/3系统的核心数据库的ABAP模块组成,所有的操作和报错的结果均是独立于数据库的。OPEN SQL只会作用于是ABAP数据字典创建的数据库表中。在ABAP的数据字典中,你可以把不同数据库中表的列联在一起成数据库视图。在OPEN SQL看来,这些视图跟一般的表可以同等处理。

OPEN SQL 包括一般的SQL语句中的关键字,SELECT,INSERT,UPDATE,MODIFY,DELETE, CURSOR等。

所有的OPEN SQL语句模块都会下列两个返回码:SY-SUBRC 和 SY-DBCNT。其中SY-SUBRC返回码为0时,表示刚刚运行的OPEN SQL语句模块操作成功,否则,表示操作失败失败。而SY-DBCNT则表示刚刚运行的OPEN SQL语句模块操作的数据库表的行数。(下转第1664页)

(上接第1659页)

举一个例子(读一个单行的特定列):

DATA WA TYPE SPFLI.

SELECT SINGLE CARRID CONNID CITYFROM CITYTO

INTO CORRESPONDING FIELDS OF WA

FROM SPFLI

WHERE CARRID EQ 'LH' AND CONNID EQ '0400'.

IF SY-SUBRC EQ 0.

WRITE :/ WA-CARRID,WA-CONNID,WA-CITYFROM,WA-CITYTO.

ENDIF.

这段语句运行后的输出是:

LH0040 FRANKFURTNEW YORK

解释如下:单行(SINGLE)在OPEN SQL 中意味着这段语句将会从名为 SPFLI的数据库表中读取一行单独的条目,这个单在SELECT子句意味着该声明全文一个单一的条目,该数据库表SPFLI的主要关键领域CARRID和CONNID有中WHERE子句需要的具体的数值。该段语句中指定的SELECT 结果转移到相同名称的组成部分的结构WA中。

由例子可见,OPEN SQL 除具有一般的数据库操作功能,更是与ABAP紧密结合,保证了SAP R/3系统实施过程中,多种数据库并存情况下,保证整个数据库数据的统一。

5 结论

从纵览的视角解释了SAP R/3系统以及ABAP语言,并通过实际Open SQL应用的例子,说明了SAP R/3系统在SAP实施过称中对于数据库不统一的情况,OPEN SQL子集的优势。

参考文献:

[1] 黄佳.SAP程序设计[M].北京:机械工业出版社,2005.

[2] Hagemann S, Will L.SAP R/3系统管理[M].北京:东方出版社,2006.

sql语言篇2

关键词:项目教学;共同参与;素质教育

中图分类号:G712 文献标志码:A 文章编号:1674-9324(2017)20-0210-02

一、高职计算机专业学生的特点及其表现

高职院校的学生普遍表现出几个重要的特点,如个性鲜明突出、可塑性强,但是以自我为中心,缺乏一定的集体意识和集体观念等,具体表现为:课堂上愿意表现自己,勇于发表自己的观点。但是,在团体活动的过程中往往缺乏合作的意识,过于鲜明的个性容易导致团队任务的结果差强人意,同时,兴趣广泛,操作能力强。但是,学习动力不足,持续性较差,主要表现为:高职院校的学生普遍有多重兴趣、爱好,如健身、音乐、舞蹈等,因此高职院校的各类社团层出不穷。但是,高职院校的学生往往难以持之以恒,突出表现为他们对待新鲜事物的接受度较高,但是普遍存在“三分钟热度”,难以形成良性地发展。此外,高职院校的学生渴望实现自我价值,但是又往往缺乏艰苦奋斗的精神。对于当前的高职生来说,他们渴望被关注,也渴望自我价值的实现。但是他们对于自我的认知通常是不清楚的,一般表现为过于高估或低估自己的能力,盲目地追求所谓的成功。以上高职计算机专业学生的特点及其表现常常导致高职生难以适应《数据库原理与SQL语言》的课程训练和社会的需求。

二、高职计算机专业学生就业竞争的现状

1.就业供需差异大。随着近年来高校的不断扩招,高校毕业生越来越多,而就业单位的用人需求却呈现出相对稳定的状态,这就导致高职高专的毕业生人数急剧增加,但企业的招聘人数却稳固不前,形成了就业供需差异大的局面。

2.综合实践竞争力低。随着时代的发展,用人单位对毕业生的要求越来越高。除了设置一定的高学历门槛之外,项目实践和实践能力等的要求也越来越高。近年来,企业招聘毕业生逐步从专业型向应用型、创新型人才转变,特别是计算机专业的学生。但是受到传统教学模式的影响,高职计算机专业学生的综合实践能力往往难以达到用人单位的人才标准。这在一定程度上也导致了高职计算机专业学生的就业压力越来越大。

三、项目教学法在《数据库原理与SQL语言》课程中的应用

1.课程分析。《数据库原理与SQL语言》是以培养计算机专业学生的基本理论、知识与技能为核心的全方面素质培养的课程。同时,《数据库原理与SQL语言》在课程设置还加大了学生动手操作的实践课所占的比例,在一定程度上有助于高职院校计算机专业的学生满足社会对应用型人才的需求。此外,《数据库原理与SQL语言》在教材编写上也进行了内容新颖、结构合理、实用性强的内容设计,从知识体系上为高职院校计算机专业的学生提供了强大的技术知识保障。

2.项目教学法的应用。从人才培养目标来看,项目教学法能够根据社会发展需要和学校自身实力为学生树立起正确的人生目标或职业规划,再通过科学合理地安排教学内容,按照理论与实践相结合的方式,针对高职院校计算机专业学生缺乏团队意识和实践能力等方面出发,培养学生的协作精神和实践能力,最大限度地满足社会对人才的需求。同时,项目教学法中还强调自主探究、教学相长的发展意图,通过师生之间的合作,借助真实的项目,将学生学习过的计算机相关的理论内容应用到具体的实践中去,既能保证学习的针对性和实用性,又能提高学生的专业层次水平和实践能力。(1)项目教学法的特点。项目教学法是根据皮亚杰的建构主义理论演变而来的。项目教学法是最适合当前教育模式的一种教学策略,主要表现为:将项目实验作为教学内容的核心组成部分,再通过把握教学环节与整体过程的难点与重点,最终通过师生合作的模式来完成实验项目。其中表现出几个特点:①实验项目与实际生活的联系较为紧密。项目教学法在设计一定的实验项目的时候,往往是让学生自主地选择自己感兴趣的事物作为活动目标,最终在班级内通过小组合作的方式选择最适合的项目作为学习或者是研究的目标。选择研究目标的过程中既可以是全体班级成员选择同一主题进行一定的研究,也可以是几个主题同时进行。②能够有效地培养学生的多种能力,其中主要包括学生的自主探究能力、观察与分析能力、合作与交流能力、发现问题与解决问题的能力等。③教师创造性的发挥。项目教学法作为教学策略的一种,使得教师可以在《数据库原理与SQL语言》的教学过程中充分地发挥其创造性。同时,教师也可以通过指导学生参与到项目研究中去来引导学生自觉、主动地去完成项目作业,进而建构出相对完整的项目操作体系,不仅有助于完成教师的教学目标,而且还有助于提升W生的综合能力。(2)项目教学法的注意事项。①教师作为教学活动的引导者和指导者,在保证学生教学主体地位的同时,也需要引导学生参与到实验项目中来。此外,教师自身也必须进行一定的学习,保证其有足够的理论基础和实践能力,以便可以在实验过程中将数据系统开发等过程详细地展现到学生的面前。需要注意的是,要求教师不断进行其专业素质的培养,主要是因为教师需要及时解答学生在项目实验过程中遇到的问题。②虽然项目教学法追求地是学生的自主探索与合作探究,但是教师要把握好项目教学法的整体教学部分,确保学生的个性化得到充分地发挥。同时,教师也要根据学生的特点因材施教,即根据学生的具体情况选择最适合的方式来开展教学工作。当然项目教学法的应用并不代表着要放弃传统教学方式,而是要实现传统教学方式的创新。在整个项目教学的实践过程中,教师要把握好实践知识与理论知识的结合,通过各个子系统的学习来最终完成整体框架的构建过程。(3)项目的确定及环节设计。根据学生现有的知识体系及能力,结合《数据库原理与SQL语言》的教材内容,以公司数据库管理系统为整体性项目的核心,并结合高职院校的教学资源及就业需求等,将总项目划分为六个子系统,即公司管理数据库的规划与设计、数据库系统的数据查询、数据库系统编程、数据库组建于管理、数据库系统的安全管理等。将整本教材提炼成企业数据库管理系统的构建过程,并且根据《数据库原理与SQL语言》的章节内容对子系统进行具体的划分,最终实现构建整体框架的目标。但是,无论是如何构建整体框架的目标,其最终的目的是要让学生从每一个子项目出发,最终能够在项目实施结束后掌握到各个子系统构建的原理。(4)项目实施过程。根据六个子系统的构建需求,将学生进行一定的分组。这里的分组并不是随便进行的,而是需要教师充分考量到每个小组的人员组成,要保证小组之间的最小差异性。此外,每个项目小组需要选出一名项目经理,负责与项目总负责人和其他项目经理之间的交流及项目小组内任务的安排与分配工作。在项目实施过程中,要强调学生之间的合作与交流。而项目负责人在项目实施过程中主要起的就是把握全局发展方向及引导的作用,不需要过多地干涉其他项目小组的发展。

四、结语

项目教学法是以建构主义相关理论为指导,以实际工程项目为核心,通过创设师生与生生之间的合作模式来实现探究式实践学习的重要手段。项目教学法主要是通过合理化的项目选择,以项目主题、设计项目环节、项目具体实施、总结与反思等四大环节为主要构架,再通过重组与整合一定的知识内容,以创新和实践为主要培养手段,提高高职计算机专业学生的核心竞争力。简单来说,项目教学法就是通过培养学生的知识掌握能力与创新实践能力,从而使学生在《数据库原理与SQL语言》的学习上获得质的提高。

参考文献:

[1]冯文成.高职院校开展工学结合课程改革中面临的矛盾[J].兰州石化职业技术学院学报,2013,(4).

sql语言篇3

关键词:SQL Server 2000 Transact―SQL语言 CASE语句 函数 综合运用

数据库是计算机应用的一项重要技术。随着计算机、网络通信等技术的发展,在网络多用户环境下对数据进行安全有效的管理已成为计算机的一项重要应用。SQL Server 2000是微软公司推出的基于SQL标准的关系型大型数据库管理系统。

它功能强大,易学易用,与Windows 2000相结合,可以构造网络环境数据库甚至分布式数据库,可以满足企业及Internet等大型数据库的应用,当前使用十分普遍。

SQL Server 2000系统所使用的SQL语言称为Transact―SQL。Transact―SQL是用于管理SQL Server 2000实例,创建和管理SQL Server 2000实例中的所有对象,并且插入、检索、修改和删除SQL Server 2000数据表中数据的命令语言,它是SQL Server 2000数据库管理系统的核心。

使用Transact―SQL脚本可以编写存储过程,完成建立和操作数据库、数据查询、数据管理等工作。Transact―SQL语言可以在SQL Server 2000提供的查询分析器上执行,查询分析器是一个具有执行SQL脚本、分析查询性能和调试存储过程等功能的管理工具。它是SQL Server 2000系统中最常用的操作管理工具,利用它可以输入、调试、运行SQL语句。

使用Transact―SQL的变量、运算符、函数和流程控制语句等基本语言元素,可以进一步丰富查询操作,实现数据库应用系统的复杂功能。

Transact―SQL语言中的CASE语句可以根据多个选择决定程序执行的流程。相当于if-else语句的嵌套,但结构更清楚。

简单CASE语句

・语法格式

CASE输入表达式

WHEN比较表达式THEN结果表达式[...n]

[ELSE最终结果表达式]

END

・功能将输入表达式的值与每一个比较表达式比较,若相等,则返回对应结果表达式的值;否则返回最终结果表达式的值。最终结果表达式也可以省略。输入表达式和每个比较表达式的数据类型必须相同,或者可以隐式转换。

[...n]表示可以使用多个“WHEN ... THEN”表达式子句。

例如:使用CASE语句根据输入的学生分数,输出对应的等级,这个问题如果用C语言的switch语句很好完成,C语言程序如下:

main()

{int score

printf("Please enter a score:");

scanf("%d",&score);

printf("score=%d:",score)

switch(score/10)

{case 10:

case 9:printf("A/n");break;/*分数在90分以上,则输出A*/

case 8:printf("B/n");break;

case 7:printf("C/n");break;

case 6:printf("D/n");break;

default:printf("E/n");break;

}

}

若用Transact―SQL语言的CASE语句来做则会遇到一些问题,Transact―SQL语言大多数情况下是对表中数据进行操作,本例题中所使用的分数就来自于choice表,如按照C语言模式写成如下程序:

use teachdb

select sno,score=

case score/10

when 9 thenprint"优"

when 8 thenprint"良"

when 7 thenprint"中"

when 6 thenprint"及"

elseprint"不及格"

end

from choice go

则产生错误,因为sno是表中字段,它的运行结果会在“网格”标签内显示,而print命令是在查询分析器窗口的“消息”标签中显示用户信息。且该例中的print语句属于结果表达式,print语句的结果应赋值给score字段,而它们的类型又不匹配,所以这么设计在语法结构上就存在缺陷。第一次修改程序时,取消print语句改为score,以验证问题是否是因为类型不匹配造成的。修改后程序能正常运行说明语法上没有问题,但所有score字段的结果都显示为“NULL”,与预想的结果不符(预想的结果应为该生对应的分数),初步分析是输入表达式score/10与比较表达式9,……,6都不匹配。

进入企业管理器查看choice表中score字段的类型为数值型,且学生具体分数值有小数部分,于是考虑将score小数部分去掉,ceiling()函数的功能是:返回大于或等于给定值的最小整数。将score/10改为ceiling(score)/10,再运行程序,所有score字段的结果仍为“NULL”,单独执行print ceiling(82.5)/10观察其结果为:8.0,说明虽然去掉了小数部分,但其值仍为数值型,而比较表达式的值为整型所以不匹配,cast()函数的功能为:把一种数据类型强制转换为另一种数据类型,再将ceiling(score)/10改为cast(ceiling(score)/10 as int),运行程序,所有score字段的结果为该生对应的分数,结果正确。

接下来考虑如何让学号后面出现的不是对应分数而是对应等级,前面已经分析score字段与print语句的类型不匹配,所以将表中已有的score字段换成新加入的grade字段,即程序运行后新生成一个结果字段,程序如下:

use teachdb

select sno,grade--grade并不是表中已有的列

case cast(CEILING(score)/10as int)

when 9 then"优"--分数在90分以上,则输出“优”

when 8 then"良"

when 7 then"中"

when 6 then"及"

else"不及格"

end

from choice go

实验证明通过CASE语句与函数的综合运用,可以方便灵活地解决多分支控制流程的问题。

参考文献:

[1]谭浩强.《C程序设计》.清华出版社,1991.

[2]周力. 《SQL Server 2000实用教程》.大连理工大学出版社,2009.

sql语言篇4

关键词:PowerBlider;嵌入式SQL;通信区;游标

中图分类号:TP311文献标识码:A文章编号:1009-3044(2007)18-31679-02

The Programming Technology of Embedded SQL Base on PowerBuilder Language

QIN Fei-zhou

(Academy of Physics and electricity Information,University of Ningxia, Yinchuan 750021, China)

Abstract:The programming technology about Embedded SQL, we have dicussed the form of Embedded SQL base on PowerBuilder language in this paper. We have not only discussed the principle of technology and described the realization detail, but also produced the corresponding programming example code.

Key words:PowerBuilder; The Embedded SQL; communication; cursor

1 引言

标准SQL是非过程化的查询语言,具有操作统一、面向集合、功能丰富、使用简单等多项优点。但和程序设计语言相比,高度非过程化的优点同时也成了它的一个弱点。因为他缺少流程控制能力,难以实现应用业务中的逻辑控制。

为了解决这一问题,将SQL嵌入到某种高级语言(例如PowerBuilder)中使用,利用高级语言的过程性程序结构来完成逻辑控制。这种方式下使用的SQL语言称为嵌入式SQL(Embedded SQL)。通过嵌入式SQL可提高应用系统和关系数据库管理系统(RDBMS)间的互操作性。

应用系统中使用SQL编程来访问和管理数据库中数据的方式主要有:嵌入式ESQL(Embedded SQL,ESQL)、PL/SQL(Procedural Language/SQL)、ODBC(Open Data Base Connectivity)编程、JDBC(Java Data Base Connectivity)编程和OLEDB(Object Linking and Embedding DB)编程等方式。本文主要论述如何在PowerBuilder语言中实现嵌入式SQL编程。

2 基于PowerBuilder语言的嵌入式SQL

2.1 嵌入式SQL在PowerBuilder中的标识

嵌入式SQL是将SQL语句嵌入程序设计语言中,被嵌入的程序设计语言PowerBuilder称为宿主语言,简称主语言。

RDBMS一般采用预编译方法处理ESQL,即由RDBMS的预处理程序对源程序进行扫描,识别出ESQL语句,把它们转换成主语言调用语句,以使主语言编译程序能识别它们,然后由主语言的编译程序将纯的主语言程序编译成目标代码。

在ESQL中,为了能够区分嵌入式SQL语句与主语言语句,所有SQL语句都必须加一个标识。在PowerBuilder中的每一个SQL语句结束处加上一个分号“;”作为区分标识。

2.2 嵌入式SQL语句与PowerBuilder之间的通信

将SQL嵌入到PowerBulider语言中混合编程,SQL语句负责操纵数据库,高级语言语句负责控制程序流程。这时程序中会含有两种不同计算模型的语句,它们之间应该如何通信呢?PowerBuilder提供了一种非可视事务对象(Transaction Object),用于主语言与数据库的连接,即它是应用程序和数据库之间的通信区域。

在PowerBuilder应用程序中,如果要连接和操作数据库,则必须首先建立事务对象。事务对象的属性分为两大部分,一部分是连接数据库的参数,另一部分则接收返回的数据库操作状态信息。每个事务对象有15个属性,其中有10个属性用于数据库的连接,5个属性用于接收数据库返回的操作状态信息(成功或失败)。具体内容如下表所示。

2.3 事务对象的使用方法

事务是操作数据库的基本单位,事务对象是操作数据库的基本工具。PowerBulider使用一个叫做逻辑工作单元(Logical Unit of Work,简称LUW)的数据库事务处理基本概念。LUW是事务的同义词,一个事务是由一条或多条SQL语句构成的一个LUW。在一个事务内,所有的SQL语句作为一个整体,要么全部执行成功,要么全部执行失败。

在PowerBuilder中有四条管理事务的语句,它们是CONNECT、COMMIT、DISCONNECT、ROLLBACK。

CONNECT语句用来建立到数据库的连接,同时标志着一个事务的开始。在CONNECT语句之前,相应的事务对象必须存在,并且连接数据库所需要的事务对象的属性必须已经赋值。DISCONNECT语句首先结束当前的事务,然后断开与数据库的连接。所有的SQL语句肯定都是在CONNECT语句和DISCONNECT语句之间执行的。COMMIT语句是提交事务,就是确认当前事务对数据库所做的修改,它标志着一个事务已经结束,并且开始一个新的事务。ROLLBACK语句的功能是撤消事务,也就是撤消当前事务对数据库所做的修改,使数据库恢复到当前事务修改数据库之前的状态。撤消了一个旧事务,也标志着开始了一个新事务。

PowerBuilder提供了一个默认的全局事务对象SQLCA(SQL Communication Area,简称SQLCA),开发人员可以使用这个默认的事务对象建立到数据库的连接。一个事务对象连接一个数据库,如果应用程序需要同时操作多个数据库,则必须建立另外的多个数据库事务对象。使用事务对象操作数据库包括以下步骤:

(1)为事务对象连接数据库的属性赋值。

(2)连接到数据库。

(3)将事务对象赋值给DataWindow控件或DataStore对象。

(4)执行数据库操作。

(5)断开与数据库的连接。

如下的程序段是同时操作两个数据库的实例,其中默认的事务对象SQLCA用于Adaptive Server Anywhere数据库,而非默认的事务对象MSSTrans 用于Microsoft SQL Server数据库:

//设置默认事务对象的属性

SQLCA.DBMS="ODBC"

SQLCA.Database="EAS Demo DB V3"

SQLCA.AutoCommit=False

SQLCA.DBParm="ConnectString='DSN=EAS Demo DB V3;UID=dba;PWD=sql'"

//连接到Adaptive Server Anywhere数据库

本文为全文原貌 未安装PDF浏览器用户请先下载安装 原版全文

CONNECT USING SQLCA;

//说明和建立事务对象MSSTrans

TRANSACTION MSSTrans

//设置事务对象MSSTrans的属性

MSSTrans=CREATE TRANSACTION

MSSTrans.DBMS="MSS"

MSSTrans.Database="library"

MSSTrans.ServerName="SERVER"

MSSTrans.AutoCommit=False

MSSTrans.DBParm=""

//连接到MS SQL Server数据库

CONNECT USING MSSTrans;

//插入一行到Adaptive Server Anywhere数据库中的department表

INSERT INTO department values(600,'computer',501) USING SQLCA;

//插入一行到MS SQL Server数据库中的itemlist表

INSERT INTO itemlist VALUES('500','网络工程','501')USING MSSTrans;

//断开与Adaptive Server Anywhere数据库的连接

DISCONNECT USING SQLCA;

//断开与MS SQL Server的连接

DISCONNECT USING MSSTrans;

//释放事务对象MSSTrans

DESTROY MSSTrans;

3 游标的使用

3.1 为什么要用到游标

SQL是面向集合的,一条SQL语句可以产生或处理多条记录。而主语言是面向记录的,一组主变量一次只能存放一条记录。所以仅使用主变量并不能完全满足SQL语句向应用程序输出数据的要求,为此嵌入式SQL引入了游标(Cursor)的概念,用游标来协调这两种不同的处理方式。

游标是系统用户开设的一个数据缓冲区,存放SQL语句的执行结果,每个游标区都有一个名字。用户可以通过游标逐一获取记录,并赋给主变量,交由主变量进一步处理。

3.2 游标的操作

在PowerBuilder中使用游标有四个基本的步骤:声明游标、打开游标、提取数据、关闭游标。

3.2.1 声明游标

在PowerBuilder中使用游标和使用其它类型的变量一样,使用之前首先应当声明它。游标的声明包括两个部分:游标的名称和这个游标所用到的SQL语句。如要声明一个叫作CustomerCursor的游标用以查询地址在北京的客户的姓名、帐号及其余额,可以编写如下代码:

DECLARE CustomerCursor CURSOR FOR

SELECT acct_no,name,balance

FROM customer

WHERE province="北 京";

我们还可以动态地定义游标中的Where子句的参数, 例如在上例中我们是直接定义了查询省份是北京的记录,如果在应用中我们要使用一个下拉式列表框,由用户来选择要查询的省份,那么在DECLARE的Where子句中加入变量作参数即可完成这个功能,编写代码如下:

DECLARE CustomerCursor CURSOR FOR

SELCECT acct_no,name,balance

FROM customer

WHERE province=:ls_province; //定义ls_province的值

在游标的声明中有一点必须注意:如同其它变量的声明一样,声明游标的这一段代码行是不执行的,因此不能将debug调试时的断点设在这一行代码上,也不能用IF…END IF 语句来声明两个同名的游标,如下列的代码就是错误的。

IF ls_province ="北 京"THEN

DECLARE CustomerCursor CURSOR FOR

SELECT acct_no,name,balance

FROM customer

WHERE province="北 京";

ELSE

DECLARE CustomerCursor CURSOR FOR

SELECT acct_no,name,balance

FROM customer

WHERE province "北 京";

END IF

3.2.2 打开游标

声明了游标后在作其它操作之前,必须打开游标。打开游标是执行与其相关的一段SQL语句,例如打开上例声明的一个游标,我们只需编写如下代码: OPEN CustomerCursor;。

由于打开游标是对数据库进行一些SELECT的操作,它将耗费一段时间,时间的耗费主要取决于使用的系统性能和这条语句的复杂程度。

3.2.3 提取数据

当用OPEN语句打开了游标并在数据库中执行了查询后,不能立即使用在查询结果集中的数据,而是必须用FETCH语句来取得数据。一条FETCH语句一次可以将一条记录放入指定的主变量中。事实上,FETCH语句是游标使用的核心。在数据窗口(DataWindow)和数据存储(DataStore)中,执行了Retrieve()函数以后,查询的所有记录结果一次全部可以得到;而使用游标,则可以逐条得到记录查询结果,应用程序就可以逐条处理结果集中的所有记录数据了。

已经声明并打开一个游标后,我们就可以将数据放入任意的变量中。在FETCH语句中可以指定游标的名称和目标变量的名称。如语句FETCH CustomerCursor INTO:ls_acct_no, :ls_name, :ll_balance;就是将游标取出的记录中acct_no字段内容放入主变量ls_acct_no中,将name字段内容放入主变量ls_name中,将balance字段内容放入主变量ll_balance中。

从语法上讲,上面所述的就是一条合法的取数据的语句,但是使用游标却还应当包括其它的部分。正如前面所谈到的,游标只能一次从后台数据库中取出一条记录,而在多数情况下,我们所想要做的是在数据库中从第一条记录开始提取,一直到结束,所以需要将游标提取数据的语句放在一个循环体内,直至将结果集中的全部数据提取后,结束循环。 通过检测SQLCA.SQLCODE的值,可以得知FETCH语句是否成功。当SQLCA.SQLCODE值为0时表明一切正常;100表示已经取到了结果集的末尾;而其它值均表明操作出了问题,据此可以编写以下的代码:

(上接第1680页)

lb_continue=True //用来控制循环,初值为真可以执行循环体

ll_total=0 //用来统计取出的记录数

DOWHILE lb_continue

FETCH CustomerCur-sor INTO:ls_acct_no, :ls_name, :ll_balance;//取出记录到主变量中

If sqlca.sqlcode=0 Then

ll_total+=ll_balance //如果成功取出,记录数目加1

Else

lb_continue=False //否则表示操作有问题,停止取出记录

End If

本文为全文原貌 未安装PDF浏览器用户请先下载安装 原版全文

LOOP

循环体的结构有多种,这里提到的是最常见的一种。也有的程序员喜爱将一条FETCH 语句放在循环体的前面,循环体内再放置另外一条FETCH语句,并检测SQLCA.SQLCODE是否为100。但是这样做,维护时需同时修改两条FETCH语句,稍麻烦了些。

3.2.4 关闭游标

在游标操作的最后请不要忘记关闭游标,这是一个好的编程习惯,以使系统释放游标占用的资源。关闭游标的语句如下: CLOSE CustomerCursor;

3.3 游标的高级技巧

尽管目前基于SQL语句的后台数据库所支持的语言都大致相同,但对游标的支持却有着一些差异,例如对滚动游标支持。所谓滚动游标,含义是程序员可以指定游标向前或向后任意一个方向滚动。如在Informix中,可以将游标滚向结果集开头(FETCH FIRST)或末尾(FETCH LAST),回滚到前一条记录(FETCH PRIOR)滚向下一条记录(FETCH NEXT)。 当程序员用FETCH语句,其缺省是指FETCH NEXT。由于滚动是在数据库后台实现的,所以滚动游标为用户编程提供了极大的方便。

对游标支持的另一个不同是可修改游标。上述游标的使用都是指只读游标。而象Oracle、Sybase数据库支持可作修改的游标。如果使用的数据库是Sybase,必须修改数据库的参数,将游标可修改的值修改为1(SQLCA.DBParm="Cursor Update=1"),才能执行上述操作,这个修改在连接数据库的前后进行均可。使用这样的数据库,可以修改或删除当前游标所在的行。例如修改当前游标所在行的用户的余额,可进行如下编码:UPDATE customer SET balance=1000 WHERE CURRENT of customerCursor;删除当前行的编码如下:DELETE FROM Customer WHERE CURRENT OF CustomerCursor;。

4 结束语

数据窗口是PowerBuilder中的进行数据操作的一个可视化控件,通过数据窗口可以完成对数据库的所有操作,而且数据窗口也是PowerBuilder最突出的特色之一。但在PowerBuilder中不仅可以通过数据窗口操作数据库,也可以在PowerScipt中直接使用SQL语句操作数据库。通过前面的分析我们可以得出结论,PowerScript支持标准嵌入式SQL语句和动态SQL语句,并且编程更加灵活方便。

参考文献:

[1]王姗, 萨师煊. 数据库系统概论(第四版)[M]. 高等教育出版社, 2006,5.

[2]高守传, 刘小静. 使用嵌入式SQL访问数据库[J]. 电脑编程技巧与维护, 2007(2).

[3]吴飞, 王昕. 嵌入式移动数据库SQL SERVER for Windows CE的应用[J]. 微计算机信息, 2006,(17).

[4]张继德, 史宝英. PowerBulider大型结果集的处理[J]. 电脑知识与技术, 2006(11).

[5]罗杰里. SQL SERVER数据库中的后台连接与应用[J]. 科技经济市场, 2006(1).

[6]崔巍. PowerBuilder7.0应用技术[M]. 清华大学出版社, 2000.9.

注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。

sql语言篇5

关键词:SQL;Visual FoxPro;查询;分组

中图分类号: TP311.13文献标识码:A文章编号:1009-3044(2011)17-4009-02

Application of SQL Queries in Visual FoxPro Database

ZHAO Xiao-xia, LEI Jin-hui, TIAN Chun-jin

(Kunming University of Science and Technology, Kunming 650093, China)

Abstract: Query processing is the indispensable element of database management system. This paper introduce how the SQL SELECT statements be used in Visual FoxPro as well as the problems and solutions along with this application.

Key words: SQL; VFP; Query; Group

SQL(Structured Query Language结构化查询语言)是标准的数据库通用语言,它既能用于大型关系型数据库系统,也能用于微机数据库系统。目前,绝大多数流行的关系数据管理系统如Oracle,Sybase,SQL Server,Visual FoxPro等都采用了SQL语言。

1 SQL的工作原理

SQL语言分为三部分:数据定义语言,用于完成数据库对象的建立、删除和修改;数据操纵语言,是完成对数据操作的命令;数据控制语言,是控制用户对数据库的访问权限。Visual FoxPro中没有权限管理,因此没有数据控制语言命令[1]。

数据查询是数据库的核心操作,其功能是根据用户的需要以一种可读的方式从数据库中提取所需数据。数据库管理系统是一个存放信息的数据库及管理、控制数据库的软件系统,当用户需要检索数据库中的数据时,可以通过 SQL语言发出请求,数据库管理系统对请求进行处理,按要求将检索到的数据返给用户。图1为SQL的工作原理。

2 Visual FoxPro中查询的实现

在Visual FoxPro中实现查询有两种途径:一是用相关命令或查询工具,二是用SQL标准查询语言。

2.1 用Visual FoxPro中的相关命令或查询工具

在Visual FoxPro中,可以使用LIST/DISPLAY、FIND、SEEK、LOCATE、FILTER等命令查询数据。但这些命令受到一定操作的限制,如必须打开相关的数据表、对表建立索引、速度慢等。

自从Visual FoxPro中引入SQL语言后,用SQL数据操纵语言中的SELECT命令进行查询,不仅方便编程,还能提高数据处理速度。

SELECT命令可以在命令窗口直接输入,也可以编写在程序中。但是,使用者一般不可能对每个表的字段信息及相互关系非常清楚,要翻阅相应资料才能写出相应的SELECT语句,另外,较长的SELECT语句不容易编写。为此,Visual FoxPro提供了可视化设计SELECT命令的查询工具,即查询设计器。查询设计器实际上是SELECT命令的交互式设计操作,它以页面形式提供了完整的SELECT命令格式,使用者不必关心字段信息,只要通过选择所需的内容就可以轻松完成查询。

2.2 SQL标准查询语言

SELECT命令格式:

SELECT [ALL|DISTINCT] 选项 [AS 显示列名] FROM 表名或视图名;

[WHERE 条件表达式];

[GROUP BY 分组选项 [HAVING筛选条件表达式]];

[ORDER BY 排序选项] [ ASC|DESCI ] [2]

该语句中,SELECT指定查询中显示的字段、常量和表达式,FROM指定查询所用表或视图的名称,WHERE指定查询条件,GROUP BY根据某一列和某几列的值将查询结果中的各行进行分组,HAVING指定包含在查询结果中的组必须满足的条件,ORDER BY根据某一列和某几列的数据查询结果进行排序。

3 SELECT在Visual FoxPro中存在的问题及解决方法

在Visual FoxPro中,使用SELECT语句可以对数据进行分组查询并计算,简单分组得到的查询结果不能令人满意,要想得到精确的查询结果需要设计复杂的分组。下面举例介绍分组查询在Visual FoxPro中的问题及解决方法。

3.1 同一SELECT语句在不同Visual FoxPro版本中的查询执行

有如图2所示的xsda数据表。

分别求各专业男、女生的score总和,SELECT语句如下:

SELECT speciality,sex,sum(score) from xsda GROUP BY speciality

该语句在Visual FoxPro6及Visual FoxPro7中执行结果如图3所示。

在Visual FoxPro6及Visual FoxPro7中能执行该查询语句并得到正确的统计结果,而在Visual FoxPro8中执行此查询命令会出现“SQL:GROUP BY clause is missing or invalid”的提示,这是因为Visual FoxPro8中的SELECT语句采用SQL语言标准,即GROUP BY后的分组字段必须与SELECT后的输出字段一致或多于其后的字段,如果SELECT后需要出现其它字段,必须使用聚合函数。而Visual FoxPro6将此做了隐藏处理,即查询输出不受分组字段限制。

为了让Visual FoxPro8及其以上版本与老版本兼容,在执行SQL SELECT查询命令前,可以用函数SYS(3099,70)或者SET ENGINEBEHAVIOR 70命令将Visual FoxPro8转换为Visual FoxPro7,否则就要注意SELECT命令必须符合Visual FoxPro8的语句规则。

3.2 非分组字段与字段函数同时作为选项列表出现的错误及解决方法

SUM ()、AVG ()、COUNT()、MAX()和MIN()等聚合函数使SQL统计功能更加强大,同时也增加了编写SELECT语句的难度,尤其对初学者更难掌握。

有如图4所示的elective表。

如果要查找每个同学最近一次选修课程的情况,一般会写出如下的SQL语句:

SELECT code,coursecode,coursename,max(date) from elective GROUP BY code

该SELECT查询结果如图5所示。

由查询结果看出,查询所得的code并不一定是对应具有最近选课日期的那一条记录,如学号为2000130101的学生应该在2007年选修1号课程“computer”,而查询的结果是选修了2号课程“datastructur”。要想得到正确的结果,应用SELECT嵌套实现。命令如下:

SELECT code,coursecode,coursename,date from elective where code+DTOC(date) in;(SELECT code+DTOC(MAX(date)) FROM elective GROUP BY code)

SELECT查询结果如图6所示。

4 结束语

SQL强大的功能,极大地丰富了Visual FoxPro的数据处理能力,特别是SELECT语句在其中的应用为Visual FoxPro增色不少。由于SELECT语句灵活多变,要想得到精确的查询结果,必须设计正确的SQL SELECT查询,否则会出现不符合实际数据的信息。

参考文献:

[1] 翁正科.Visual FoxPro8数据库开发教程[M].北京:清华大学出版社,2004:171-172.

[2] 李红,张雪凤,尹征杰.数据库原理及应用[M].北京:高等教育出版社,2003:100.

[3] 赵晓侠,郑发鸿,田春瑾,等.Visual FoxPro8.0数据库程序设计[M].2版.北京:铁道出版社,2009:110.

sql语言篇6

关键词:VisualFoxPro 教学 重点 方法

VisualFoxPro 是一款由微软(Microsoft)主创开发的一款数据库软件,而且作为灵巧型的数据库的典型代表,其支持面向字符式数据库转向面向对象的风格。如今,在许多专、本科院校对此课程有相对较高的重视度。这门课程的主要教学目标不仅要教会学生如何熟练地管理和操作数据库,更要学生对数据库的交互式操作理解透彻。

一、把握数据库的关系化思想

关系型数据库是建立数据库的最基本也是最重要的思想,其主要的目标就是将库中的所有数据集合关系化。众所周知,数据库是由一系列的数据表组成的,而表与表之间的关系能够很好地构建数据库的模式,这是我们能够形象、具体地使用数据库的根本所在,而且也是我们更便利、快捷地获取数据的条件。

如何规范地设计一个关系型数据库,这是我们教学过程中的重点也是难点。关系型数据库的设计一般遵循三大范式。

第一范式(1NF):是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。在第一范式(1NF)中表的每一行只包含一个实例的信息。

第二范式(2NF):(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。为实现区分,通常需要为表加上一个可以唯一标识的列,该列在一般情况下是整型的自动增长列,可唯一标识。

第三范式(3NF):满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其他表中已包含的非主关键字信息。

二、注重SQL语言的基础教学

SQL已经成为数据库领域中的主流语言。那么,如何精确地讲授SQL语言是最基本的,也是最主要的要求。而初学者在学习SQL语言的过程中往往会出现逻辑不清的状况,其主要的原因是对SQL的阅读和书写能力不足,并且,学生在学习的过程中没有形成良好的SQL编码风格,因此,笔者对SQL语言的学习有以下几点看法。

1.基本语法的教学

数据库的四大基本操作,增(insert)、删(delete)、改(update)、查(select)是对SQL数据库进行操作的基本语句,但通常在这些操作的学习中会出现很多问题,例如:要分清楚子查询和连接查询用法的异同点,子查询在查询表与表之间有联系的信息时必须是外键表中仅有唯一一条记录与主键表相对应,而连接查询能够避免这样的问题。

2.注重良好的编写风格

规范化是清晰编写SQL关键所在。SQL作为一种语言与其他的一些编程语言(如,C,C++,delphi等)有相似之处,很注重逻辑能力。初学者在学习中往往抱着以往“死读书,读死书”的心态,对很多的逻辑混淆不清,这样就不能写出合理的SQL语句。因此笔者通过多年的教学经验对SQL语言的书写方式有以下几点经验。

(1)SQL语言有一点显著的特点就是不对大小写进行区分。在SQL语句的书写时,对表名、列名、视图名等应该进行有效地区分,这样能够保证我们写的语句能够思路清晰,易读。

(2)注释是形成写好SQL语句基础的良好习惯。通常情况下,在大的项目中,我们所书写的SQL代码不是只要求我们自己能看懂而已,而且要使他的开发人员也能很迅速地理解所写SQL的内容,这样就要求我们在书写SQL的同时,写出必要的注释信息。这样在以后阅读难懂晦涩的语句时,我们就能够回忆起原来的编码思路。

三、VisualFoxPro教学方法和建议

实践是掌握知识的最有利的方式,注重实践教学是学生掌握知识的重要途径。笔者认为,学生对VisualFoxPro掌握程度对开设实验课程质量关系重大,因此,要把握选什么样的课题、用什么方式来监督学生的学习、怎么检验学生的实践成果等教学思路。与此同时,学校不断地改革创新教学体系,不断探索合理的、有效率的实践方式。

在教学过程中,我们不仅要鼓励学生多动手,也要鼓励他们多思考。老师可以提出一些比较深层次的问题让学生自己解决,学生也可以跟老师探讨一些感兴趣的问题,形成良好的师生互动,这样能够帮助学生更好地理解这个工具的使用功能。

四、结论

笔者针对数据库原理及应用教学中的所包含的重点与难点等问题,结合教学实践过程中所应注意的方式和方法,以提高教学质量为出发点,对教学内容、教学方法、教学手段等环节进行探讨,并提出了一些教学建议,以期对 VisualFoxPro及应用课程的教学和实践有所帮助。

sql语言篇7

关键词 Solaris,Oracle,PRO*C,OCI

1引言

数据库在软件开发中的应用越来越广泛,其中,Oracle可说是性能最强大、最稳定的数据库之一,大量的软件开发选择了Oracle。在开发语言的选择上,C语言以其灵活、高效吸引了大批的软件开发人员。这两者的强强联合也必具有较高的性能,在实际中有广泛的应用。这就是PRO*C和OCI程序设计。

Oracle常常应用在服务器中,Solaris又是服务器的首选平台,因此,本文主要介绍PRO*C和OCI程序设计在Solaris平台上的应用和实现,对在Windows平台和Linux平台上的应用和实现也可作为参考。本文所采用的开发环境为Solaris2.8、Oracle8.1.7。

2 PRO*C程序设计

PRO*C是Oracle提供的应用程序专用开发工具,它以C语言为宿主语言,能在C程序中嵌入SQL语句,进行数据库操作。这种嵌入式的SQL语句容易掌握,适合初学者。

2.1设置开发环境

(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目录下。

2.2开发PRO*C程序

(1)说明SQL通讯区

SQL通讯区用来记录执行每一个嵌入SQL语句的状态信息,通过在函数体外使用下列语句实现:

#include 或者 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选项,它要求关闭所有打开的游标,之后断开与数据库服务器的连接。

2.3生成可执行文件

在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文件就是我们的可执行文件。

3 OCI程序设计

OCI(Oracle Call Interface)是由头文件和库函数等组成的一套Oracle数据库应用程序编程接口工具,OCI程序实质上就是用高级语言写的程序,其特点是内部含有对OCI子函数库的调用。

OCI程序对开发环境的要求相对较低,只要有C语言的OCI开发工具包和C编译器就可以,程序设计相比PRO*C复杂了点。

3.1创建和初始化OCI环境

首先要在源程序中包含OCI头文件:#include

OCI环境即OCI函数的工作环境,在调用其他函数之前必须先调用OCIInitialize()和OCIEnvInit()函数创建和初始化OCI环境,其他OCI函数要在这个环境中才能执行。

先定义变量:OCIEnv **m_envhp;

OCIError *m_errhp;

OCIServer *m_srvhp;

OCISvcCtx *m_svchp;

OCIStmt *m_stmthp;

OCIInitialize((ub4) OCI_DEFAULT, (dvoid *)0, (dvoid * (*)(dvoid *, size_t)) 0,

(dvoid * (*)(dvoid *, dvoid *, size_t))0, (void (*)(dvoid *, dvoid *)) 0 );

OCIEnvInit((OCIEnv **)&m_envhp, OCI_DEFAULT, (size_t) 0, (dvoid **) 0 );

其中m_envhp为输出参数,是一个指向OCI环境句柄的指针,OCI_DEFAULT 是OCI环境的初始化模式。OCIEnvInit()函数中的size_t类型变量为分配给用户的内存数量,dvoid **类型变量指向用户的内存区域,该区域的大小等于size_t类型变量。

OCI函数中,大量使用OCI定义的数据类型和宏,其定义可参考$ORACLE_HOME/rdbms/demo目录下的oci.h头文件。

3.2申请句柄

句柄是指向OCI库所分配的内存区域的指针,该内存区域中的数据由OCI库维护,应用程序可通过句柄访问其中的数据。下面是应用程序中最常用的几个句柄:

OCIHandleAlloc( (dvoid *)m_envhp, (dvoid **)&m_errhp, OCI_HTYPE_ERROR,

(size_t) 0, (dvoid **) 0);

OCIHandleAlloc( (dvoid *)m_envhp, (dvoid **)&m_srvhp, OCI_HTYPE_SERVER,

(size_t) 0, (dvoid **) 0);

OCIHandleAlloc( (dvoid *)m_envhp, (dvoid **)&m_svchp, OCI_HTYPE_SVCCTX,

(size_t) 0, (dvoid **) 0);

OCIHandleAlloc( (dvoid *)m_envhp, (dvoid **)&m_stmthp, OCI_HTYPE_STMT,

(size_t) 0, (dvoid **)0);

其中m_errhp为新申请的句柄,m_envhp为它的父环境句柄,OCI_HTYPE_ERROR为句柄类型,表示这是一个错误报告句柄,OCI_HTYPE_SERVER表示服务器句柄,OCI_HTYPE_SVCCTX表示服务环境句柄,OCI_HTYPE_STMT表示语句句柄。

存储在句柄中的数据称为句柄属性,所有OCI句柄都具有属性,可以调用OCIAttrGet()和OCIAttrSet()函数来读取、设置句柄属性。

3.3连接服务器建立会话

首先调用OCIServerAttach(m_srvhp, m_errhp, (text *)"", strlen(""), OCI_DEFAULT);函数建立与指定服务器的连接,text *类型变量为空,表示连接默认数据库服务,OCI_DEFAULT表示应用程序的操作模式为阻塞模式,在这种方式下,只有当OCI调用完成后才将控制权返回给客户端应用程序。

然后调用OCILogon(m_envhp, m_errhp, &m_svchp, (text*)m_szUser,strlen(m_szUser),

(text*)m_szPassword, strlen(m_szPassword), (text*)m_szDbName, strlen(m_szDbName));建立数据库会话。此函数隐含申请服务器句柄和用户会话句柄,登录后,句柄是只读的,不能再设置句柄属性。

3.4执行SQL语句并处理数据

将要执行的SQL语句copy到szSqlStr字符串中,snprintf( szSqlStr, sizeof(szSqlStr), "select PASSWORD from USERS where USERNAME=’chen’ ");

执行下列语句:

OCIStmtPrepare(m_stmthp, m_errhp, (text*)szSqlStr, (ub4) strlen(szSqlStr),

(ub4) OCI_NTV_SYNTAX, (ub4)OCI_DEFAULT);

//准备SQL语句

OCIDefine *defnp0 = (OCIDefine *) 0;

//定义输出变量

OCIDefineByPos( m_stmthp, &defnp0, m_errhp, 1, (dvoid *)szUSERNAME, 100, SQLT_STR,

(dvoid *) 0, (ub2 *)0, (ub2 *)0, OCI_DEFAULT);

//绑定变量

OCIStmtExecute( m_svchp, m_stmthp, m_errhp, (ub4) 1, (ub4) 0, (OCISnapshot *) NULL,

(OCISnapshot *) NULL, (ub4) OCI_DEFAULT);

//执行SQL语句

3.5结束会话断开数据库连接

OCILogoff( m_svchp, m_errhp );

3.6断开与数据源的连接,释放句柄

OCIServerDetach( m_srvhp, m_errhp, OCI_DEFAULT );

//断开与数据源的连接

OCIHandleFree((dvoid *) m_stmthp, OCI_HTYPE_STMT);

//释放句柄

OCIHandleFree((dvoid *) m_svchp, OCI_HTYPE_SVCCTX);

OCIHandleFree((dvoid *) m_srvhp, OCI_HTYPE_SERVER);

OCIHandleFree((dvoid *) m_errhp, OCI_HTYPE_ERROR)

3.7生成可执行文件(两种方法)

(1)同普通的C程序:

#gcc -o exampled –I. –I$(ORACLE_HOME)/precomp/public example.c

(2)利用Oracle自带的Make文件:

首先将$ORACLE_HOME/rdbms/demo/demo_rdbms.mk文件copy到OCI源程序所在的目录,将源文件编译为目标文件:#gcc –c example.o -I$(ORACLE_HOME)/rdbms/demo

-I$(ORACLE_HOME)/network/public -I$(ORACLE_HOME)/rdbms/public/ example.c

然后用命令:#make -f demo_rdbms.mk build OBJS=example.o EXE=exampled,exampled就为生成的可执行文件。

4 二者的比较

PRO*C程序的最大优点是简单易学,另外,因为PRO*C程序是把SQL语句翻译成相应的Oracle库函数调用,因此大大提高了应用程序的执行速度。

OCI程序使开发人员能使用已熟悉的C语言编程技术,通过Oracle的OCI函数调用快速开发应用程序,能充分发挥C语言的特点,使开发人员对程序设计和运行控制更加灵活,开发的应用程序具有更强的数据处理能力和更大的灵活性。

5 结束语

文章从开发环境、开发流程、编译三个方面分别详细分析了PRO*C和OCI程序设计的方法,并对两者的性能进行了比较。希望能为广大的计算机技术工作者提供参考。由于OCI程序设计相对复杂,以上所述仅是用来实现基本的数据库操作,若要实现更复杂的应用,需要做大量的实践操作,积累经验。文中举例的程序,都是在实际中编译通过了的,更有说服力。

参考文献

[1]袁鹏飞著.Oracle数据库8i高级应用开发技术,人民邮电出版社,2000.7

[2]oradb.net/book.htm/Oracle ProC程序设计

[3] pgsqldb.org/pgsqldoc-cvs/index.html

sql语言篇8

[关键词] Java Excel SQL Server JDBC-ODBC 电子商务 数据库

一、引言

电子商务是在因特网开放的网络环境下,基于浏览器/服务器应用方式,实现消费者的网上购物、商户之间的网上交易和在线电子支付的一种新型的商业运营模式。有关电子商务的信息大都存储在数据库中。早期数据库可能选择Excel或者Access,现在选择SQL Server和Oracle。如果重新构造数据库会有很大的开销,而数据库转换可以节省开销。本文详细论述基于Java平台从Excel转换到SQL Server的方法。

二、Excel和SQL Server

Excel 是微软办公套装软件的一个重要的组成部分,它可以进行各种数据的处理、统计分析和辅助决策操作,广泛地应用于管理、统计财经、金融等众多领域,具有强大的制作表格和图表功能,还具有关系数据库的某些管理功能。但在一些专用的软件中,Excel生成的报表质量较差,难以达到用户的要求,可以将Excel中的数据转换到SQL Server数据库中以满足用户要求。

SQL Server是微软推出的中小型网络数据库系统,是目前最常用的数据库系统之一。随着SQL Server网络数据库应用程序日益增多,这种Web数据库应用系统的正常运行一般依赖于已存在的用户数据库。

本文以Excel 2000和SQL Server 2000为例介绍从数据从Excel转换到SQL Server。

三、使用Java语言访问数据库

转换工作需要应用程序来完成,编写应用程序的语言我们选择Java。Java是一种跨平台的程序设计语言,非常适合于企业网络和Internet环境。

Java本身不能直接访问Excel,要想操作Excel中的数据必须使用Java Excel API,通过它Java开发人员可以读取Excel文件的内容、创建新的Excel文件、更新已经存在的Excel文件。使用该API非Windows操作系统也可以通过纯Java应用来处理Excel数据表。

Java可以通过JDBC访问SQL Server数据库。JDBC定义了一个底层的API,用来支持独立于任何特定SQL实现的基本SQL功能。有了JDBC,可向各种关系数据库发送SQL语句。在JDBC技术中,程序员使用JDBC API将标准的SQL语句通过JDBC驱动管理器传递给相应的JDBC驱动,并由该JDBC驱动传给所指定的数据库服务器,这样就不必为访问不同数据库而分别编写不同的接口程序。JDBC驱动有四种类型,它们分别是:JDBC-ODBC桥、本地API部分Java驱动、网络协议完全Java驱动、本地协议完全Java驱动。本文选择使用JDBC-ODBC桥驱动访问SQL Server数据库。步骤如下:

1.加载JDBC驱动程序

2.建立数据库连接

3.执行SQL语句

4.处理结果集

5.关闭数据库连接

四、实例

将存储在Excel文件“users.xls”中sheet1中的用户信息转换到SQL Server 2000数据库“business.mdb”中的users数据表。

Excel的工作表Sheet由行和列组成,行对应数据库表中的一条条记录,列对应数据库表中的字段。建立好一一对应的关系,实现数据库的转换就是完全可行的。步骤如下:

1.根据Excel中工作表的第一行的各字段名在SQL Server 2000中建立相应结构的数据表,要注意各字段的名称、类型、长度和是否为空的值。

2.通过“控制面板”——“管理工具”——“数据源ODBC”,创建一个名为“business”的“用户DSN”,连接到“business.mdb”数据库;

3.通过Java Excel API读取Excel工作表中的所有记录,将这些记录存储在col[][]二维字符串数组中,不管是什么数据类型,都需要变为字符串;然后再关闭与Excel的连接;

4.利用JDBC-ODBC桥建立与“business.mdb”数据库的连接,执行插入记录的SQL语句,将col[][]中对应的一行行数据插入到“users”数据表中,这时,需要将数据类型不为字符串的数据恢复到原来的数据类型。(限于篇幅代码从略)

五、结语

上一篇:肢体语言范文 下一篇:易语言范文