适用于数据库开发人员的概念
Oracle Database 开发人员创建和维护数据库应用程序。本节简要概述了数据库开发人员的工作以及可用的开发工具。
-
数据库开发人员的职责 Oracle 开发人员负责创建和维护使用 Oracle 技术堆栈的应用程序的数据库组件。
-
面向数据库开发人员的工具 Oracle 提供了多种用于开发数据库应用程序的工具。本节介绍一些常用的开发工具。
-
面向数据库开发人员的主题 本节介绍对数据库开发人员最重要且未在手册其他地方讨论的主题。
数据库开发人员的职责
Oracle 开发人员负责创建或维护使用 Oracle 技术堆栈的应用程序的数据库组件。
Oracle 开发人员可以开发新应用或将现有应用转换为在 Oracle Database 环境中运行。因此,开发人员可以与数据库管理员密切合作,共享知识和信息。
预计 Oracle 数据库开发人员将参与以下任务:
-
实施应用程序所需的数据模型
-
创建方案对象
-
实施数据完整性规则
-
为新的开发项目选择编程环境
-
编写使用 SQL 语句的服务器端 PL/SQL 或 Java 子程序以及客户端过程代码
-
使用所选开发工具创建应用程序界面
-
建立全球化支持环境,以开发全球化的应用程序
-
在不同的数据库中实例化应用程序,以便在生产环境中进行开发、测试、教育和部署
另请参见:
-
Oracle AI Database 入门 Oracle AI Database 开发,了解有关 Oracle Database 开发的介绍和基于 GUI 的教程
-
Oracle AI Database Development Guide,深入讨论数据库设计、面向开发人员的 SQL 和面向开发人员的 PL/SQL 等主题
面向数据库开发人员的工具
Oracle 提供了多种用于开发数据库应用程序的工具。本节介绍一些常用的开发工具。
-
SQL Developer 是数据库开发人员使用 SQL*Plus 编辑和开发基本任务的一种便捷方式。
-
Oracle APEX AI 应用生成器 Oracle APEX AI 应用生成器是适用于 Oracle Database 的 Web 应用开发工具。Oracle APEX AI 应用生成器使用内置功能(例如用户界面主题、导航控件、表单处理程序和灵活的报表)来加速应用开发。
-
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 Database 安装中提供,并且可以免费下载。
另请参阅:Oracle AI Database Get Started with Oracle AI Database Development 和Oracle SQL Developer User’s Guide 以了解如何使用 SQL Developer
Oracle APEX AI 应用生成器
Oracle APEX AI 应用生成器是适用于 Oracle Database 的 Web 应用开发工具。Oracle APEX AI 应用生成器使用内置功能(例如用户界面主题、导航控件、表单处理程序和灵活的报表)来加速应用开发。
Oracle APEX 与数据库一起安装,由表和 PL/SQL 代码中的数据组成。运行应用程序时,浏览器会发送一个 URL 请求,该请求将被转换为 Oracle APEX PL/SQL 调用。数据库处理 PL/SQL 后,结果将以 HTML 格式转发回浏览器。每次请求或提交页面时都会发生此周期。
您可以将 Oracle APEX 与嵌入式 PL/SQL 网关结合使用。网关在数据库中的 Oracle XML DB HTTP 服务器中运行,并提供必要的基础结构来创建动态应用程序。如图 23-1 中所示,嵌入式 PL/SQL 网关通过消除中间层来简化应用体系结构。
图 1:采用嵌入式 PL/SQL 网关的 APEX

