当前位置: 代码迷 >> 综合 >> Oracle 19c Concepts(19):Concepts for Database Developers
  详细解决方案

Oracle 19c Concepts(19):Concepts for Database Developers

热度:19   发布时间:2024-01-06 06:11:29.0
数据库开发人员的职责

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

Oracle 开发人员要么在 Oracle 数据库环境中开发新的应用程序, 或者转换一个现有的应用程序以便在其中运行。因此, 开发人员会与数据库管理员紧密合作, 并分享知识和信息。

Oracle 数据库开发人员可能涉及以下任务:

  • 实现应用程序所需的数据模型

  • 创建模式对象

  • 实施数据完整性规则

  • 为一个新的开发项目选择编程环境

  • 编写服务器端 PL/SQL 或 Java 子程序, 和客户端使用的 SQL 语句的程序代码

  • 使用所选择的开发工具创建应用程序接口

  • 为开发全球化应用程序建立全球化支持环境

  • 为开发、 测试、 培训等, 在不同的数据库中实例化应用程序,并在生产环境中部署

另见:

  • 《Oracle Database 2 Day Developer's Guide》获取Oracle数据库开发中的介绍和基于GUI的教程

  • 《Oracle Database Development Guide》用于深入讨论数据库设计、开发人员的SQL和开发人员的PL/SQL等主题

数据库开发人员的工具

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

SQL Developer

SQL Developer是数据库开发人员使用SQL*Plus编辑和开发基本任务的一种方便方法。

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

  • 浏览、 创建、 编辑、 和删除模式对象

  • 运行 SQL 语句

  • 编辑和调试 PL/SQL 程序单元

  • 操作和导出数据

  • 创建和显示报表

SQL Developer 在默认的 Oracle 数据库安装中就可用, 并提供免费下载。

另见:

《Oracle Database 2 Day Developer's Guide》 和《Oracle SQL Developer User's Guide》了解如何使用 SQL Developer

Oracle Application Express

Oracle Application Express 是针对 Oracle 数据库的 Web 应用程序开发工具。Oracle Application Express 使用一些内置的功能, 如用户界面主题、 导航控件、 表单处理程序和灵活的报表, 来加快应用程序的开发。

Oracle Application Express 与数据库安装在一起, 并由一些数据表和PL/SQL 代码组成。当你运行一个应用程序时, 您的浏览器发送的 URL 请求被翻译成一个 Oracle Application Express 的 PL/SQL 调用。 当数据库处理了 PL/SQL 后,结果将以 html 格式返回浏览器。每发一次请求或提交一个页面时,都会像这样反复发生。

您可以将 Oracle APEX 与嵌入式 PL/SQL 网关一起使用。网关在数据库中的 XML DB 的 HTTP 服务器上运行,并提供必要的基础结构,以创建动态的应用程序。如图 19-1 中的嵌入式 PL/SQL 网关通过消除中间层, 从而简化了应用程序体系结构。

图 19-1 Application Express 与嵌入式 PL/SQL 网关


Description of "Figure 19-1 Application Express with Embedded PL/SQL Gateway"
Oracle JDeveloper

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

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

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

另见:

  • 《Oracle Database 2 Day + Java Developer's Guide》了解如何使用 JDeveloper

  • 您可以从下面的 URL 下载 JDeveloper:http://www.oracle.com/technetwork/developer-tools/jdev/downloads/

Oracle 开发工具 for Visual Studio.NET

Oracle 开发工具 for Visual Studio .NET 是一组与 Visual Studio.NET 集成在一起的应用程序开发工具。

Oracle Developer Tools for Visual Studio .NET 工具提供图形用户界面来访问 Oracle 功能,使用户能够执行广泛的应用程序开发任务,提高开发效率和易用性。

Oracle 开发工具支持使用 Visual Basic、 C#、 和其他.NET 语言来编写和实现 .NET 存储过程。这些过程是用某种.NET 语言编写的,并且其中包含 SQL 或 PL/SQL 语句。

数据库开发人员的主题

本节介绍之前从未讨论过的、对数据库开发人员最重要的主题。

应用程序设计和优化的原则

