乐于分享
好东西不私藏

Oracle官方文档翻译《Database Concepts 26ai》第23章-数据库开发者概念

Oracle官方文档翻译《Database Concepts 26ai》第23章-数据库开发者概念

23 Concepts for Database Developers(23 数据库开发者概念)

Oracle 数据库开发者负责创建和维护数据库应用程序。本节简要概述数据库开发者的职责以及可用的开发工具。

  • • Duties of Database Developers(数据库开发者的职责)
    Oracle 开发者负责创建或维护使用 Oracle 技术栈的应用程序的数据库组件。
  • • Tools for Database Developers(数据库开发者工具)
    Oracle 提供了多种用于开发数据库应用程序的工具。本节介绍一些常用的开发工具。
  • • Topics for Database Developers(数据库开发者主题)
    本节涵盖对数据库开发者最至关重要且本手册其他部分未讨论的主题。

Duties of Database Developers(数据库开发者的职责)

Oracle 开发者负责创建或维护使用 Oracle 技术栈的应用程序的数据库组件。

Oracle 开发者要么开发新应用程序,要么将现有应用程序转换为在 Oracle 数据库环境中运行。出于这个原因,开发者与数据库管理员密切合作,共享知识和信息。

Oracle 数据库开发者可能会参与以下任务:

  • • 实现应用程序所需的数据模型
  • • 创建模式对象
  • • 实现数据完整性规则
  • • 为新开发项目选择编程环境
  • • 编写服务器端 PL/SQL 或 Java 子程序以及使用 SQL 语句的客户端过程代码
  • • 使用所选开发工具创建应用程序接口
  • • 建立全球化支持环境以开发全球化应用程序
  • • 在不同的数据库中实例化应用程序,用于开发、测试、培训以及在生产环境中部署

另请参见

  • • 《Oracle AI Database Get Started with Oracle AI Database Development》 了解 Oracle 数据库开发的介绍和基于 GUI 的教程
  • • 《Oracle AI Database Development Guide》 了解对诸如数据库设计、面向开发者的 SQL 和面向开发者的 PL/SQL 等主题的深入讨论

Tools for Database Developers(数据库开发者工具)

Oracle 提供了多种用于开发数据库应用程序的工具。本节介绍一些常用的开发工具。

  • • SQL Developer
    SQL Developer 是数据库开发者使用 SQL*Plus 编辑和开发基本任务的便捷方式。
  • • Oracle APEX AI Application Generator(Oracle APEX AI 应用程序生成器)
    Oracle APEX AI Application Generator 是用于 Oracle 数据库的 Web 应用程序开发工具。Oracle APEX AI Application Generator 使用内置功能(如用户界面主题、导航控件、表单处理程序和灵活报表)来加速应用程序开发。
  • • Oracle JDeveloper
    Oracle JDeveloper 是一个集成开发环境(IDE),用于使用 Java、XML、Web 服务和 SQL 的最新行业标准构建面向服务的应用程序。
  • • Oracle Developer Tools for Visual Studio .NET
    Oracle Developer Tools for Visual Studio .NET 是一套与 Visual Studio .NET 环境集成的应用程序工具。

SQL Developer

SQL Developer 是数据库开发者使用 SQL*Plus 编辑和开发基本任务的便捷方式。

SQL Developer 是 SQL*Plus 的图形化版本,用 Java 编写,支持 SQL 和 PL/SQL 开发。您可以使用标准数据库身份验证连接到任何 Oracle 数据库模式。SQL Developer 使您能够:

  • • 浏览、创建、编辑和删除模式对象
  • • 执行 SQL 语句
  • • 编辑和调试 PL/SQL 程序单元
  • • 操作和导出数据
  • • 创建和显示报表

SQL Developer 在默认的 Oracle 数据库安装中可用,也可通过免费下载获得。

另请参见

《Oracle AI Database Get Started with Oracle AI Database Development》 和 《Oracle SQL Developer User’s Guide》 了解如何使用 SQL Developer

Oracle APEX AI Application Generator(Oracle APEX AI 应用程序生成器)

Oracle APEX AI Application Generator 是用于 Oracle 数据库的 Web 应用程序开发工具。Oracle APEX AI Application Generator 使用内置功能(如用户界面主题、导航控件、表单处理程序和灵活报表)来加速应用程序开发。

Oracle APEX 随数据库一起安装,由表中的数据和 PL/SQL 代码组成。当您运行应用程序时,浏览器会发送一个 URL 请求,该请求被转换为 Oracle APEX PL/SQL 调用。数据库处理 PL/SQL 后,结果以 HTML 形式传回浏览器。每次您请求或提交页面时,都会发生此循环。

您可以将 Oracle APEX 与嵌入式 PL/SQL 网关一起使用。该网关在数据库中的 Oracle XML DB HTTP 服务器中运行,并提供创建动态应用程序所需的基础设施。如图 23-1 所示,嵌入式 PL/SQL 网关通过消除中间层来简化应用程序架构。

Figure 23-1 APEX with Embedded PL/SQL Gateway(图 23-1 带有嵌入式 PL/SQL 网关的 APEX)

Oracle JDeveloper

Oracle JDeveloper 是一个集成开发环境(IDE),用于使用 Java、XML、Web 服务和 SQL 的最新行业标准构建面向服务的应用程序。

Oracle JDeveloper 支持完整的软件开发生命周期,具有用于建模、编码、调试、测试、性能分析、优化和部署应用程序的集成功能。