Oracle JDeveloper
Oracle JDeveloper 是一个集成开发环境 (IDE),可用于使用最新的 Java、XML、Web 服务和 SQL 行业标准构建面向服务的应用。Oracle JDeveloper 支持完整的软件开发周期,并具有用于建模、编码、调试、测试、分析、调优和部署应用的集成功能。
Oracle JDeveloper 将窗口用于各种应用开发工具。例如,在创建 Java 应用程序时,可以使用 Java 可视编辑器和组件调色板等工具。除了这些工具之外,Oracle JDeveloper 还提供了一系列导航器,可帮助您组织和查看项目内容。
另请参见:
-
Oracle AI Database Java 开发入门了解如何使用 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 语句。
适用于数据库开发人员的主题
本节介绍对数据库开发人员最重要且未在手册其他部分讨论的主题。
-
应用设计和调优原则 Oracle 开发人员必须设计、创建和调优数据库应用,以实现安全性和性能目标。
-
正确查询的原则 现实世界中的应用查询可能非常复杂,具有许多联接,而且这些联接在所有角落情况下通常都不正确,显式指定错误结果的返回,即使在生产系统中长时间运行的 SQL 也会产生未被注意的错误。本节介绍如何系统地分析并避免这些非常常见的 SQL 错误中的重要错误。
-
客户端数据库编程您可以使用预编译器或 Java 转换器将 SQL 语句放置在源代码中,也可以使用 API 使应用程序能够与数据库交互。
-
全球化支持 Oracle Database 全球化支持支持支持您以本机语言存储、处理和检索数据。
-
非结构化数据 非结构化数据是未分解为较小逻辑结构的数据。
应用设计和调优原则
Oracle 开发人员必须设计、创建和优化数据库应用,以实现安全性和性能目标。
以下应用程序设计和优化的原则是有用的准则:
-
了解 Oracle Database 的工作原理
作为开发人员,您希望在最短时间内针对 Oracle 数据库开发应用,这需要利用数据库体系结构和功能。例如,如果不了解 Oracle Database 数据并发控制和多版本读取一致性,应用可能会破坏数据的完整性、缓慢运行并降低可扩展性。了解 Transaction Guard 和 Application Continuity 的工作原理,可避免编写不必要的异常处理代码。
-
使用绑定变量,除非您有充分的理由不使用它们
当查询使用绑定变量时,数据库可以编译一次,并将查询计划存储在共享池中。如果再次执行同一语句,则数据库可以执行软性语法分析并重用该计划。相比之下,硬性语法分析需要更长的时间,并且使用更多的资源。使用绑定变量允许软性语法分析非常有效,并且是数据库希望开发人员工作的方式。
-
在数据库服务器(而不是客户机)中实施完整性约束条件
使用主键和外键,可以在多个应用程序中重用数据。对客户机中的规则进行编码意味着其他客户机在针对数据库运行时无法访问这些规则。
-
构建具有代表性数据和会话活动的测试环境
模拟实时生产环境的测试环境具有多种优势。例如,您可以对应用程序进行基准测试,以确保其扩展并运行良好。此外,还可以使用测试环境来衡量数据库更改对性能的影响,并确保升级和修补程序正常工作。
-
设计具有良好性能目标的数据模型
通常,尝试使用通用数据模型会导致性能不佳。精心设计的数据模型可以尽可能高效地回答最常见的查询。例如,数据模型应使用提供最佳性能的索引类型。部署后进行优化是不可取的,因为对逻辑和物理结构的更改可能困难或不可能。
-
定义明确的绩效目标并保留指标历史记录
开发的一个重要方面是确定应用程序的预期执行和扩展方式。例如,使用包括预期用户加载、每秒事务处理数、可接受的响应时间等的度量。优秀实践指示您维护绩效指标的历史记录。通过这种方式,可以主动和被动地监视性能。
-
检测应用程序代码
良好的开发实践涉及向应用程序添加调试代码。生成跟踪文件的能力对于调试和诊断性能问题非常有用。
另请参见:
-
“ SQL 语法分析”
-
“完整性约束的优点”
-
Oracle AI Database 入门 Oracle AI Database 开发,了解设计数据库应用程序时的注意事项
-
Oracle AI Database SQL Tuning Guide,了解如何设计应用以提高性能
正确查询的原则
现实世界的应用程序查询可能非常复杂,有许多联接,这些联接通常在所有角落情况下都不正确,显式指定错误结果的返回,即使是在生产系统中长时间运行的 SQL,也会产生未被注意的错误。本节介绍如何系统地分析并避免这些非常常见的 SQL 错误中的重要错误。
查询看起来非常复杂。它们可以引用数十个表,包括基于其他视图构建的视图,并在 WITH 子句、SELECT 列表和 WHERE 子句中使用子查询。在这种复杂性之下,一个好的查询仍然可以回答一个明确的问题。该问题通常反映了需要一组特定类型的业务实体的数据。查询返回的每一行都应表示该实体的一个实例。对于 GROUP BY 查询,每一行都应表示对该实体实例的聚合。
在大多数系统中,每个对查询足够重要的业务实体类型都有一个对应的表,其行表示该实体。从这个意义上说,许多写得很好的查询,无论它们看起来多么复杂,最终都是关于单个表中的行的问题。周围的复杂性通常存在,因为规范化数据库将实体的属性存储在相关表(例如父表、祖父表等)中。
例如,规范化设计通常在 CUSTOMERS 表中存储顾客姓名一次。ORDERS 表仅存储 CUSTOMER_ID,因此可以将其联接到 CUSTOMERS。ORDER_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。
客户端数据库编程
您可以使用预编译器或 Java 转换器在源代码中放置 SQL 语句,也可以使用 API 使应用程序能够与数据库交互。
有两种基本技术可以使过程数据库应用程序使用 SQL:使用 PL/SQL 和 Java 进行服务器端编程,以及使用预编译器和 API(例如 Java 数据库连接 (JDBC) 或 Oracle Call Interface (OCI))进行客户端编程。
另请参见:
Oracle AI Database Development Guide,了解如何选择编程环境
Server-Side Programming:PL/SQL and Java (服务器端编程:PL/SQL 和 Java)
嵌入式 SQL
过去,客户机/服务器程序使用嵌入式 SQL 与数据库进行交互。
- Oracle Precompilers 客户机/服务器程序通常使用 Oracle 编译器编写,该编译器是一种编程工具,可用于将 SQL 语句嵌入高级程序。
Oracle Precompilers
客户机/服务器程序通常使用 Oracle 预编译器编写,该预编译器是一种编程工具,可用于将 SQL 语句嵌入高级程序。
例如,使用 Oracle Pro*C/C++ 预编译器可将 SQL 语句嵌入 C 或 C++ 源文件中。Oracle 预编译器也适用于 COBOL 和 FORTRAN。
预编译器具有以下优点:
-
提高工作效率,因为您编写的代码通常比等效的 OCI 应用少
-
使您能够创建高度定制的应用程序
-
允许关闭对资源使用、SQL 语句执行和各种运行时指示符的监视
-
预编译器(而不是您)将每个嵌入式 SQL 语句转换为对 Oracle Database 运行时库的调用,从而节省时间
-
使用对象类型转换器将 Oracle Database 对象类型和集合映射到要在 Pro*C/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 语句转换为标准数据库运行时库调用,然后生成源程序,以供您以常规方式进行编译、链接和运行。图 23-2 说明了开发使用预编译器的程序的典型步骤。
图 2:使用预编译器的程序开发