Oracle 开发人员必须设计、 创建、 并优化数据库应用程序, 使其实现安全性和性能目标。 

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

  • 了解 Oracle 数据库的工作原理

    作为一名开发人员,您希望在最少的时间内,完成对跑在某个 Oracle 数据库上的应用程序的开发工作,而这需要充分利用数据库的体系结构和功能特性。例如,假如不了解 Oracle 数据库的并发性控制和多版本读取一致性,就可能造成应用程序破坏数据完整性、 运行速度很慢、 和降低可扩展性。了解事务保护和应用程序连续性如何工作,可以避免编写不必要的异常处理代码。
  • 除非有充分的理由不使用绑定变量,否则请使用绑定变量

    当查询使用了绑定变量时,数据库可以仅对其编译一次,并将其查询计划存储在共享池中。 当再次执行同一语句时,数据库可以执行一次软解析,并重新使用该计划。 相比之下, 硬解析需要花更长时间,并使用更多的资源。使用绑定变量以允许软解析非常有效, 也是 Oracle 数据库的推荐做法。

  • 在服务器服务端端(而不是在客户端)实现完整性约束

    使用主键和外键使得数据可以在多个应用程序中被重用。 将业务规则编写在客户端,意味着跑在该数据库上的其他客户端并不能访问这些规则。

  • 使用有代表性的数据和会话活动,来建立测试环境

    一个模拟您的生产环境的测试环境能提供很多好处。例如,你可以对该应用程序做基准测试, 以确保它具有良好的可扩展性和性能。此外,您可以使用测试环境测量数据库变更对性能的影响,并确保升级和补丁程序能正常工作。

  • 设计具有良好性能目标的数据模型

    通常,尝试使用通用的数据模型会导致较差的性能。设计完善的数据模型能尽可能高效响应最常见的查询。例如, 数据模型应该使用能提供最佳性能的索引类型。 在部署后再来优化是很不可取的, 因为逻辑和物理结构的更改可能会很困难或根本不可能。

  • 定义明确的性能目标,并保存历史度量记录

    开发的一个重要方面是, 确定应用程序的预期性能和可扩展性要达到什么水准。 例如,您应该使用的度量包括预期的用户负载、 每秒事务量、 可接受的响应时间等。好的实践证明, 您应该维护性能指标的历史记录。 这样,你可以主动地或被动地监视性能

  • 在应用程序代码中加入调试、跟踪功能

    良好的开发习惯包括将调试代码添加到您的应用程序中。生成跟踪文件的能力对调试和诊断性能问题很有用。

另见:

  • "SQL Parsing"

  • "Introduction to Data Concurrency and Consistency"

  • "Advantages of Integrity Constraints"

  • 《Oracle Database 2 Day Developer's Guide》关于设计和部署数据库应用程序时的注意事项

  • 《Oracle Database SQL Tuning Guide》学习如何为性能设计应用程序

客户端数据库编程

您可以使用预编译器或Java翻译器在源代码中放置SQL语句,或者使用api使应用程序能够与数据库交互。

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

另见:

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

《Server-Side Programming: PL/SQL and Java》回顾

嵌入式 SQL

由于历史原因,客户端/服务器程序使用嵌入式 SQL 与数据库进行交互。

Oracle 预编译器

客户端/服务器程序通常是使用预编译器,使用这种编程工具,使您可以将 SQL 语句嵌入在高级语言程序中。

例如 Oracle Pro*C/C++ 的预编译器, 使你可以在 C 或 C++ 源文件中嵌入 SQL 语句。此外, Oracle 预编译器也可用于 COBOL 和 FORTRAN。

预编译器提供了以下几个好处:

  • 提高生产效率,因为相比等效的 OCI 应用程序, 您通常只需要写更少的代码

  • 使您能够创建高度自定义的应用程序

  • 允许对资源的使用、 SQL 语句的执行、 和各项运行时指标进行密切监控

  • 因为预编译器替你将每个嵌入式 SQL 语句转换为对 Oracle 数据库运行时库的调用, 节省了时间

  • 使用对象类型转换器将 Oracle 数据库对象类型和集合映射到将在 Pro*C/C++应用程序中用到的数据类型

  • 提供了对象类型和集合的编译时类型检查, 和从数据库类型到 C 数据类型的自动类型转换

包含 SQL 语句的客户端应用程序是宿主程序。此程序是用宿主语言写的。在宿主程序中,你可以混合使用完整的 C 语句和完整的 SQL 语句, 或在 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 说明了使用预编译器开发程序的典型步骤。

图 19-2 使用预编译器的程序开发