Oracle JDeveloper 为各种应用程序开发工具使用窗口。例如,在创建 Java 应用程序时,您可以使用诸如 Java 可视化编辑器和组件面板之类的工具。除了这些工具之外,Oracle JDeveloper 还提供了一系列导航器,帮助您组织和查看项目的内容。

另请参见

  • • 《Oracle AI Database Get Started with Java Development》 了解如何使用 JDeveloper
  • • 您可以从以下 URL 下载 JDeveloper:http://www.oracle.com/technetwork/developer-tools/jdev/downloads/

Oracle Developer Tools for Visual Studio .NET

Oracle Developer Tools for Visual Studio .NET 是一套与 Visual Studio .NET 环境集成的应用程序工具。

Oracle Developer Tools for Visual Studio .NET 工具提供对 Oracle 功能的 GUI 访问,使用户能够执行广泛的应用程序开发任务,并提高开发生产力和易用性。

Oracle Developer Tools 支持使用 Visual Basic、C# 和其他 .NET 语言编程和实现 .NET 存储过程。这些过程用 .NET 语言编写,并包含 SQL 或 PL/SQL 语句。

Topics for Database Developers(数据库开发者主题)

本节涵盖对数据库开发者最至关重要且本手册其他部分未讨论的主题。

  • • Principles of Application Design and Tuning(应用程序设计与调优原则)
    Oracle 开发者必须设计、创建和调优数据库应用程序,以达到安全性和性能目标。
  • • Principles of Correct Queries(正确查询的原则)
    现实世界中的应用程序查询可能非常复杂,包含许多连接,并且令人惊讶的是,这些查询通常并非在所有极端情况下都正确,它们显式指定返回错误的结果,即使在长时间运行于生产系统、产生未被注意的错误的 SQL 中也是如此。本节说明如何系统地分析并避免这些最常见的 SQL 错误。
  • • Client-Side Database Programming(客户端数据库编程)
    您可以使用预编译器或 Java 转换器将 SQL 语句放入源代码中,或者可以使用 API 使应用程序与数据库进行交互。
  • • Globalization Support(全球化支持)
    Oracle 数据库全球化支持使您能够以本地语言存储、处理和检索数据。
  • • Unstructured Data(非结构化数据)
    非结构化数据是指未分解为更小逻辑结构的数据。

Principles of Application Design and Tuning(应用程序设计与调优原则)

Oracle 开发者必须设计、创建和调优数据库应用程序,以达到安全性和性能目标。

以下应用程序设计和调优原则是有用的指导方针:

  • • 了解 Oracle 数据库的工作原理
    作为开发者,您希望在最短的时间内针对 Oracle 数据库开发应用程序,这需要充分利用数据库架构和特性。例如,不了解 Oracle 数据库数据并发控制和多版本读一致性,可能会使应用程序破坏数据完整性、运行缓慢并降低可伸缩性。了解 Transaction Guard 和 Application Continuity 如何工作,使您能够避免编写不必要的异常处理代码。
  • • 使用绑定变量,除非有充分的理由不使用它们
    当查询使用绑定变量时,数据库可以对其进行一次编译并将查询计划存储在共享池中。如果再次执行相同的语句,则数据库可以执行软解析并重用该计划。相比之下,硬解析耗时更长且占用更多资源。使用绑定变量以实现软解析非常高效,也是数据库期望开发者工作的方式。
  • • 在数据库服务器中而不是在客户端中实现完整性约束
    使用主键和外键可以使数据在多个应用程序中重用。在客户端中编写规则意味着其他客户端在针对数据库运行时无法访问这些规则。
  • • 使用具有代表性的数据和会话活动构建测试环境
    模拟实际生产环境的测试环境可提供多种好处。例如,您可以对应用程序进行基准测试,以确保其具有良好的扩展性和性能。此外,您可以使用测试环境来衡量对数据库所做更改的性能影响,并确保升级和补丁能正常工作。
  • • 以良好性能为目标设计数据模型
    通常,尝试使用通用数据模型会导致性能不佳。精心设计的数据模型应尽可能高效地响应最常见的查询。例如,数据模型应使用能提供最佳性能的索引类型。部署后进行调优是不可取的,因为对逻辑和物理结构的更改可能很困难甚至不可能。
  • • 定义明确的性能目标并保留指标的历史记录
    开发的一个重要方面是准确确定应用程序的预期性能和扩展方式。例如,使用包括预期用户负载、每秒事务数、可接受的响应时间等在内的指标。良好做法要求您保留性能指标的历史记录。这样,您可以主动和被动地监控性能。
  • • 对应用程序代码进行插桩
    良好的开发实践涉及在应用程序中添加调试代码。生成跟踪文件的功能对于调试和诊断性能问题非常有用。

另请参见

  • • “SQL Parsing”(SQL 解析)
  • • “Introduction to Data Concurrency and Consistency”(数据并发性与一致性简介)
  • • “Advantages of Integrity Constraints”(完整性约束的优势)
  • • 《Oracle AI Database Get Started with Oracle AI Database Development》 了解设计数据库应用程序时的注意事项
  • • 《Oracle AI Database SQL Tuning Guide》 了解如何为性能设计应用程序

Principles of Correct Queries(正确查询的原则)