另请参见:有关 Pro*C/C++ 预编译器的完整说明,请参见Pro*C/C++ Developer’s Guide
客户端 API
如今,大多数开发人员都使用 API 将 SQL 嵌入到数据库应用中。
例如,用于使程序能够与 Oracle Database 通信的两个常用 API 是 Open Database Connectivity (ODBC) 和 JDBC。Oracle Call Interface (OCI) 和 Oracle C++ Call Interface (OCCI) 是用于客户端编程的另外两个常用 API。
-
OCI 和 OCCI 作为预编译器的替代方案,Oracle 提供了 OCI 和 OCCI API。
-
ODBC 和 JDBC ODBC 是标准 API,允许应用程序连接到数据库,然后准备和运行 SQL 语句。
OCI 和 OCCI
作为预编译器的替代方案,Oracle 提供了 OCI 和 OCCI API。
OCI 支持您使用主机编程语言(例如 C)在数据库中处理数据和方案。OCCI 是一个面向对象的接口,适合与 C++ 一起使用。这两种 API 均支持开发人员使用原生子程序调用来访问 Oracle Database 并控制 SQL 执行。
在某些情况下,OCI 提供了比高级接口更好的性能或更多功能。OCI 和 OCCI 提供多种功能,包括以下功能:
-
即时客户端,一种在磁盘空间出现问题时部署应用程序的方式
-
线程管理、连接池、全球化功能以及从 C 应用程序直接路径加载数据
OCI 和 OCCI 以动态运行时库 (OCILIB) 的形式提供了标准数据库访问和检索函数库。可以在运行时在应用程序中链接此库。因此,您可以以与非数据库应用程序相同的方式编译和链接 OCI 或 OCCI 程序,从而避免执行单独的预处理或预编译步骤。图 23-3 说明了开发过程。
图 3:使用 OCI 或 OCCI 的开发流程

