1. 简介 Introduction
这一章向我们介绍Pro*C/C++预编译器(Pro*C/C++ Precompiler)。我们将会看到它在开
发操作Oracle数据的应用程序中的角色并且看到它支持我们的应用程序做些什么。这章包括如下主题:
· 什么是Oracle预编译器 What is an Oracle Precompiler?
· 为什么使用Oracle Pro*C/C++预编译器 Why Use the Oracle Pro*C/C++ Precompiler
· 为什么使用SQL Why Use SQL
· 为什么使用PL/SQL Why Use PL/SQL
· Pro*C/C++预编译器的好处 Pro*C/C++ Precompiler Benefis
· 常见问题 Frequently Asked Questions
1.1 什么是Oracle预编译器 Whatis an Oracle Precompiler?
Oracle预编译器是一个能够使用户将SQL语句嵌入到一个高级语言的源代码程序中的编
程工具。如图1-1所示,预编译接受源程序为输入,将其中的嵌入式的SQL语句翻译成标准Oracle运行时库的调用,并且生成一个修改后的源程序,我们可以用正常的方式来编译、链接和执行该修改后的源程序。
如下图1-1所示
1.2 为什么使用Oracle Pro*C/C++预编译器 Why Use the Oracle Pro*C/C++ Precompiler
Oracle Pro*C/C++预编译器使我们能够在我们的应用程序中使用强大而又灵活的SQL语句,是一个方便灵活的使我们的应用程序对Oracle直接进行访问的接口。
与许多应用程序开发工具不同的是,Pro*C/C++可以使我们创建高度定制化的应用程序。例如,我们可以创建使用了最新的窗口和鼠标技术的用户界面。我们也可以创建不需要用户交互的运行在后台的应用程序。
此外,Pro*C/C++使我们能够对我们的应用程序进行精细化的控制。它允许对资源使用、SQL语句执行以及不同的运行时指示器的精细控制。根据这些信息,我们可以通过修改一些程序参数来获得最佳性能。
尽管预编译对应用程序开发增加了一个步骤,但是它节省了时间。预编译器将各个嵌入式SQL语句转化成对Oracle运行时库(SQLLIB)的调用。Pro*C/C++预编译器也分析宿主变量,定义结构体到字段的映射并且通过SQLCHECK=FULL来对嵌入式SQL语句进行语义分析。
1.3 为什么使用SQL WhyUse SQL
如果我们想要访问和操作Oracle数据,我们就需要SQL。不论我们是通过SQL*Plus来交互式地使用SQL或者将其嵌入到一个应用程序中。如果任务需要C或者C++的过程处理能力,我们就需要使用嵌入式SQL。
SQL因其灵活性、功能强和易于学习的特性,其已成为数据库语言的首选。SQL是非过程性的语言,它让我们指明我们想要完成什么工作但是并没有指明如何完成该工作。SQL中有些类似于英语的语句使其易于在一个时刻操作单行或者多行Oracle数据。
我们可以在一个应用程序中执行任何SQL语句(不是SQL*Plus语句)。例如,我们可以
· 动态地创建、修改和删除数据库表 CREATE, ALTER and DROP databasetables dynamically
· 查询、插入、修改和删除多行数据 SELECT, INSERT, UPDATE and DELETE rows of dta
· 提交或者回滚事务 COMMIT or ROLLBACK transactions
在我们将SQL语句嵌入到一个应用程序前,我们可以使用SQL*Plus来交互地测试它们,
将交互式的SQL语句改为嵌入式的SQL语句只需要一点点改变。
1.4 为什么使用PL/SQL Why Use PL/SQL
PL/SQL是SQL的扩展,是一个支持过程结构、变量声明和错误处理的事务处理语言。在一个PL/SQL块中,我们可以使用SQL以及所有的PL/SQL扩展。
嵌入式PL/SQL的主要优势是更好的性能。与SQL不同,PL/SQL提供了将SQL语句逻辑地组合在一起的能力并且将其整块地传输给Oracle而不是一个接一个地进行传输。这样就减小了网络开销和处理开销。
1.5 Pro*C/C++预编译器的好处 Pro*C/C++ Precompiler Benefis
如图1-2所示,Pro*C/C++有着有助于我们开发高效、可靠程序的许多特点和好处。
图 1-2 Pro*C/C++的特点和好处
Pro*C/C++支持:
· 用C或者C++来写程序 Writing application in C or C++
· 遵循ANSI/ISO的将SQL语句嵌入到高级语言中的标准 Following the ANSI/ISO standardsfor embedding SQL statements in a high-level language
· 具有动态SQL的好处,一个使我们的程序能够在运行时接收任何有效的SQL语句的技术 Taking advantage of dynamic SQL,an advanced programming technique that lets your Program accept or build anyvalid SQL statement at runtime.
· 设计和开发高度定制化的应用程序 Designing and developing highlycustomized applictions
· 编写共享服务器进程的应用程序 Writing shared server processapplications
· 在Oracle内部数据类型和高级语言数据类型间进行自动转换 Automatically convertingbetween Oracle internal datatypes and high-level language datatypes
· 通过将PL/SQL块嵌入到我们的应用程序之中提升了性能 Improved performance by embedding PL/SQLtransaction processing blocks in your application program
· 内联地指定有用的预编译器选项以及在命令行上并且在预编译过程改变它们的值 Specifying useful precompileroptions inline and on the command line and change their values duringprecompilation
· 数据类型等价功能能够控制Oracle对输入数据的解释并且格式化输出的数据 The use of datatype equivalencing tocontrol the way Oracle interprets input data and formats output data
· 单独地对多个程序进行预编译,然后将它们链接成一个可执行程序 Separately precompiling severalprogram modules, then link then into one executable Program.
· 对嵌入式数据操作SQL语句和PL/SQL语句块的语法和语义进行完整检查 Complete checking of the syntax andsemantics of embedded SQL data manipulation statements and PL/SQL blocks
· 通过使用Oracle Net在多个节点上对Oracle数据库进行并发访问 Concurrent access to Oracledatabases on multiple nodes using Oracle Net
· 使用数组作为输入和输出程序变量The use of arrays as input andoutput program variables
· 对我们的宿主程序中的代码块按照条件进行预编译以使其能够运行在不同的环境中Conditionally precompilingsections of code in your host program so that it can run in differentenvironment
· Direct interface with SQL*Forms through the use of user exist written ina high-level language
· 通过SQL通讯区(SQLCA)和WHENEVER或者DO语句来处理错误和警告Handingerrors and warnings with the SQL Communication Area (SQLCA) and the WHENEVER orDO statement.
· 使用了Oracle通讯区提供的增强的诊断信息结婚The use of an enhanced set of diagnosticsprovided by the Oracle Communications Area(ORACA)
· 可以使用用户在数据库中定义的对象类型Working with user-defined objecttypes in the database
· The user of collections (varrays and nested tables) in the database
· 可以使用数据库中的大对象(LOB)The use of LOBs (LargeObjects) in the database
· The use of National Character Set data stored in the database
· 可以在我们的程序中使用OCI函数 Theuse of OCI (Oracle Call Interface) functions in your program
Pro*C/C++是支持嵌入式SQL编程的一个全功能工具。