现实世界中的应用程序查询可能非常复杂,包含许多连接,并且令人惊讶的是,这些查询通常并非在所有极端情况下都正确,它们显式指定返回错误的结果,即使在长时间运行于生产系统、产生未被注意的错误的 SQL 中也是如此。本节说明如何系统地分析并避免这些最常见的 SQL 错误。

查询可能看起来非常复杂。它们可能引用数十个表,包含基于其他视图构建的视图,并在 WITH 子句、SELECT 列表和 WHERE 子句中使用子查询。在这种复杂性之下,一个好的查询仍然回答一个明确的问题。该问题通常反映了对某一特定类型业务实体集的数据需求。查询返回的每一行都应代表该实体的一个实例。对于 GROUP BY 查询,每一行应代表对该同一实体的实例进行的聚合。

在大多数系统中,每个重要到值得查询的业务实体类型都有一个相应的表,其行代表该实体。从这个意义上说,许多编写良好的查询,无论看起来多么复杂,最终都是关于来自单个表的行的问题。周围的复杂性通常存在,因为规范化数据库将实体的属性存储在不同但相关的表中,例如父表、祖父表等等。

例如,规范化的设计通常将客户的姓名存储在 CUSTOMERS 表中一次。ORDERS 表仅存储 CUSTOMER_ID,以便它可以连接到 CUSTOMERSORDER_ITEMS 表存储 ORDER_ID,以便它可以连接到 ORDERS,并且它不重复 CUSTOMER_ID。如果我们想列出 ORDER_ITEMS 的一个子集以及每个项目的客户姓名,我们需要一系列唯一连接,首先连接到 ORDERS(父表),然后连接到 CUSTOMERS(祖父表)。在规范化良好的 OLTP 系统中,查询可能需要许多这样的连接来检索关于单个实体类型的详细信息,即使结果集仍然一对一地映射到来自一个“主”表的行的子集。

我们称该主表为行扩展表(RWT)。在一个正确的查询中,其他连接通常应通过添加来自父表、祖父表等的唯一匹配查找数据来“扩展”每个 RWT 行。这些连接不应增加 RWT 行的数量。所有连接在逻辑上从 RWT 开始并具有这种结构的查询,被称为仅行扩展查询(RWOQ)

注意:过滤可以丢弃 RWT 行。内连接和 WHERE 谓词可以从 RWT 中移除行。“行扩展”并不意味着查询保留所有 RWT 行。它意味着,在过滤之后和任何聚合之前,每个查询结果行都严格地与剩余的 RWT 行一一对应。

如果查询中的每个其他表都可以通过从一个代表查询返回或聚合的实体的单一表开始,经过唯一连接链而到达,那么该起始表就是 RWT,并且该查询是一个 RWOQ。如果无法通过唯一键保证没有任何表与聚合前的结果行一一对应,则该查询不是 RWOQ。在实践中,大多数非 RWOQ 产生的结果无法被应用程序正确解释,因为查询未能将结果行清晰地映射到一个定义明确、具有业务意义的实体。例如,对此类行的值求和,会将同一实体的相同值多次相加,从而产生无意义的总和。

从 Oracle Database 26ai 版本开始,JOIN TO ONE 特性极大地有助于编写正确的 RWOQ。当您对所有连接使用 JOIN TO ONE 时,数据库会在解析时检查查询是否为 RWOQ,将 FROM 子句中最左边的表视为 RWT,并假设该对象是一个基表,而不是可能隐藏非 RWOQ 行为的视图。如果数据库在解析时无法证明 JOIN TO ONE 连接的唯一性,则会在运行时执行检查,以验证从假定 RWT 开始的每个连接,对于执行时遇到的数据来说是否保持唯一。如果在实际结果中检测到非唯一连接,则会引发运行时错误。大多数 RWOQ 都可以转换为 JOIN TO ONE 形式。无法转换为 JOIN TO ONE 形式的查询,通常会在转换尝试中揭示出不规则的连接。当转换后的查询运行时没有发生运行时错误,该结果有力地证实了查询具有所需的每行一个实体的属性。

有关 RWOQ、它们为何有助于防止 SQL 中微妙的正确性问题以及 JOIN TO ONE 如何强制执行这些问题的更多详细信息,请参阅《Oracle AI Database Development Guide》。

Client-Side Database Programming(客户端数据库编程)

您可以使用预编译器或 Java 转换器将 SQL 语句放入源代码中,或者可以使用 API 使应用程序与数据库进行交互。

有两种基本技术使过程化数据库应用程序能够使用 SQL:使用 PL/SQL 和 Java 的服务器端编程,以及使用预编译器和 API(如 Java 数据库连接(JDBC)或 Oracle 调用接口(OCI))的客户端编程。

  • • Embedded SQL(嵌入式 SQL)
    历史上,客户端/服务器程序使用嵌入式 SQL 与数据库交互。
  • • Client-Side APIs(客户端 API)
    如今,大多数开发者使用 API 在其数据库应用程序中嵌入 SQL。

另请参见

《Oracle AI Database Development Guide》 了解如何选择编程环境

“Server-Side Programming: PL/SQL and Java”(服务器端编程:PL/SQL 和 Java)供回顾

Embedded SQL(嵌入式 SQL)

历史上,客户端/服务器程序使用嵌入式 SQL 与数据库交互。

  • • Oracle Precompilers(Oracle 预编译器)
    客户端/服务器程序通常使用 Oracle 预编译器编写,这是一种编程工具,使您能够将 SQL 语句嵌入高级程序中。