ODBC 和 JDBC
ODBC 是一种标准 API,允许应用程序连接到数据库,然后准备和运行 SQL 语句。
ODBC 独立于编程语言、数据库和操作系统。ODBC 的目标是允许任何应用程序访问任何数据库中包含的数据。
数据库驱动程序是位于应用程序和数据库之间的软件。驱动程序将应用程序进行的 API 调用转换为数据库可以处理的命令。通过使用 ODBC 驱动程序,应用程序可以访问任何数据源,包括存储在电子表格中的数据。ODBC 驱动程序在 ODBC 标准和数据库之间执行所有映射。
Oracle 提供的 Oracle ODBC 驱动程序使符合 ODBC 的应用程序能够访问 Oracle Database。例如,使用 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");
另请参阅:Oracle AI Database Development Guide 和 Oracle AI Database Get Started with Java Development 以了解有关 JDBC 的更多信息
全球化支持
Oracle Database 全球化支持支持您以本机语言存储、处理和检索数据。
全球化支持使您能够开发可同时从世界任何地方访问和运行的多语言应用程序和软件。
编写全球化数据库应用程序的开发人员必须执行以下操作:
-
了解 Oracle Database 全球化支持体系结构,包括不同字符集、地区、语言和语言排序定义的属性
-
了解其中间层编程环境的全球化功能,包括如何与数据库的语言环境模型进行交互和同步
-
设计和编写能够同时支持在不同操作系统上运行的多个客户端的代码,具有不同的字符集和区域设置要求
例如,可能需要应用程序以本地用户的语言和区域设置首选项呈现用户界面内容和处理数据。例如,应用程序必须处理多字节日文汉字数据,以正确的区域格式显示消息和日期,并处理 7 位 ASCII 数据,而无需用户更改设置。
-
全球化支持环境 全球化支持环境包括客户机应用程序和数据库。您可以通过在客户机和服务器上设置参数和环境变量(可能存在于不同的位置)来控制与语言相关的操作。
-
Oracle Globalization Development Kit Oracle Globalization Development Kit (GDK) 包含全面的编程 API。另请参阅:Oracle AI Database Globalization Support Guide,了解有关全球化的更多信息
全球化支持环境
全球化支持环境包括客户机应用程序和数据库。您可以通过在客户机和服务器上设置参数和环境变量(可能存在于不同的位置)来控制与语言相关的操作。注:在以前的发行版中,Oracle 将全球化支持功能称为国家语言支持 (National Language Support,NLS) 功能。NLS 实际上是全球化的支持的一个子集,它提供了选择国家语言和存储特定字符集数据的功能。
Oracle Database 为以下功能提供全球化支持:
-
本机语言和地区
-
日期、时间、数字和货币的本地格式
-
日历系统(公历、日本帝国、泰国佛等)
-
多个字符集,包括 Unicode
-
字符语义
-
字符集 全球化支持的一个关键组成部分是字符集,这是一个用于在计算机屏幕上显示字符的编码方案。
-
区域设置是系统或程序运行时所在的语言和文化环境。NLS 参数确定客户机和数据库上特定于语言环境的行为。
字符集
全球化支持的一个关键组成部分是字符集,它是用于在计算机屏幕上显示字符的编码方案。
在应用程序开发中,以下区别非常重要:
-
数据库字符集确定可以在数据库中表示的语言。字符集是在创建数据库时指定的。
注:创建数据库后,更改其字符集在时间和资源方面通常非常昂贵。此操作可能需要通过导出整个数据库并将其重新导入来转换所有字符数据。
-
客户机字符集是客户机应用程序输入或显示的数据的字符集。客户端和数据库的字符集可以不同。
可以将一组字符(例如字母字符、符号、符号、标点符号和控制字符)编码为字符集。编码字符集为集中的每个字符分配一个唯一的数字代码,称为代码点或编码值。代码点在全局环境中非常重要,因为可能需要在不同的字符集之间转换数据。
计算机行业使用许多编码字符集。这些集合在可用字符数、可用字符数、分配给每个字符的代码点数等方面有所不同。Oracle Database 支持大多数国家、国际和特定于供应商的编码字符集标准。
Oracle Database 支持以下几类编码字符集:
-
单块字符集
每个字符占用一个字节。7 位字符集的一个示例是 US7ASCII。8 位字符集的一个示例是 WE8DEC。
-
多字节字符集合
每个字符占用多个字节。多字节集通常用于亚洲语言。
-
Unicode
使用通用编码字符集,您可以使用单个字符集以任何语言存储信息。Unicode 为每个字符提供唯一代码值,而与平台、程序或语言无关。
另请参阅:Oracle AI Database Globalization Support Guide 以了解字符集迁移
特定于语言环境的设置
区域设置是系统或程序运行时所在的语言和文化环境。NLS 参数确定客户机和数据库上特定于语言环境的行为。
数据库会话在代表客户机执行语句时使用 NLS 设置。例如,数据库对客户的千位分隔符进行了正确的地区使用。通常,客户机主机上的 NLS_LANG 环境变量指定服务器会话和客户机应用程序的语言环境。该过程如下:
-
当客户机应用程序启动时,它将从环境设置初始化客户机 NLS 环境。
本地执行的所有 NLS 操作(例如在 Oracle Developer 应用程序中显示格式设置)都使用这些设置。
-
客户机在连接时将
NLS_LANG定义的信息传递给数据库。 -
数据库会话根据客户机通信的设置初始化其 NLS 环境。
如果客户机未指定设置,则会话将使用初始化参数文件中的设置。仅当客户机未指定任何 NLS 设置时,数据库才会使用初始化参数设置。如果客户机指定了某些 NLS 设置,则其余 NLS 设置为默认值。
代表客户机应用程序启动的每个会话可以与其他会话以相同或不同的语言环境运行。例如,一个会话可以使用德语区域设置,而另一个会话使用法语区域设置。此外,每个会话可能具有指定相同或不同的语言要求。
下表显示了使用不同 NLS_LANG 设置的两个客户机。用户在每台主机上启动 SQL*Plus,然后登录到与 hr 相同的数据库,并同时运行相同的查询。由于浮点数具有特定于语言环境的 NLS 设置,每个会话的结果会有所不同。
表 1:特定于语言环境的 NLS 设置
| 吨 | 客户机主机 1 | 客户机主机 2 |
|---|---|---|
| t0 | |
|
| t1 | |
|
另请参阅:Oracle AI Database Globalization Support Guide 以了解 NLS 设置
Oracle Globalization Development Kit
Oracle Globalization Development Kit (GDK) 包含全面的编程 API。
API 可用于 Java 和 PL/SQL,包括代码示例和文档,用于解决在创建全局应用程序时遇到的许多设计、开发和部署问题。GDK 简化了开发过程,并降低了开发用于支持全球环境的互联网应用程序的成本。
GDK 主要由两个部分组成:GDK for Java 和 GDK for PL/SQL。GDK for Java 为 Java 应用程序提供全球化支持。GDK for PL/SQL 为 PL/SQL 编程环境提供了全球化支持。这两个部分提供的功能并不相同。
另请参阅:Oracle AI Database Globalization 支持指南
非结构化数据
非结构化数据是未分解为较小逻辑结构的数据。
传统的关系模型处理简单的结构化数据,这些数据适合简单的表。Oracle Database 还支持无法分解为标准组件的非结构化数据。非结构化数据包括文本、图形图像、视频剪辑和声音波形。
Oracle Database 包含用于处理非结构化内容的数据类型。这些数据类型在数据库中显示为本机类型,可以使用 SQL 进行查询。
-
Oracle Database 中的 XML 概览 Oracle XML DB 是一组与高性能 XML 处理、存储和检索相关的 Oracle Database 技术。Oracle XML DB 通过以可互操作的方式包含 SQL 和 XML 数据模型来提供本机 XML 支持。
-
Oracle Database 中的 JSON 概览 Oracle Database 为 JavaScript 对象表示法 (JSON) 数据提供原生支持,包括查询和索引。
-
LOB 概览大型对象 (LOB) 数据类型使您能够以二进制或字符格式存储和处理大型非结构化数据块。
-
Oracle Text 概览 Oracle Text (Text) 是与 Oracle Database 集成的全文检索技术。Oracle Text 为存储在文件系统、数据库或 Web 上的任何文档或文本内容编制索引。可以根据文档的文本内容、元数据或属性来搜索这些文档。
-
Oracle Spatial and Graph 概览 Oracle Spatial and Graph(空间和图形)包括空间数据和分析以及物理、逻辑、网络、社交和语义图形应用程序的高级功能。
-
SQL 属性图形概览 Oracle Database 的属性图形功能为 Oracle Database 提供了强大的图形支持。
Oracle Database 中的 XML 概览
Oracle XML DB 是一组与高性能 XML 处理、存储和检索相关的 Oracle Database 技术。Oracle XML DB 通过以可互操作的方式包含 SQL 和 XML 数据模型来提供本机 XML 支持。
Oracle XML DB 适用于任何 Java 或 PL/SQL 应用程序,其中应用程序处理的一些或所有数据均使用 XML 表示。例如,应用程序可能具有大量必须摄取、生成、验证和搜索的 XML 文档。
Oracle XML DB 提供多种功能,包括:
-
本机
XMLType数据类型,可以表示数据库中的 XML 文档,以便 SQL 可访问该文档 -
支持 XML 标准,例如 XML 模式、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 文件。该示例将 XML 内容从 purOrder.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 Database 中的 JSON 概览
Oracle Database 为 JavaScript 对象表示法 (JSON) 数据提供原生支持,包括查询和索引。
本部分涵盖以下主题:
-
什么是 JSON? JavaScript Object Notation (JSON) 是一种与语言无关的基于文本的数据格式,可以表示对象、数组和标量数据。各种编程语言可以解析和生成 JSON 数据。
-
JSON 和 XML JSON 和 XML 通常用作数据交换语言。与关系数据不同,JSON 数据和 XML 数据可以在数据库中存储、编制索引和查询,而无需任何定义数据的模式。
-
JSON 原生数据库支持 JSON 广泛存储在缺少关系数据库功能的 noSQL 数据库中。相比之下,Oracle Database 原生支持 JSON,具有事务处理、索引、声明式查询和视图等功能。
什么是 JSON?
JavaScript Object Notation (JSON) 是一种与语言无关的基于文本的数据格式,可以表示对象、数组和标量数据。各种编程语言可以解析和生成 JSON 数据。
JSON 通常用作数据交换语言。它通常用于序列化结构化数据并通过网络进行交换,通常是在服务器和 Web 应用程序之间。JSON 是 Web 浏览器中的主要数据格式,用于运行以 HTML 嵌入式 JavaScript 编写的应用程序。
JavaScript 对象是零对或多对属性名称和关联的 JSON 值的关联数组。JSON 对象是 JavaScript 对象文字,其写入为括在大括号中的属性列表,名称 - 值对以逗号分隔,每个对的名称和值以冒号分隔。对象属性有时称为键。对象属性名称 - 值对有时称为对象成员。
示例 23-2 JSON 对象
此示例显示了表示采购订单的 JSON 对象,其中顶层属性名称为 PONumber、Reference、Requestor、User、Costcenter、ShippingInstruction、Special Instructions、AllowPartialShipment 和 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 } ] }
在前面的示例中,大多数属性都具有字符串值。PONumber、zipCode、ItemNumber 和 Quantity 具有数字值。Shipping Instructions 和 Address 将对象作为值。LineItems 具有一个数组作为值。
注:Oracle XML DB Developer’s Guide,更全面地介绍 JSON
JSON 和 XML
JSON 和 XML 通常用作数据交换语言。与关系数据不同,JSON 数据和 XML 数据可以在数据库中存储、编制索引和查询,而无需任何定义数据的模式。
由于其简单的定义和功能,JSON 数据通常比 XML 数据更容易生成、解析和处理。对人类来说,学习和使用也更容易。下表描述了 JSON 和 XML 之间的进一步差异。
表 2 JSON 与 XML 之间的差异
| 功能 | JSON | XML |
|---|---|---|
| 适用于简单、结构化的数据 | 是 | 可以,但也支持半结构化数据和复杂的结构化数据 |
| 适用于混合内容 | 否 | 是 |
| 缺少属性、名称空间、继承和替代 | 是 | 否 |
| 注重订购 | 否 | 是 |
| 主要用于文档而非数据 | 否 | 是 |
| 包括日期数据类型 | 否 | 是 |
注:Oracle AI Database JSON Developer’s Guide 可更全面地比较 XML 和 JSON
原生数据库支持 JSON
JSON 广泛存储在缺少关系数据库功能的 noSQL 数据库中。相比之下,Oracle Database 原生支持 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 Database 在解析和查询 JSON 数据时会在内部使用 UTF8。如果从此类处理输入或输出的数据必须与 UTF8 不同的字符集,则会自动执行相应的字符集转换。注:Oracle AI Database JSON Developer’s Guide,更全面地介绍 Oracle Database 中的 JSON 支持
LOB 概览
大对象 (LOB) 数据类型允许您以二进制或字符格式存储和处理大型非结构化数据块。
大对象 (LOB) 数据类型提供了对数据的高效、随机、分段访问。
-
内部 LOB 内部 LOB 将数据存储在数据库本身中,而不是存储在外部文件中。
-
外部 LOB
BFILE(二进制文件大对象或 LOB)是外部大对象。 -
SecureFiles SecureFiles LOB 存储是两种存储类型之一;另一种类型是 BasicFiles LOB 存储。
内部 LOB
内部 LOB 将数据存储在数据库本身中,而不是存储在外部文件中。
内部 LOBS 包括以下内容:
-
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 时,数据库将分配一个新块并保留旧数据。如果事务处理回退,则数据库会将更改回退到指向旧块的索引。
外部 LOB
BFILE(二进制文件大对象或 LOB)是外部大对象。
BFILE 是外部 LOB,因为数据库在操作系统中存储指向文件的指针。外部数据是只读的。
BFILE 使用目录对象来查找数据。使用的空间量取决于目录对象名称的长度和文件名的长度。
BFILE 使用的读一致性机制与内部 LOBS 不相同,因为二进制文件在数据库外部。如果文件中的数据发生更改,则从同一二进制文件重复读取可能会产生不同的结果。
SecureFile
SecureFiles LOB 存储是两种存储类型之一;另一种类型是 BasicFiles LOB 存储。
SECUREFILE LOB 参数启用高级功能,包括压缩和重复数据删除(高级压缩选项的一部分)和加密(高级安全选项的一部分)。从 Oracle Database 12c 开始,SecureFiles 是 LOB 的默认存储机制。
另请参见:
-
Oracle AI Database SecureFiles and Large Objects Developer’s Guide 了解有关 LOB 数据类型的更多信息
Oracle Text 概览
Oracle Text (Text) 是一种与 Oracle Database 集成的全文检索技术。Oracle Text 为存储在文件系统、数据库或 Web 上的任何文档或文本内容编制索引。可以根据文档的文本内容、元数据或属性来搜索这些文档。
Oracle Text 具有以下优势:
-
Oracle Text 允许在单个 SQL 语句中将文本搜索与常规数据库搜索组合使用。文本索引位于数据库中,文本查询在 Oracle Database 进程中运行。优化程序可以为任何查询选择最佳执行计划,从而为涉及文本和结构化标准的即席查询提供最佳性能。
-
您可以将 Oracle Text 与 XML 数据配合使用。特别是,您可以结合使用
XMLIndex和 Oracle Text 索引,同时利用 XML 和全文索引。 -
借助 Oracle Text SQL API,您可以轻松、直观地创建和维护 Oracle Text 索引并运行搜索。
对于用例,假设您必须为销售电子设备的招标地点创建目录索引。每天都会添加新的库存。商品说明、投标日期和价格必须一起存储。应用程序需要良好的混合查询响应时间。首先,创建并填充 catalog 表。然后,使用 Oracle Text 创建 CTXCAT 索引,您可以在 SELECT ... WHERE CATSEARCH 语句中使用 CATSEARCH 运算符进行查询。图 23-4 说明了目录表、其 CTXCAT 索引以及使用 CATSEARCH 运算符查询索引的目录应用程序之间的关系。
图 4:目录查询应用程序

