PARTVI-Oracle数据库管理与开发-数据库开发人员的概念
19. 数据库开发人员的概念
19.1. 数据库开发人员的职责
Oracle开发者负责创建或维护使用Oracle技术栈的应用程序的数据库组件。Oracle开发者要么开发新应用程序,要么将现有应用程序转换为在Oracle数据库环境中运行。因此,开发者与数据库管理员紧密合作,共享知识和信息。Oracle数据库开发者可以预期将参与以下任务:
■ 实施应用程序所需的数据模型
■ 创建模式对象并实施数据完整性规则
■ 为新开发项目选择编程环境
■ 编写使用SQL语句的服务器端PL/SQL或Java子程序和客户端过程代码
■ 使用选定的开发工具创建应用程序接口
■ 建立全球化支持环境,用于开发全球化应用程序
■ 在不同数据库中实例化应用程序,用于开发、测试、教育和生产环境部署
上述任务以及许多其他任务,在《Oracle Database 2 Day Developer's Guide》和《Oracle Database Advanced Application Developer's Guide》中有详细描述。
19.2. 数据库开发人员的主题
19.2.1. 应用程序设计和调优的原则
Oracle开发者必须设计、创建和调整数据库应用程序,以实现安全和性能目标。以下应用程序设计和调整原则是有用的指导方针:
■ 了解Oracle数据库的工作原理
作为开发者,您希望在最短的时间内针对Oracle数据库开发应用程序,这需要利用数据库架构和特性。例如,不了解Oracle数据库的并发控制和多版本读取一致性可能会导致应用程序破坏数据的完整性,运行缓慢,并降低可扩展性(见第9-1页的“数据并发性和一致性介绍”)。
■ 使用绑定变量
当查询使用绑定变量时,数据库可以一次性编译它并将查询计划存储在共享池中。如果再次执行相同的语句,数据库可以执行软解析并重用计划。相比之下,硬解析需要更长的时间并且使用更多资源(见第7-16页的“SQL解析”)。使用绑定变量以允许软解析是非常高效的,也是数据库希望开发者工作的方式。
■ 在服务器而不是客户端实现完整性约束
使用主键和外键可以使得数据在多个应用程序中被重用。在客户端编码规则意味着其他客户端在对数据库运行时无法访问这些规则(见第5-1页的“完整性约束的优势”)。
■ 构建具有代表性数据和会话活动的测试环境
模拟您的实时生产环境的测试环境提供了多种好处。例如,您可以对应用程序进行基准测试以确保它能够很好地扩展和运行。此外,您可以使用测试环境来衡量数据库变更对性能的影响,并确保升级和补丁正确工作。
■ 设计数据模型以实现良好的性能为目标
通常,尝试使用通用数据模型会导致性能不佳。一个设计良好的数据模型尽可能高效地回答最常见的查询。例如,数据模型应该使用提供最佳性能的索引类型。部署后的调整是不可取的,因为逻辑和物理结构的变更可能很困难或不可能。
■ 明确性能目标并保留指标的历史记录
开发的一个重要方面是确切地确定应用程序预期的性能和扩展方式。例如,您应该使用包括预期用户负载、每秒事务数、可接受的响应时间等指标。良好实践规定您维护性能指标的历史记录。通过这种方式,您可以主动和反应性地监控性能(见第18-20页的“性能诊断和调整”)。
■ 给应用程序代码添加仪器
良好的开发实践包括在您的应用程序中添加调试代码。生成跟踪文件的能力对于调试和诊断性能问题非常有用。
19.2.2. 客户端数据库编程
如第8章“服务器端编程:PL/SQL和Java”所解释的,有两种基本技术使得过程化数据库应用程序能够使用SQL:使用PL/SQL和Java的服务器端编程,以及使用预编译器和API的客户端编程。本节提供了客户端数据库编程的简要概述。
19.2.2.1. 嵌入式SQL
历史上,客户端/服务器程序使用嵌入式SQL与数据库进行交互。本节解释了使用嵌入式SQL的选项。
Oracle预编译器
客户端/服务器程序通常使用预编译器编写,预编译器是允许您在高级程序中嵌入SQL语句的编程工具。例如,Oracle Pro*C/C++预编译器使您能够在C或C++源文件中嵌入SQL语句。Oracle还为COBOL和FORTRAN提供了预编译器。
预编译器提供了多个好处,包括以下几点:
■ 提高生产力,因为您通常编写的代码比等效的OCI应用程序少
■ 使您能够创建高度定制的应用程序
■ 允许密切监控资源使用情况、SQL语句执行和各种运行时指标
■ 节省时间,因为预编译器(而不是您)将每个嵌入式SQL语句翻译成对Oracle数据库运行时库的调用
■ 使用对象类型转换器将Oracle数据库对象类型和集合映射成C数据类型,以在Pro*C/C++应用程序中使用
■ 提供编译时对象类型和集合的类型检查以及从数据库类型到C数据类型的自动类型转换
包含SQL语句的客户端应用程序是宿主程序。这个程序是用宿主语言编写的。在宿主程序中,您可以将完整的SQL语句与完整的C语句混合使用,并在SQL语句中使用C变量或结构。当嵌入SQL语句时,您必须以关键词EXEC SQL开始并以分号结束。Pro*C/C++将EXEC SQL语句翻译成对运行时库SQLLIB的调用。
许多嵌入式SQL语句与它们的交互式对应物不同,只是通过添加新的子句或使用程序变量。以下示例比较了交互式和嵌入式ROLLBACK语句:
ROLLBACK; -- interactive
EXEC SQL ROLLBACK; -- embedded
这些语句具有相同的效果,但您会在交互式SQL环境中(如SQL Developer)使用第一个,而在Pro*C/C++程序中使用第二个。
预编译器接受宿主程序作为输入,将嵌入式SQL语句翻译成标准数据库运行时库调用,并生成一个源程序,您可以像通常一样编译、链接和运行这个程序。图19-2说明了使用预编译器开发程序的典型步骤。
SQLJ
SQLJ是ANSI SQL-1999标准,用于在Java源代码中嵌入SQL语句。SQLJ为从Java进行客户端SQL数据访问提供了一种比Java数据库连接(JDBC)API更简单的替代方案。
SQLJ接口是Pro*接口的Java等效物。您可以在Java源代码中插入SQL语句。之后,您将Java源文件提交给SQLJ翻译器,该翻译器将嵌入式SQL翻译成纯基于JDBC的Java代码。
19.2.2.2. 客户端API
大多数开发者现在使用API在他们的数据库应用程序中嵌入SQL。例如,两个流行的API,用于启用程序与Oracle数据库通信的是开放数据库连接(ODBC)和JDBC。Oracle调用接口(OCI)和Oracle C++调用接口(OCCI)是客户端编程的另外两个常见API。
OCI和OCCI
作为预编译器的替代品,Oracle提供了OCI和OCCI API。OCI允许您使用C等宿主编程语言在数据库中操作数据和模式。OCCI是一个面向对象的接口,适合与C++一起使用。这两个API都使开发者能够使用本地子程序调用访问Oracle数据库并控制SQL执行。
在某些情况下,OCI提供了比高级接口更好的性能或更多功能。OCI和OCCI提供了许多特性,包括但不限于:
■ 支持通过Oracle数据库提供的所有SQL DDL、DML、查询和事务控制设施
■ 即时客户端,一种在磁盘空间成问题时部署应用程序的方法
■ 线程管理、连接池、全球化功能,以及直接从C应用程序加载数据
OCI和OCCI提供了一个标准数据库访问和检索函数库,以动态运行时库(OCILIB)的形式存在。这个库可以在应用程序运行时链接。因此,您可以像非数据库应用程序一样编译和链接OCI或OCCI程序,避免了单独的预处理或预编译步骤。图19-3说明了开发过程。
ODBC和JDBC
ODBC是一个标准API,使应用程序能够连接到数据库,然后准备和运行SQL语句。ODBC独立于编程语言、数据库和操作系统。ODBC的目标是使任何应用程序都能够访问任何数据库中的数据。
数据库驱动程序是位于应用程序和数据库之间的软件。驱动程序将应用程序发出的API调用转换为数据库可以处理的命令。通过使用ODBC驱动程序,应用程序可以访问任何数据源,包括存储在电子表格中的数据。ODBC驱动程序执行ODBC标准和数据库之间的所有映射。
Oracle提供的Oracle ODBC驱动程序使符合ODBC标准的应用程序能够访问Oracle数据库。例如,用Visual Basic编写的应用程序可以使用ODBC查询和更新Oracle数据库中的表。
JDBC是一个低级Java接口,使Java应用程序能够与Oracle数据库交互。像ODBC一样,JDBC是一个厂商独立的API。JDBC标准由Sun Microsystems定义,并通过java.sql接口实现。
JDBC标准使各个提供商能够实现并扩展他们自己的JDBC驱动程序。Oracle为客户端编程提供了以下JDBC驱动程序:
■ JDBC薄驱动程序
这个纯Java驱动程序驻留在客户端,无需Oracle客户端安装。它与平台无关,适用于小程序和应用程序。
■ JDBC OCI驱动程序
这个驱动程序驻留在有Oracle客户端安装的客户端。它仅适用于应用程序。JDBC OCI驱动程序是用C和Java编写的,将JDBC调用转换为OCI调用。
以下代码片段来自一个使用JDBC OCI驱动程序创建Statement对象并查询dual表的Java程序:
// Create a statement Statement stmt = conn.createStatement();
// Query dual table ResultSet rset = stmt.executeQuery("SELECT 'Hello World' FROM DUAL");
19.2.3. 全球化支持
Oracle数据库的全球化支持使您能够以本地语言存储、处理和检索数据。因此,您可以开发多语言应用程序和软件,这些应用程序和软件可以同时从世界任何地方访问和运行。
编写全球化数据库应用程序的开发者必须做到以下几点:
■ 了解Oracle数据库全球化支持架构,包括不同字符集、地区、语言和语言排序定义的属性
■ 了解他们中间层编程环境的全球化功能,包括它如何与数据库的区域模型进行交互和同步
■ 设计和编写能够同时支持在不同操作系统上运行的多个客户端的代码,这些客户端具有不同的字符集和区域要求
例如,应用程序可能需要以本地用户的母语和区域设置偏好渲染用户界面内容和处理数据。例如,应用程序必须处理多字节的汉字数据,以适当的区域格式显示消息和日期,并处理7位ASCII数据,而不需要用户更改设置。
19.2.3.1. 全球化支持的环境
全球化支持环境包括客户端应用程序和数据库。您可以通过在客户端和服务器上设置参数和环境变量来控制依赖语言的操作,客户端和服务器可能位于不同的位置。
注意:在以前的版本中,Oracle将全球化支持功能称为国家语言支持(NLS)特性。NLS实际上是全球化支持的一个子集,提供了选择国家语言和在特定字符集中存储数据的能力。
Oracle数据库为以下全球化支持功能提供支持:
■ 本土语言和地区
■ 日期、时间、数字和货币的本地格式
■ 日历系统(公历、日本日历、皇历、泰国佛教日历等)
■ 多种字符集,包括Unicode
■ 字符语义
字符集全球化支持的一个关键组成部分是字符集,它是用于在计算机屏幕上显示字符的编码方案。在应用程序开发中,以下区分非常重要:
■ 数据库字符集决定了哪些语言可以在数据库中表示。字符集是在数据库创建时指定的。
注意:在数据库创建之后,更改其字符集通常在时间和资源上都非常昂贵。这个操作可能需要通过导出整个数据库并重新导入来转换所有字符数据。
■ 客户端字符集是客户端应用程序输入或显示的数据的字符集。客户端和数据库的字符集可以不同。
一组字符(例如,字母字符、表意文字、符号、标点符号和控制字符)可以编码为一个字符集。编码的字符集为集合中的每个字符分配一个唯一的数字代码,称为代码点或编码值。代码点在全球环境中很重要,因为可能需要在不同的字符集之间转换数据。
计算机行业使用许多编码字符集。这些集合在可用字符的数量、可供使用的字符、分配给每个字符的代码点等方面有所不同。Oracle数据库支持大多数国家、国际和供应商特定的编码字符集标准。
Oracle数据库支持以下类别的编码字符集:
■ 单字节字符集
每个字符占用一个字节。7位字符集的一个例子是US7ASCII。8位字符集的一个例子是WE8DEC。
■ 多字节字符集
每个字符占用多个字节。多字节集通常用于亚洲语言。
■ Unicode
通用编码字符集使您能够使用单一字符集存储任何语言的信息。无论平台、程序或语言如何,Unicode为每个字符提供唯一的代码值。
区域设置区域是系统或程序运行的语言和文化环境。NLS参数决定了客户端和数据库上特定区域的行为。数据库会话在代表客户端执行语句时使用NLS设置。例如,数据库会为客户正确使用千位分隔符。
通常,客户端主机上的NLS_LANG环境变量指定了服务器会话和客户端应用程序的区域。过程如下:
-
当客户端应用程序启动时,它会从环境设置初始化客户端NLS环境。
所有在本地执行的NLS操作,例如在Oracle Developer应用程序中显示格式化,都使用这些设置。 -
客户端在连接时将NLS_LANG定义的信息传达给数据库。
-
数据库会话根据客户端传达的设置初始化其NLS环境。如果客户端没有指定设置,则会话使用初始化参数文件中的设置。数据库仅在客户端未指定任何NLS设置时才使用初始化参数设置。如果客户端指定了一些NLS设置,则其余的NLS设置默认。
每个代表客户端应用程序启动的会话可能与其他会话在相同或不同的区域中运行。例如,一个会话可能使用德语区域,而另一个使用法语区域。此外,每个会话可能指定相同或不同的语言要求。
表19-1显示了两个客户端使用不同的NLS_LANG设置。用户在每个主机上启动SQL*Plus,以hr身份登录到同一个数据库,并同时运行相同的查询。由于浮点数的区域特定NLS设置,每个会话的结果不同。
19.2.3.2. Oracle全球化开发工具包(GDK)
Oracle全球化开发工具包(GDK)简化了开发过程,并降低了开发用于支持全球环境的互联网应用程序的成本。GDK包括了全面的编程API,既适用于Java也适用于PL/SQL,代码示例和文档解决了在创建全球应用程序时遇到的许多设计、开发和部署问题。GDK主要由两个部分组成:Java的GDK和PL/SQL的GDK。Java的GDK为Java应用程序提供全球化支持。PL/SQL的GDK为PL/SQL编程环境提供全球化支持。两部分提供的功能并不完全相同。
19.2.4. 非结构化数据
传统的关系模型处理的是适合放入简单表格中的简单结构化数据。Oracle数据库还提供了对非结构化数据的支持,这些数据不能被分解成标准组件。非结构化数据包括文本、图形图像、视频剪辑和声音波形。
Oracle数据库包括处理非结构化内容的数据类型。这些数据类型在数据库中以本地类型出现,并且可以使用SQL进行查询。
19.2.4.1. Oracle数据库中XML的概述
Oracle XML DB是一套与高性能XML存储和检索相关的Oracle数据库技术。XML DB通过以可互操作的方式包含SQL和XML数据模型,提供对原生XML的支持。Oracle XML DB适用于任何使用XML表示应用程序处理的全部或部分数据的Java或PL/SQL应用程序。例如,应用程序可能有大量的XML文档需要被摄取、生成、验证和搜索。Oracle XML DB提供了许多特性,包括:
■ 本机XMLType数据类型,它可以在数据库中表示XML文档,以便可以通过SQL访问
■ 支持XML标准,如XML Schema、XPath、XQuery、XSLT和DOM
■ XMLIndex,支持所有形式的XML数据,从高度结构化到完全非结构化
示例19-1创建了一个名为orders的XMLType类型的表。示例还创建了一个SQL目录对象,这是数据库中物理目录在主机计算机上的逻辑名称。这个目录包含XML文件。示例将purchaseOrder.xml文件中的XML内容插入到orders表中。
Oracle XML开发者工具包(XDK)包含了在文件系统或数据库中读取、操作、转换和查看XML文档所需的基本构建块。为Java、C和C++提供了API和工具。生产级别的Oracle XDK完全受支持,并附带商业再分发许可证。
19.2.4.2. LOB(Large Object)的概述
大型对象(LOB)数据类型使您能够在二进制或字符格式下存储和操作大块的非结构化数据。LOB提供了对数据的有效、随机、分段访问。
内部LOB
内部LOB将数据存储在数据库本身,而不是外部文件中。内部LOB包括以下类型:
■ CLOB(字符LOB),它以数据库字符集存储大量文本,如文本或XML文件
■ NCLOB(国家字符集LOB),它存储Unicode数据
■ BLOB(二进制LOB),它以比特流的形式存储大量的二进制信息,并且不受字符集转换的影响
数据库以不同于其他数据类型的方式存储LOB。创建LOB列隐式地创建了一个LOB段和一个LOB索引(见第12-21页的“用户段创建”)。包含LOB段和LOB索引(总是一起存储)的表空间可能与包含表的表空间不同。
注意:有时数据库可以将少量的LOB数据存储在表本身中,而不是单独的LOB段中。
LOB段将数据存储在称为块的片段中。一个块是一组逻辑上连续的数据块,是LOB分配的最小单位。表中的一行存储了一个指向LOB索引的指针,称为LOB定位器。当查询表时,数据库使用LOB索引快速定位LOB块。
数据库对LOB段的读取一致性管理与其他数据不同(见第9-3页的“读取一致性和撤销段”)。数据库不是使用撤销数据来记录更改,而是将之前的形象存储在段本身中。当事务更改LOB时,数据库会分配一个新的块,并将旧数据保留在原处。如果事务回滚,那么数据库将回滚对索引的更改,该索引指向旧块。
外部LOB
BFILE(二进制文件LOB)是一个外部LOB,因为数据库存储了指向操作系统中文件的指针。外部数据是只读的。BFILE使用目录对象来定位数据。所消耗的空间量取决于目录对象名称的长度和文件名称的长度。BFILE不使用与内部LOB相同的读取一致性机制,因为二进制文件位于数据库外部。如果文件中的数据发生变化,则对同一二进制文件的重复读取可能会产生不同的结果。
SecureFiles
SecureFiles是专门为提供与传统文件系统相当的文件数据高性能而设计的LOB数据类型,同时保留了Oracle数据库的优势。SECUREFILE LOB参数启用了通常在高端文件系统中找到的高级功能,如去重、压缩、加密和日志记录。
19.2.4.3. Oracle Text的概述
Oracle Text(文本)是与Oracle数据库集成的一种快速准确的全文检索技术。Oracle Text对存储在文件系统、数据库或Web上的任何文档或文本内容进行索引。这些文档可以根据它们的文本内容、元数据或属性进行搜索。
Oracle Text提供以下优势:
■ Oracle Text允许将文本搜索与常规数据库搜索合并在单个SQL语句中。文本索引位于数据库中,文本查询在Oracle数据库进程中运行。优化器可以为任何查询选择最佳的执行计划,为涉及文本和结构化标准的即席查询提供最佳性能。
■ 您可以将Oracle Text与XML数据一起使用。特别是,您可以结合使用XMLIndex和Oracle Text索引,利用XML和全文索引的优势。
■ Oracle Text SQL API使得创建和维护Oracle Text索引并运行搜索变得简单直观。
用例示例:假设您必须为销售电子设备的拍卖网站创建目录索引。每天都会添加新库存。项目描述、出价日期和价格必须一起存储。应用程序需要对混合查询有良好的响应时间。首先,您创建并填充一个目录表。然后,您使用Oracle Text创建一个CTXCAT索引,您可以在SELECT...WHERE CATSEARCH语句中使用CATSEARCH操作符对其进行查询。
图19-4说明了目录表、其CTXCAT索引和使用CATSEARCH操作符查询索引的目录应用程序之间的关系。
19.2.4.4. Oracle多媒体文档的概述
Oracle Multimedia使得Oracle数据库能够以与其他企业信息集成的方式存储、管理和检索图像、遵循数字成像和通信医学(DICOM)标准的医学图像、音频和视频数据。Oracle Multimedia提供了对象类型和方法,用于:
■ 从多媒体数据中提取元数据和属性
■ 将应用程序创建的元数据嵌入到图像和DICOM数据中
■ 从Oracle数据库、Web服务器、文件系统和其他服务器获取和管理多媒体数据
■ 执行诸如图像和DICOM数据生成缩略图的操作
■ 使DICOM数据匿名化
■ 检查DICOM数据是否符合用户定义的验证规则
19.2.4.5. Oracle Spatial的概述
Oracle Spatial(Spatial)提供了一个SQL模式和函数,有助于在Oracle数据库中存储、检索、更新和查询空间要素集合。Oracle Spatial使得位置启用应用程序和地理信息系统(GIS)应用程序的用户更容易管理空间数据。
空间数据的一个例子是道路地图。空间数据指示地图上对象的地球位置(例如经度和纬度)。当地图渲染时,这些空间数据被用来将对象的位置投影到二维纸张上。GIS通常用于存储、检索和渲染这种相对于地球的空间数据。当空间数据存储在Oracle数据库中时,数据可以被轻松地操作、检索并与其他数据相关联。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通