Oracle Precompilers(Oracle 预编译器)

客户端/服务器程序通常使用 Oracle 预编译器编写,这是一种编程工具,使您能够将 SQL 语句嵌入高级程序中。

例如,Oracle Pro*C/C++ 预编译器使您能够将 SQL 语句嵌入到 C 或 C++ 源文件中。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;           -- 交互式
EXECSQLROLLBACK;  -- 嵌入式

这些语句具有相同的效果,但您会在交互式 SQL 环境(如 SQL Developer)中使用第一个,在 Pro*C/C++ 程序中使用第二个。

预编译器接受宿主程序作为输入,将嵌入式 SQL 语句转换为标准数据库运行时库调用,并生成一个可以按常规方式编译、链接和运行的源程序。图 23-2 说明了使用预编译器开发程序的典型步骤。

Figure 23-2 Program Development with Precompilers(图 23-2 使用预编译器进行程序开发)

另请参见

《ProC/C++ Developer’s Guide》 获取对 ProC/C++ 预编译器的完整描述

Client-Side APIs(客户端 API)

如今,大多数开发者使用 API 在其数据库应用程序中嵌入 SQL。

例如,用于使程序与 Oracle 数据库通信的两种流行 API 是开放数据库连接(ODBC)和 JDBC。Oracle 调用接口(OCI)和 Oracle C++ 调用接口(OCCI)是用于客户端编程的另外两种常用 API。

  • • OCI and OCCI(OCI 和 OCCI)
    作为预编译器的替代方案,Oracle 提供了 OCI 和 OCCI API。
  • • ODBC and JDBC(ODBC 和 JDBC)
    ODBC 是一种标准 API,使应用程序能够连接到数据库,然后准备并运行 SQL 语句。