另请参见:
Oracle Spatial and Graph 概览
Oracle Spatial and Graph(空间和图形)包括用于空间数据和分析以及物理、逻辑、网络以及社交和语义图形应用程序的高级功能。
空间功能提供方案和函数,以便于在 Oracle 数据库中存储、检索、更新和查询空间功能的集合。空间数据的一个例子是路线图。空间数据表示地图上对象的地球位置(例如经度和纬度)。渲染地图时,此空间数据可以将对象的位置投射到二维纸上。地理信息系统 (GIS) 可以存储、检索和呈现这些地球相关的空间数据。当 Oracle 数据库存储此空间数据时,可以使用 Spatial 和 Graph 来处理和检索此数据,并将此数据与其他数据关联。
另请参阅:Oracle Spatial Developer’s Guide
SQL 属性图形概览
Oracle Database 的属性图形功能为 Oracle Database 提供了强大的图形支持。
利用属性图形功能,您可以为产品推荐、欺诈检测、风险分析、有针对性的营销等应用探索和发现客户数据、社交网络和财务交易等数据集中的复杂关系。此高性能图形功能提供近 60 个预构建算法的高级图形查询语言支持、开发人员 API 和分析功能。
从 Oracle Database 12。2 开始,提供了包括 PGQL(Property Graph Query Language,属性图形查询语言)支持在内的属性图形功能。从 Oracle Database 发行版 26ai 开始,您还可以使用 SQL(如 SQL:2023 标准中所定义)创建和查询属性图形。
Oracle Graph Server and Client 是与 Oracle Database 中的属性图形功能一起使用的软件包。它包括用于运行图形分析算法的图形工具、客户端库和 Oracle Graph Server。
相关主题