Description of "Figure 19-2 Program Development with Precompilers"

另见:

《Pro*C/C++ Programmer's Guide》关于 Pro*C/C++预编译器的完整说明

SQLJ

SQLJ 是一个针对在 Java 源代码中嵌入 SQL 语句的 ANSI SQL-1999 标准。 SQLJ 提供了一个对在 Java 客户端使用 Java 数据库连接 (JDBC) API 进行 SQL 数据访问的简单替代方案。

SQLJ 接口是 Pro*接口的 Java 等效接口。您在 Java 源代码中插入 SQL 语句。 之后,您将 Java 源代码文件提交给 SQLJ 翻译器,它将嵌入式 SQL 转换为基于 JDBC 的纯 Java 代码。

另见:

"SQLJ"

客户端 API

绝大多数的开发人员如今在其数据库应用程序中使用 API 以嵌入 SQL。

例如, 两个流行的使程序能与 Oracle 数据库进行通信的 API, 是开放式数据库连接 (ODBC) 和 JDBC。 另外两个常见的客户端编程 API 是 Oracle 调用接口 (OCI) 和 Oracle C++调用接口(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 程序,避免单独的预处理或预编译步骤。图 19-3 说明了这种开发过程。

图 19-3 使用 OCI 或 OCCI 时的开发过程


Description of "Figure 19-3 Development Process Using OCI or OCCI"

另见:

  • 《Oracle Call Interface Programmer's Guide》

  • 《Oracle C++ Call Interface Programmer's Guide》

ODBC 和 JDBC

ODBC 是一个标准的 API,使应用程序能够连接到数据库,然后准备和运行 SQL 语句。 

ODBC 独立于编程语言、 数据库、 和操作系统。 ODBC 的目标是使任何应用程序可以访问任何数据库中包含的数据。

数据库驱动程序是位于应用程序和数据库之间的软件。驱动程序将应用程序发出的 API 调用转换为可以由数据库处理的命令。通过使用 ODBC 驱动程序,应用程序可以访问任何数据源, 包括存储在电子表格中的数据。 ODBC 驱动程序执行 ODBC 标准和数据库之间的所有映射。

由 Oracle 提供的 Oracle ODBC 驱动程序, 使符合 ODBC 的应用程序能访问 Oracle 数据库。例如, 在一个用 Visual Basic 编写的应用程序可以使用 ODBC 查询和更新 Oracle 数据库中的一个表。

JDBC 是一个低级的 Java 接口,使 Java 应用程序能与数据库进行交互。 与 ODBC 类似, JDBC 是独立于供应商的 API。 JDBC 标准是由太阳微系统公司定义的,并通过 java.sql 接口实现。

JDBC 标准使各个提供商来实现和扩展他们自己的 JDBC 驱动程序。 Oracle 为客户端编程提供以下的 JDBC 驱动程序:

  • JDBC thin driver

    这个纯 Java 驱动程序驻留在没有 Oracle 安装客户端软件的客户端主机上。它是独立于平台的,并能与小应用程序和应用程序一起使用。

  • JDBC OCI driver

    此驱动程序驻留在安装了 Oracle 客户端软件的客户端主机上。 它只能用于应用程序。 JDBC OCI 驱动程序是用 C 和 Java 编写的,它将 JDBC 调用转换为 OCI 调用。

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

// Create a statement
Statement stmt = conn.createStatement();// Query dual table
ResultSet rset = stmt.executeQuery("SELECT 'Hello World' FROM DUAL");

另见:

《Oracle Database Development Guide》 和《Oracle Database 2 Day + Java Developer's Guide》学习 JDBC

全球化支持

Oracle 数据库的全球化支持, 使您能够按本地语言来存储、 处理、 并检索数据。

全球化支持允许您开发多语言应用程序和软件, 同时可以从世界上的任何位置访问和运行。

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

  • 了解 Oracle 数据库全球化支持体系结构, 包括不同的字符集、 地域、 语言、 和语言的排序定义等属性

  • 了解他们的中间层编程环境的全球化功能, 包括如何与数据库的区域设置模式进行交互并保持同步

  • 设计和编写代码, 能够同时支持运行在不同操作系统上,具有不同的字符集和语言环境要求的多个客户端

例如, 应用程序可能需要按本机用户的语言和区域设置首选项,在用户界面显示其内容和处理数据。 例如,应用程序必须能够处理多字节汉字数据, 按适当的区域格式显示消息和日期,能够处理 7 位 ASCII 数据而无需用户更改设置。

另见:

《Oracle Database Globalization Support Guide》有关全球化的详细信息

全球化支持环境

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

Oracle 数据库提供全球化支持的功能,例如:

  • 本机语言和地区

  • 日期、 时间、 数字、 和货币的本机格式

  • 日历系统 (公历、 日本日历、 皇历、 泰历等等)

  • 包括 Unicode 在内的多种字符集

  • 字符语义

字符集

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

以下区别对应用程序开发很重要:

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

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

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

计算机行业使用很多编码字符集。这些集合在可用字符及其数目、 分配给每个字符的代码点等方面都有所不同。 Oracle 数据库支持大多数的国家字符集、 国际字符集、 和特定于供应商的编码字符集等标准。

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

  • 单字节字符集

    每个字符占一个字节。 7 位字符集的一个例子是 US7ASCII。 8 位字符集的一个例子是 WE8DEC。

  • 多字节字符集

    每个字符占用多个字节。多字节字符集通常用于亚洲语言。

  • Unicode

    通用编码字符集, 使你能够通过使用一种单一字符集,来存储任何一种语言的信息。 Unicode 为每个字符提供了一个唯一的编码值,而无论其平台、 程序、 或语言。

另见:

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

特定于区域的设置

区域设置是某个系统或程序正在其中运行的语言和文化环境。 由 NLS 参数确定客户端和数据库所在的特定区域的行为。

执行客户端语句时,数据库会话使用 NLS 设置。例如, 数据库为客户端使用正确的千位分隔符区域用法。通常, 由客户机主机上的 NLS_LANG 环境变量, 指定服务器会话和客户端应用程序的区域设置。该过程如下所示:
  1. 当客户端应用程序启动时, 它根据其环境设置初始化客户端 NLS环境。

    所有 NLS 操作都在本地执行,例如, 在 Oracle Developer 应用程序中使用这些设置的显示格式。

  2. 当客户端与数据库连接并进行通信时,使用由 NLS_LANG 定义的信息格式。

  3. 数据库会话基于客户端的通信设置, 初始化其 NLS 环境。

    如果客户端没有指定设置, 则会话使用初始化参数文件中的设置。 仅当客户端未指定任何 NLS 设置时, 数据库才会使用初始化参数设置。如果客户端指定了某些 NLS 设置, 则其余的 NLS 设置将保持默认值。

每个为客户端应用程序启动的会话, 可能与其他会话运行在相同或不同的区域设置。例如, 一个会话可能会使用德语区域设置,而另一个可能会使用法语区域设置。每个会话还可能指定了相同或不同的语言要求。

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

表 19-1 特定于区域设置的 NLS 设置

t Client Host 1 Client Host 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 Database 2 Day + Java Developer's Guide》《Oracle Database Globalization Support Guide》了解 NLS 设置

Oracle 全球化开发工具包

Oracle全球化开发工具包(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 Database Globalization Support Guide》

非结构化数据

非结构化数据是指没有分解成更小的逻辑结构的数据。

传统关系模型处理适用于简单表的简单结构化数据。 Oracle 数据库也支持非结构化数据,这种数据不能被分解成标准的组件。非结构化的数据包括文本、 图像、 视频剪辑、 和声音波形。

Oracle 数据库包含用于处理非结构化内容的数据类型。这些数据类型在数据库中显示为本机类型,并且可以使用 SQL 查询。

Oracle 数据库中的 XML 的概述

Oracle XML DB 是一组高性能 XML 存储和检索相关的 Oracle 数据库技术。 XML 数据库提供本机 XML 支持的可互操作的方式, 包括 SQL 和 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 ordersVALUES (XMLType(BFILENAME('XMLDIR','purOrder.xml'),NLS_CHARSET_ID('AL32UTF8')));

前例还创建一个SQL 目录对象,它是数据库中针对主机计算机上某个物理目录的逻辑名称。此目录下包含 XML 文件。该示例将来自 purchaseOrder.xml 文件的

XML 内容插入 orders 表。

Oracle XML 开发人员工具包 (XDK) 中包含用于在文件系统或数据库中读取、 操作、 转换、 和查看 XML 文档的基本构造块。 其 API 和工具可用于 Java、C 和 C++。Oracle XDK 产品完全受支持,并需要一个商用重发布许可证。

例 19-1 XMLType

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

另见:

  • 《Oracle XML DB Developer’s Guide》

  • 《Oracle XML Developer's Kit Programmer's Guide》

Oracle 数据库中的 JSON 的概述

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

JSON是什么?

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

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

JavaScript 对象是由零对或多对属性名和关联 JSON 值组成的关联数组。JSON 对象是一个JavaScript 对象文本,它被写成一个用大括号括起来的属性列表,名称-值对用逗号分隔,每对的名称和值用冒号分隔。对象属性有时称为键。对象属性名值对有时称为对象成员。

例 19-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 有一个数组作为值。

JSON 和 XML

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

由于 JSON 数据具有简单的定义和特性,因此它通常比 XML 数据更容易生成、解析和处理。它也更容易为人类学习和使用。下表描述了 JSON 和 XML 之间的进一步差异。

表 19-2 JSON 和 XML 之间的差异

特性 JSON XML
适用于简单的结构化数据 是,但也支持半结构化数据和复杂结构化数据
对于混合内容非常有用
缺少属性、名称空间、继承和替换
重视排序
主要用于文档而不是数据
包括日期数据类型
原生数据库支持JSON

JSON 广泛存储在缺乏关系数据库特性的 no SQL 数据库中。相反,Oracle数据库通过事务、索引、声明性查询和视图等特性支持JSON。

可以像访问其他数据库数据一样访问存储在数据库中的 JSON 数据,包括使用 OCI、.NET 和 JDBC。与使用 SQL 数据类型 XMLType 存储的XML 数据不同,JSON 数据使用 VARCHAR2、BLOB 或 CLOB 存储。通过使用 Oracle SQL,可以对 JSON 数据执行以下操作:

  • 将 JSON 数据与非 JSON 关系数据连接起来。

  • 使用 SQL 函数 json_object 和 json_array 从关系数据生成 JSON 文档。

  • 通过使用 SQL 函数 json_table 将 JSON 数据项目化为关系格式。

  • 使用 is_json 创建一个检查约束来强制执行列中的 JSON 数据。数据库使用 check 约束来确认该列是 JSON,用于 JSON 特定的操作,比如简化语法。

  • 将 JSON 文档操作为 PL/SQL 对象。

  • 使用 SQL 函数 json_query 和 json_value 接受 Oracle JSON 路径表达式作为参数,并将其与目标 JSON 数据匹配。
  • 索引 JSON 数据。

  • 查询存储在外部表中的 JSON 数据。

  • 使用 Oracle GoldenGate 复制包含 JSON 数据列的表。

文本 JSON 数据总是使用 Unicode 字符集,无论是 UTF8 还是 UTF16。Oracle 数据库在内部使用 UTF8 解析和查询 JSON 数据。如果输入或输出的数据与 UTF8 的字符集不同,则会自动执行适当的字符集转换。

例 19-3 创建、加载和查询带有JSON列的表

在本例中,使用 JSON 列 po_document 创建表 j_purchaseorder,然后插入一些简单的 JSON 数据。有些数据被省略了(…)。

CREATE TABLE j_purchaseorder(id          RAW (16) NOT NULL,date_loaded TIMESTAMP WITH TIME ZONE,po_document CLOBCONSTRAINT ensure_json CHECK (po_document IS JSON));INSERT INTO j_purchaseorderVALUES (SYS_GUID(),SYSTIMESTAMP,'{"PONumber" : 1600,"Reference" : "ABULL-20140421","Requestor" : "Alexis Bull","User" : "ABULL","CostCenter" : "A50","ShippingInstructions" : {...}"Special Instructions" : null,"AllowPartialShipment" : true,"LineItems" : [...]}');

下面的查询提取 JSON 列 po_document 中的对象 PONumber:

SELECT po.po_document.PONumber FROM j_purchaseorder po;
LOB 概述

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

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

内部 LOB

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

内部 LOB 包括:

  • CLOB(字符 LOB)按数据库字符集存储大量的文本,如文本或 XML文件

  • NCLOB(国家字符集 LOB)存储 Unicode 数据

  • BLOB (二进制 LOB),将大量的二进制信息存储为位流,并不受字符集转换的限制

该数据库以与其他数据类型不同的方式存储 LOB。创建一个 LOB 列会隐式创建一个 LOB 段和一个 LOB 索引。LOB 段及其LOB 索引总是一起存储在同一表空间中, 但它可能不同于包含表的表空间。

LOB 段将数据存储为称作大块的片断。 大块是一组逻辑上连续的数据块,是 LOB 的最小分配单位。 表中的一个行存储一个叫做 LOB 定位器的指针,指向 LOB 索引。当查询表时,数据库将使用 LOB 索引可以快速找到各个 LOB 块。

数据库管理 LOB 段的读取一致性的的方式不同于其他数据。该数据库不是使用撤消数据来记录更改,而是将前像存储在段本身之中。当一个事务更改了 LOB 时,数据库分配一个新的大块,并原地保留旧数据。如果事务回滚, 则数据库回滚对索引所做的更改,以指向旧的大块。

另见:

  • "User Segment Creation"

  • "Read Consistency and Undo Segments"

外部 LOB

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

BFILE (二进制文件 LOB) 是一个外部 LOB,因为数据库存储了指向操作系统中的某个文件的指针。外部数据是只读的。

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

因为二进制文件是在数据库外部的,所以 BFILE 不使用与内部 LOB 相同的读取一致性机制。如果数据文件更改了, 则重复读取同一个二进制文件可能会产生不同的结果。

安全文件

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

SECUREFILE LOB 参数使其具有高级特性,包括压缩、重复数据删除 (高级压缩选项的一部分)和加密 (高级安全选项的一部分)。从 Oracle 数据库 12c 开始,SecureFiles是lob的默认存储机制。

另见:

  • "Oracle Data Types"

  • 《Oracle Database SecureFiles and Large Objects Developer's Guide》了解有关 LOB数据类型的更多信息

Oracle 文本的概述

Oracle 文本 (文本) 是一种与 Oracle 数据库准确的全文检索技术。Oracle 文本能索引任何文档, 或存储在文件系统、 数据库、或 Web 上的文字内容。您可以基于其文本内容、 元数据、 或属性来搜索这些文档。

Oracle 文本提供了以下优势:

  • Oracle 文本可在一个单独的 SQL 语句中结合使用文本搜索与常规数据库搜索。文本索引存储在数据库中, 文本查询是在 Oracle 数据库进程中运行的。优化程序可以为任何查询选择最佳的执行计划, 为涉及文本和结构化条件的特殊查询提供最佳性能。

  • 您可以在 Oracle 文本中使用 XML 数据。特别是,您可以组合使用 XMLIndex 与 Oracle 文本索引、 同时利用 XML 和全文本索引的优势。

  • Oracle 文本 SQL API 使创建和维护 Oracle 文本索引并运行搜索,变得简单和直观。

举一个使用案例, 假设您必须为一个销售电子设备的拍卖网站创建目录索引。 每一天都有新库存清单加入。 项目说明、 投标日期、 和价格必须一起存储。应用程序要求对各种查询都要有好的响应时间。首先,您创建并填充一个 catalog 表。然后您使用 Oracle 文本创建一个 CTXCAT 的索引,您可以在 SELECT ... WHERE CATSEARCH 语句中进行带有 CATSEARCH 运算符的查询。

图 19-4 说明了目录表、 它的 CTXCAT 索引、 和使用 CATSEARCH 运算符来查询索引的目录应用程序之间的关系。

图 19-4 目录查询应用程序


Description of "Figure 19-4 Catalog Query Application"

另见:

  • 《Oracle Text Application Developer's Guide》《Oracle Text Reference》

  • 《Oracle XML DB Developer’s Guide》了解如何在 XML 数据中执行全文搜索

Oracle空间和图形概述

Oracle 空间和图形 (空间和图形) 包括用于空间数据和分析以及物理、逻辑、网络、社会和语义图应用程序的高级特性。

空间特性提供了一个模式和函数,可以方便地在 Oracle 数据库中存储、检索、更新和查询空间特性集合。空间数据的一个例子是路线图。空间数据表示地图上对象的地球位置(如经度和纬度)。当地图被渲染时,这个空间数据可以在一张二维的纸上投射出物体的位置。地理信息系统(GIS)可以存储、检索和呈现这些与地球相关的空间数据。当 Oracle 数据库存储此空间数据时,可以使用空间和图形操作和检索该数据,并将该数据与其他数据关联。

另见:

《Oracle Spatial and Graph Developer's Guide》

  相关解决方案