OCI and OCCI(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 程序,从而避免了单独的预处理或预编译步骤。图 23-3 说明了开发过程。

Figure 23-3 Development Process Using OCI or OCCI(图 23-3 使用 OCI 或 OCCI 的开发过程)

另请参见

  • • 《Oracle Call Interface Developer’s Guide》
  • • 《Oracle C++ Call Interface Developer’s Guide》
ODBC and JDBC(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 客户端。它独立于平台,可用于 applet 和应用程序。
  • • JDBC OCI 驱动程序
    此驱动程序驻留在客户端,需要安装 Oracle 客户端。它只能用于应用程序。JDBC OCI 驱动程序使用 C 和 Java 编写,将 JDBC 调用转换为 OCI 调用。

以下片段来自一个 Java 程序,该程序使用 JDBC OCI 驱动程序创建一个 Statement 对象并查询 dual 表:

// 创建一个语句对象
Statementstmt= conn.createStatement();

// 查询 dual 表
ResultSetrset= stmt.executeQuery("SELECT 'Hello World' FROM DUAL");

另请参见

《Oracle AI Database Development Guide》 和 《Oracle AI Database Get Started with Java Development》 了解有关 JDBC 的更多信息

Globalization Support(全球化支持)

Oracle 数据库全球化支持使您能够以本地语言存储、处理和检索数据。

全球化支持使您能够开发可同时从世界任何地方访问和运行的多语言应用程序和软件。

编写全球化数据库应用程序的开发者必须执行以下操作:

  • • 了解 Oracle 数据库全球化支持架构,包括不同字符集、地区、语言和语言排序定义的属性
  • • 了解其中间层编程环境的全球化功能,包括它如何与数据库的语言环境模型进行交互和同步
  • • 设计并编写能够同时支持在不同操作系统上运行、具有不同字符集和语言环境要求的多个客户端的代码

例如,应用程序可能需要以本地用户的语言和语言环境首选项,来呈现用户界面内容和处理数据。例如,应用程序必须处理多字节的日文汉字数据,以正确的区域格式显示消息和日期,并处理 7 位 ASCII 数据,而无需用户更改设置。

  • • Globalization Support Environment(全球化支持环境)
    全球化支持环境包括客户端应用程序和数据库。您可以通过设置客户端和服务器上的参数及环境变量来控制与语言相关的操作,而客户端和服务器可能位于不同位置。
  • • Oracle Globalization Development Kit(Oracle 全球化开发工具包)
    Oracle 全球化开发工具包(GDK)包含了全面的编程 API。

另请参见

《Oracle AI Database Globalization Support Guide》 获取有关全球化的更多信息

Globalization Support Environment(全球化支持环境)

全球化支持环境包括客户端应用程序和数据库。您可以通过设置客户端和服务器上的参数及环境变量来控制与语言相关的操作,而客户端和服务器可能位于不同位置。

注意:在以前的版本中,Oracle 将全球化支持功能称为国家语言支持(NLS)功能。NLS 实际上是全球化支持的一个子集,它提供了选择国家语言并以特定字符集存储数据的功能。

Oracle 数据库为以下特性提供全球化支持:

  • • 本地语言和地区
  • • 日期、时间、数字和货币的本地格式
  • • 日历系统(公历、日本年号、泰国佛历等)
  • • 多字符集,包括 Unicode
  • • 字符语义
  • • Character Sets(字符集)
    全球化支持的一个关键组成部分是字符集,它是一种用于在计算机屏幕上显示字符的编码方案。
  • • Locale-Specific Settings(特定于语言环境的设置)
    语言环境是系统或程序运行所在的语言和文化环境。NLS 参数决定了客户端和数据库上特定于语言环境的行为。
Character Sets(字符集)

全球化支持的一个关键组成部分是字符集,它是一种用于在计算机屏幕上显示字符的编码方案。

在应用程序开发中,以下区别很重要:

  • • 数据库字符集决定了哪些语言可以在数据库中表示。字符集在数据库创建时指定。

注意:数据库创建后,更改其字符集通常在时间和资源方面代价非常高。此操作可能需要通过导出整个数据库并重新导入来转换所有字符数据。

  • • 客户端字符集是客户端应用程序输入或显示的数据所使用的字符集。客户端和数据库的字符集可以不同。

一组字符(例如,字母字符、表意文字、符号、标点符号和控制字符)可以编码为一个字符集。编码字符集为集合中的每个字符分配一个唯一的数字代码,称为代码点或编码值。代码点在全球化环境中很重要,因为可能需要在不同字符集之间转换数据。

计算机行业使用许多编码字符集。这些字符集在可用字符数量、可供使用的字符、分配给每个字符的代码点等方面各不相同。Oracle 数据库支持大多数国家、国际和供应商特定的编码字符集标准。

Oracle 数据库支持以下类别的编码字符集:

  • • 单字节字符集
    每个字符占一个字节。7 位字符集的一个示例是 US7ASCII。8 位字符集的一个示例是 WE8DEC。
  • • 多字节字符集
    每个字符占用多个字节。多字节字符集通常用于亚洲语言。
  • • Unicode
    通用编码字符集使您能够使用单一字符集以任何语言存储信息。Unicode 为每个字符提供唯一的代码值,无论平台、程序或语言如何。

另请参见

《Oracle AI Database Globalization Support Guide》 了解字符集迁移

Locale-Specific Settings(特定于语言环境的设置)

语言环境是系统或程序运行所在的语言和文化环境。NLS 参数决定了客户端和数据库上特定于语言环境的行为。

数据库会话在代表客户端执行语句时使用 NLS 设置。例如,数据库会为客户端正确使用千位分隔符的地区用法。通常,客户端主机上的 NLS_LANG 环境变量会为服务器会话和客户端应用程序指定语言环境。过程如下:

  1. 1. 当客户端应用程序启动时,它会根据环境设置初始化客户端 NLS 环境。
    所有本地执行的 NLS 操作(例如在 Oracle Developer 应用程序中显示格式)都使用这些设置。
  2. 2. 客户端在连接时将 NLS_LANG 定义的信息传递给数据库。
  3. 3. 数据库会话根据客户端传递的设置初始化其 NLS 环境。
    如果客户端未指定设置,则会话使用初始化参数文件中的设置。仅当客户端未指定任何 NLS 设置时,数据库才使用初始化参数设置。如果客户端指定了部分 NLS 设置,则其余的 NLS 设置使用默认值。

代表客户端应用程序启动的每个会话,可能与其他会话运行在相同或不同的语言环境中。例如,一个会话可能使用德语语言环境,而另一个会话使用法语语言环境。此外,每个会话可能具有相同或不同的指定语言要求。

下表显示了两个使用不同 NLS_LANG 设置的客户端。用户在每个主机上启动 SQL*Plus,以用户 hr 登录到同一个数据库,并同时运行相同的查询。由于浮点数的特定于语言环境的 NLS 设置,每个会话的结果不同。

Table 23-1 Locale-Specific NLS Settings(表 23-1 特定于语言环境的 NLS 设置)

t
客户端主机 1
客户端主机 2
t0
$ NLS_LANG=American_America.US7ASCII
$ export NLS_LANG
$ NLS_LANG=German_Germany.US7ASCII
$ export NLS_LANG
t1
$ sqlplus /nolog
SQL> CONNECT hr@proddb
Enter password: *******
SQL> SELECT 999/10 FROM DUAL;

999/10
----------
99.9

$ sqlplus /nolog
SQL> CONNECT hr@proddb
Enter password: *******
SQL> SELECT 999/10 FROM DUAL;

999/10
----------
99,9

另请参见

《Oracle AI Database Globalization Support Guide》 了解 NLS 设置

Oracle Globalization Development Kit(Oracle 全球化开发工具包)

Oracle 全球化开发工具包(GDK)包含了全面的编程 API。

API 适用于 Java 和 PL/SQL,并包含代码示例和文档,这些文档解决了创建全球化应用程序时遇到的许多设计、开发和部署问题。GDK 简化了开发过程,并降低了开发用于支持全球化环境的 Internet 应用程序的成本。

GDK 主要由两部分组成:适用于 Java 的 GDK 和适用于 PL/SQL 的 GDK。适用于 Java 的 GDK 为 Java 应用程序提供全球化支持。适用于 PL/SQL 的 GDK 为 PL/SQL 编程环境提供全球化支持。这两部分提供的功能不尽相同。

另请参见

《Oracle AI Database Globalization Support Guide》

Unstructured Data(非结构化数据)

非结构化数据是指未分解为更小逻辑结构的数据。

传统的关系模型处理适合简单表的简单结构化数据。Oracle 数据库还提供对无法分解为标准组件的非结构化数据的支持。非结构化数据包括文本、图形图像、视频剪辑和声音波形。

Oracle 数据库包含处理非结构化内容的数据类型。这些数据类型在数据库中表现为原生类型,并且可以使用 SQL 进行查询。

  • • Overview of XML in Oracle Database(Oracle 数据库中 XML 概述)
    Oracle XML DB 是一组与高性能 XML 操作、存储和检索相关的 Oracle 数据库技术。Oracle XML DB 通过以可互操作的方式同时包含 SQL 和 XML 数据模型,提供原生的 XML 支持。
  • • Overview of JSON in Oracle Database(Oracle 数据库中 JSON 概述)
    Oracle 数据库为 JavaScript 对象表示法(JSON)数据提供原生支持,包括查询和索引。
  • • Overview of LOBs(LOB 概述)
    大对象(LOB)数据类型使您能够以二进制或字符格式存储和操作大型非结构化数据块。
  • • Overview of Oracle Text(Oracle Text 概述)
    Oracle Text 是一种与 Oracle 数据库集成的全文检索技术。Oracle Text 为存储在文件系统、数据库或 Web 上的任何文档或文本内容编制索引。可以基于这些文档的文本内容、元数据或属性来搜索它们。
  • • Overview of Oracle Spatial and Graph(Oracle Spatial and Graph 概述)
    Oracle Spatial and Graph 包括用于空间数据和分析以及物理、逻辑、网络、社交和语义图应用程序的高级功能。
  • • Overview of SQL Property Graphs(SQL 属性图概述)
    Oracle 数据库的属性图功能为 Oracle 数据库提供了强大的图支持。

Overview of XML in Oracle Database(Oracle 数据库中 XML 概述)

Oracle XML DB 是一组与高性能 XML 操作、存储和检索相关的 Oracle 数据库技术。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 数据,从高度结构化到完全非结构化

以下示例创建了一个类型为 XMLType 的表 orders

CREATE TABLE orders OF XMLType;
CREATE DIRECTORY xmldir AS path_to_folder_containing_XML_file ;
INSERT INTO orders
VALUES
(XMLType(BFILENAME('XMLDIR','purOrder.xml'),NLS_CHARSET_ID('AL32UTF8')));

前面的示例还创建了一个 SQL 目录对象,它是数据库中对主机计算机上物理目录的逻辑名称。此目录包含 XML 文件。该示例将来自 purOrder.xml 文件的 XML 内容插入 orders 表中。

Oracle XML Developer’s Kit(XDK)包含用于读取、操作、转换和查看 XML 文档(无论在文件系统还是数据库中)的基本构建块。API 和工具适用于 Java、C 和 C++。生产版 Oracle XDK 附带商业再分发许可证。

示例 23-1 XMLType

CREATE TABLE orders OF XMLType;
CREATE DIRECTORY xmldir AS path_to_folder_containing_XML_file ;
INSERT INTO orders
VALUES
(XMLType(BFILENAME('XMLDIR','purOrder.xml'),NLS_CHARSET_ID('AL32UTF8')));

另请参见

  • • 《Oracle XML DB Developer’s Guide》
  • • 《Oracle XML Developer’s Kit Programmer’s Guide》

Overview of JSON in Oracle Database(Oracle 数据库中 JSON 概述)

Oracle 数据库为 JavaScript 对象表示法(JSON)数据提供原生支持,包括查询和索引。

本节包含以下主题:

  • • What Is JSON?(什么是 JSON?)
    JavaScript 对象表示法(JSON)是一种与语言无关、基于文本的数据格式,可以表示对象、数组和标量数据。多种编程语言都可以解析和生成 JSON 数据。
  • • JSON and XML(JSON 与 XML)
    JSON 和 XML 都常用作数据交换语言。与关系数据不同,JSON 数据和 XML 数据都可以在数据库中存储、索引和查询,而无需任何定义数据的模式。
  • • Native Database Support for JSON(对 JSON 的原生数据库支持)
    JSON 广泛存储于缺乏关系数据库特性的 noSQL 数据库中。相比之下,Oracle 数据库通过事务、索引、声明式查询和视图等特性为 JSON 提供原生支持。
What Is JSON?(什么是 JSON?)

JavaScript 对象表示法(JSON)是一种与语言无关、基于文本的数据格式,可以表示对象、数组和标量数据。多种编程语言都可以解析和生成 JSON 数据。

JSON 通常用作数据交换语言。它常用于序列化结构化数据并通过网络进行交换,通常是在服务器和 Web 应用程序之间。JSON 是在运行嵌入 HTML 的 JavaScript 编写的应用程序的 Web 浏览器中占主导地位的数据格式。

JavaScript 对象是一个关联数组,包含零个或多个属性名称及其关联的 JSON 值对。JSON 对象是 JavaScript 对象字面量,它被写成一个用花括号括起来的属性列表,名称-值对之间用逗号分隔,每个名称和值之间用冒号分隔。对象属性有时被称为键。对象属性名称-值对有时被称为对象成员。

示例 23-2 JSON 对象
此示例显示了一个表示采购订单的 JSON 对象,其顶层属性名称为 PONumberReferenceRequestorUserCostcenterShippingInstructionSpecial InstructionsAllowPartialShipment 和 LineItems

{"PONumber":1600,
"Reference":"ABULL-20140421",
"Requestor":"Alexis Bull",
"User":"ABULL",
"CostCenter":"A50",
"ShippingInstructions":{"name":"Alexis Bull",
"Address":{"street":"200 Sporting Green",
"city":"South San Francisco",
"state":"CA",
"zipCode":99236,
"country":"United States of America"},
"Phone":[{"type":"Office","number":"909-555-7307"},
{"type":"Mobile","number":
"415-555-1234"}]},
"Special Instructions":null,
"AllowPartialShipment":false,
"LineItems":[{"ItemNumber":1,
"Part":{"Description":"One Magic Christmas",
"UnitPrice":19.95,
"UPCCode":13131092899},
"Quantity":9.0},
{"ItemNumber":2,
"Part":{"Description":"Lethal Weapon",
"UnitPrice":19.95,
"UPCCode":85391628927},
"Quantity":5.0}]}

在前面的示例中,大多数属性都具有字符串值。PONumberzipCodeItemNumber 和 Quantity 具有数值。Shipping Instructions 和 Address 将对象作为值。LineItems 将数组作为值。

注意
《Oracle XML DB Developer’s Guide》 获取对 JSON 更全面的概述

JSON and XML(JSON 与 XML)

JSON 和 XML 都常用作数据交换语言。与关系数据不同,JSON 数据和 XML 数据都可以在数据库中存储、索引和查询,而无需任何定义数据的模式。

由于其简单的定义和特性,JSON 数据通常比 XML 数据更容易生成、解析和处理。对于人类来说,它也更易于学习和使用。下表描述了 JSON 和 XML 之间的更多差异。

Table 23-2 Differences Between JSON and XML(表 23-2 JSON 与 XML 之间的差异)

特性
JSON
XML
适用于简单的、结构化的数据
是,但也支持半结构化数据和复杂的结构化数据
适用于混合内容
缺少属性、命名空间、继承和替换
将重要性放在排序上
主要用于文档而非数据
包含日期数据类型

注意
《Oracle AI Database JSON Developer’s Guide》 获取 XML 和 JSON 更全面的比较

Native Database Support for JSON(对 JSON 的原生数据库支持)

JSON 广泛存储于缺乏关系数据库特性的 noSQL 数据库中。相比之下,Oracle 数据库通过事务、索引、声明式查询和视图等特性为 JSON 提供原生支持。

您可以像访问其他数据库数据一样访问存储在数据库中的 JSON 数据,包括使用 OCI、.NET 和 JDBC。存储 JSON 数据的首选方式是使用 JSON 数据类型,这是一种专为查询和 DML 处理优化的专有二进制格式。您可以在允许 SQL 数据类型的大多数地方使用 JSON 数据类型,包括作为列类型或 PL/SQL 程序单元的参数类型。

通过使用 Oracle SQL,您可以对 JSON 数据执行以下操作:

  • • 将 JSON 数据与非 JSON 关系数据连接起来。
  • • 使用 SQL 函数 json_object 和 json_array 从关系数据生成 JSON 文档。
  • • 使用 SQL 函数 json_table 将 JSON 数据投影为关系格式。
  • • 使用 is_json 创建检查约束以在列中强制 JSON 数据。数据库使用检查约束来确认该列是否为 JSON,以进行 JSON 特定的操作,例如简化的语法。
  • • 将 JSON 文档作为 PL/SQL 对象进行操作。
  • • 使用 SQL 函数 json_query 和 json_value 接受一个 Oracle JSON 路径表达式作为参数,并将其与目标 JSON 数据进行匹配。
  • • 索引 JSON 数据。
  • • 查询存储在外部表中的 JSON 数据。
  • • 使用 Oracle GoldenGate 复制包含 JSON 数据列的表。

文本 JSON 数据始终使用 Unicode 字符集,即 UTF8 或 UTF16。Oracle 数据库在解析和查询 JSON 数据时内部使用 UTF8。如果输入或输出此类处理的数据必须使用 UTF8 以外的不同字符集,则会自动执行适当的字符集转换。

注意
《Oracle AI Database JSON Developer’s Guide》 获取对 Oracle 数据库中 JSON 支持更全面的概述

Overview of LOBs(LOB 概述)

大对象(LOB)数据类型使您能够以二进制或字符格式存储和操作大型非结构化数据块。

大对象(LOB)数据类型提供对数据的高效、随机、分段访问。

  • • Internal LOBs(内部 LOB)
    内部 LOB 将数据存储在数据库本身中,而不是存储在外部文件中。
  • • External LOBs(外部 LOB)
    BFILE(二进制文件大对象,或 LOB)是一种外部大对象。
  • • SecureFiles
    SecureFiles LOB 存储是两种存储类型之一;另一种类型是 BasicFiles LOB 存储。
Internal LOBs(内部 LOB)

内部 LOB 将数据存储在数据库本身中,而不是存储在外部文件中。

内部 LOB 包括以下内容:

  • • CLOB(字符 LOB),它以数据库字符集存储大量文本,例如文本或 XML 文件
  • • NCLOB(国家字符集 LOB),它存储 Unicode 数据
  • • BLOB(二进制 LOB),它作为位流存储大量二进制信息,不受字符集转换的影响

数据库存储 LOB 的方式与其他数据类型不同。创建 LOB 列会隐式创建一个 LOB 段和一个 LOB 索引。包含 LOB 段和 LOB 索引(它们始终存储在一起)的表空间可能与包含该表的表空间不同。

注意:有时,数据库可以将少量 LOB 数据存储在表本身中,而不是存储在单独的 LOB 段中。

LOB 段将数据存储在称为**块(chunks)**的片段中。块是一组逻辑上连续的数据块,是 LOB 的最小分配单元。表中的一行存储一个称为 LOB 定位器的指针,该指针指向 LOB 索引。查询表时,数据库使用 LOB 索引快速定位 LOB 块。

数据库对 LOB 段的读一致性的管理方式与其他数据不同。数据库不使用撤销数据来记录更改,而是将前映像存储在段本身中。当事务更改 LOB 时,数据库分配一个新块,并将旧数据保留在原位。如果事务回滚,则数据库将索引的更改回滚,使其重新指向旧块。

另请参见

  • • “User Segment Creation”(用户段创建)
  • • “Read Consistency and Undo Segments”(读一致性与撤销段)
External LOBs(外部 LOB)

BFILE(二进制文件大对象,或 LOB)是一种外部大对象。

BFILE 是一种外部 LOB,因为数据库存储的是指向操作系统中文文件的指针。外部数据是只读的。

BFILE 使用目录对象来定位数据。消耗的空间量取决于目录对象名称的长度和文件名的长度。

BFILE 不使用与内部 LOB 相同的读一致性机制,因为二进制文件位于数据库外部。如果文件中的数据发生更改,则重复从同一二进制文件读取可能会产生不同的结果。

SecureFiles

SecureFiles LOB 存储是两种存储类型之一;另一种类型是 BasicFiles LOB 存储。

SECUREFILE LOB 参数支持高级功能,包括压缩和重复数据删除(高级压缩选项的一部分)以及加密(高级安全选项的一部分)。从 Oracle Database 12c 开始,SecureFiles 是 LOB 的默认存储机制。

另请参见

  • • “Oracle Data Types”(Oracle 数据类型)
  • • 《Oracle AI Database SecureFiles and Large Objects Developer’s Guide》 了解有关 LOB 数据类型的更多信息

Overview of Oracle Text(Oracle Text 概述)

Oracle Text 是一种与 Oracle 数据库集成的全文检索技术。Oracle Text 为存储在文件系统、数据库或 Web 上的任何文档或文本内容编制索引。可以基于这些文档的文本内容、元数据或属性来搜索它们。

Oracle Text 提供以下优势:

  • • Oracle Text 允许在单个 SQL 语句中将文本搜索与常规数据库搜索相结合。Text 索引位于数据库中,Text 查询在 Oracle 数据库进程中运行。优化器可以为任何查询选择最佳执行计划,为涉及 Text 和结构化条件的即席查询提供最佳性能。
  • • 您可以将 Oracle Text 与 XML 数据一起使用。特别是,您可以将 XMLIndex 与 Oracle Text 索引相结合,同时利用 XML 和全文索引的优势。
  • • Oracle Text SQL API 使创建和维护 Oracle Text 索引以及运行搜索变得简单直观。

举一个用例,假设您必须为一个销售电子设备的拍卖网站创建目录索引。每天都有新库存添加。物品描述、出价日期和价格必须一起存储。应用程序需要对混合查询具有良好的响应时间。

首先,您创建并填充一个 catalog 表。然后,您使用 Oracle Text 创建一个 CTXCAT 索引,您可以使用 CATSEARCH 运算符在 SELECT ... WHERE CATSEARCH 语句中查询该索引。

图 23-4 说明了 catalog 表、其 CTXCAT 索引以及使用 CATSEARCH 运算符查询索引的目录应用程序之间的关系。

Figure 23-4 Catalog Query Application(图 23-4 目录查询应用程序)

另请参见

  • • 《Oracle Text Application Developer’s Guide》 和 《Oracle Text Reference》
  • • 《Oracle XML DB Developer’s Guide》 了解如何对 XML 数据执行全文搜索

Overview of Oracle Spatial and Graph(Oracle Spatial and Graph 概述)

Oracle Spatial and Graph 包括用于空间数据和分析以及物理、逻辑、网络、社交和语义图应用程序的高级功能。

空间功能提供了一个模式和函数,便于在 Oracle 数据库中存储、检索、更新和查询空间要素的集合。空间数据的一个示例是路线图。空间数据指示地图上对象的 Earth 位置(例如经度和纬度)。渲染地图时,此空间数据可以将对象的位置投影到二维纸张上。地理信息系统(GIS)可以存储、检索和渲染此与 Earth 相关的空间数据。当 Oracle 数据库存储此空间数据时,您可以使用 Spatial and Graph 来操作和检索此数据,并将此数据与其他数据相关联。

另请参见

《Oracle Spatial Developer’s Guide》

Overview of SQL Property Graphs(SQL 属性图概述)

Oracle 数据库的属性图功能为 Oracle 数据库提供了强大的图支持。

属性图功能允许您探索和发现数据集中的复杂关系,例如客户数据、社交网络和金融交易,以用于产品推荐、欺诈检测、风险分析、定向营销等应用程序。这种高性能图功能提供了高级图查询语言支持、开发者 API 以及具有近 60 种预构建算法的分析功能。

属性图功能,包括 PGQL(属性图查询语言)支持,从 Oracle Database 12.2 起可用。从 Oracle Database 26ai 版本开始,您还可以使用 SQL 创建和查询属性图,如 SQL:2023 标准中所定义。

Oracle Graph Server and Client 是一个与 Oracle 数据库中的属性图功能配合使用的软件包。它包括图工具、客户端库和用于运行图分析算法的 Oracle Graph Server。

相关主题

  • • 《Oracle AI Database Graph Developer’s Guide for Property Graph》
  • • CREATE PROPERTY GRAPH