本研讨会中的实验将引导您完成开始使用 Oracle 自治数据库的所有步骤。 首先,您将创建一个 Oracle 自治数据库实例。 然后,您将练习使用自治数据库工具和 API 从不同位置以不同格式加载数据的几种方法。 您将使用 SQL 分析数据并使用 Oracle Analytics Cloud 构建分析仪表板。
此实验申请地址在这里。
实验帮助在这里。
此实验预估完成时间90分钟。如果不包括实验5:数据可视化,我用了2个小时。
本实验的作者为Nilay Panchal,贡献者为Richard Green。
Oracle MovieStream 是一种虚构的电影流服务 - 类似于您当前订阅的服务。 他们面临着许多跨行业组织所面临的典型挑战。 MovieStream 必须:
Oracle 云提供的平台,可以高效地交付安全、有洞察力、可扩展和高性能的解决方案。 MovieStream 利用 Oracle 自治数据库和 Oracle 云基础设施 (OCI) 数据湖服务设计了他们的解决方案。他们的数据架构遵循 Oracle 参考架构企业数据仓库 - 一个集成数据湖。回顾架构是值得的,这样您就可以了解集成数据湖和数据仓库的价值 - 因为它使您能够使用所有数据回答更复杂的问题。
在本次研讨会中,我们将从 MovieStream 架构的两个关键组件开始。 MovieStream 正在跨 Oracle 对象存储和自治数据库存储他们的数据。数据从各种来源捕获到对象存储中的着陆区。然后对这些数据进行处理(清理、转换和优化)并存储在对象存储的黄金区域中。整理数据后,将其加载到自治数据库中,由用户社区的许多(和不同的)成员进行分析。
研讨会目标
本实验室将引导您完成开始使用 Oracle 云上的 Oracle 自治数据库(自治数据仓库 [ADW] 或自治事务处理 [ATP]都可以。)的步骤。 在本实验中,您将预配一个新的 ADW 实例。
创建一个Shared Infrastructure下的ADW。
服务供应时间如下,耗时40秒:
Mon, Nov 21, 2022, 08:32:33 UTC 到 Mon, Nov 21, 2022, 08:33:13 UTC
自治数据仓库的典型工作流程的文档见这里。
在本实验中,您将使用 SQL 工作表探索 Oracle 自治数据仓库 (ADW) 或自治事务处理 (ATP) 实例随附的示例数据集。
本实验使用 SQL 工作表,它是 Oracle 自治数据库的数据库操作基于 Web 的界面的功能之一。
本实验将演示对 ADW 开箱即用提供的示例数据集的查询。 ADW 提供 Oracle 销售历史示例模式和星型模式基准 (SSB) 数据集。 这些数据集分别位于 SH 和 SSB 模式中。
您将对 SSB 数据集运行基本查询,该数据集是一个 1 TB 的数据集,其中包含一个包含大约 60 亿行的事实表和几个维度表。
Database Action菜单,以ADMIN用户登录。在Development部分,单击SQL。
在SQL Worksheet中输入以下SQL并运行:
select /* low */ c_city,c_region,count(*)
from ssb.customer c_low
group by c_region, c_city
order by count(*);
如果可能,ADW 还会为您缓存查询结果。 如果您多次运行相同的查询,您会注意到结果被缓存后的响应时间要短得多。以下为第1次到第5次运行的时间。
Execution time: 0.221 seconds
Execution time: 0.008 seconds
Execution time: 0.008 seconds
Execution time: 0.009 seconds
Execution time: 0.008 seconds
在本实验中,您将使用本地文件系统中的示例数据创建和加载 Oracle 自治数据库表,将文件上传到 Oracle 云基础设施 (OCI) 对象存储,使用 OCI 对象存储上的文件中的数据创建和加载表 , 并对有错误的数据加载进行故障排除。
您可以使用 Oracle 数据库工具以及 Oracle 和第三方数据集成工具将数据加载到新的 Oracle 自治数据库(Oracle 自治数据仓库 [ADW] 或 Oracle 自治事务处理 [ATP])中。 您可以从以下数据源加载数据:
预计时间:30 分钟
目标
您需要将包含 CHANNELS 信息的 .csv 文件下载到本地计算机,然后在下一个任务中使用它来填充 ADW 数据库中的 CHANNELS_LOCAL 表。 单击此链接下载示例 channels.csv 文件并将其保存到本地计算机上的目录中。此文件约1KB。
Database Actions菜单,ADMIN用户登录,Data Tools 部分, 单击 DATA LOAD和LOCAL FILE,单击“下一步”,然后选择刚刚下载的文件。最后选择Run。
这个目标表是在加载时创建的,之前并没有。
Name Null? Type
---------------- ----- ------------
CHANNEL_ID NUMBER
CHANNEL_DESC VARCHAR2(64)
CHANNEL_CLASS VARCHAR2(64)
CHANNEL_CLASS_ID NUMBER
CHANNEL_TOTAL VARCHAR2(64)
CHANNEL_TOTAL_ID NUMBER
现在,您将下载一个 zip 文件,其中包含您将暂存到 OCI 对象存储的数据文件,以便在以后的任务中填充多个表。
单击此处下载示例源文件的 zip 文件并解压,此文件约6MB。
在OCI Console中,进入Object Storage服务并创建bucket。bucket的名称在整个租户内必须唯一。
解压刚下载的文件并上传,可以批量上传。
获取此 URL 的最简单方法是单击对象存储中任何已上传文件右侧的省略号菜单中的View Object Details。
类似于linux中的dirname,之后会作为参数Bucket URI:
$ dirname https://objectstorage.ap-seoul-1.oraclecloud.com/n/c4u04/b/bucket-20221121-1704-ADW/o/chan_v3.dat
https://objectstorage.ap-seoul-1.oraclecloud.com/n/c4u04/b/bucket-20221121-1704-ADW/o
要从 Oracle 云基础设施 (OCI) 对象存储加载数据,您需要一个具有适当权限的 OCI 用户才能将数据读取(或上传)到对象存储。 数据库和对象存储之间的通信依赖于本机 URI 和 OCI 用户 Auth Token。
生成Auth Token,并立即保存,因为之后就看不到了:
BlM)****dmt6
仍然以ADMIN用户进入Database Actions,单击Data Studio部分的DATA LOAD。
然后选择 Administration部分的CLOUD LOCATIONS。单击右上角Add Cloud Store Location。
单击LOAD DATA和CLOUD STORAGE,然后下一步。将CSV文件拖拽到右边,需要改一下目标表的名字。
这两个表很小,很快就加载成功了。
作为向导引导的数据加载的替代方法,您可以直接使用 PL/SQL 包 DBMS_CLOUD。 这是任何负载自动化的首选。
为了获得最快的数据加载体验,Oracle 建议在将数据加载到 ADW 或 ATP 数据库之前将源文件上传到基于云的对象存储,例如 Oracle 云基础设施对象存储。
要将数据从云存储中的文件加载到 Oracle 自治数据库中,请使用 PL/SQL DBMS_CLOUD 包。 DBMS_CLOUD 包支持从以下云源加载数据文件:Oracle Cloud Infrastructure Object Storage、Oracle Cloud Infrastructure Object Storage Classic、Amazon AWS S3、Microsoft Azure Cloud Storage 和 Google Cloud Storage。
此任务显示如何使用 DBMS_CLOUD 包中的两个过程从 Oracle 云基础设施对象存储加载数据:
与数据库操作 DATA LOAD 工具为您提供在数据加载过程中自动创建目标 Oracle 自治数据库表的选项的早期任务不同,以下使用 DBMS_CLOUD 包加载的步骤要求您预先创建目标表。
在 SQL Worksheet 中以 ADMIN 用户身份连接,复制并粘贴此代码片段以将所需的表创建到工作表中。 花点时间检查脚本。 在创建表之前,您将首先删除任何具有相同名称的表。 然后单击“运行脚本”按钮运行它。
DROP TABLE sales;
DROP TABLE customers;
DROP TABLE countries;
DROP TABLE supplementary_demographics;
DROP TABLE costs;
DROP TABLE times;
DROP TABLE promotions;
DROP TABLE products;
DROP TABLE channels;
CREATE TABLE sales (
prod_id NUMBER NOT NULL,
cust_id NUMBER NOT NULL,
time_id DATE NOT NULL,
channel_id NUMBER(6) NOT NULL,
promo_id NUMBER NOT NULL,
quantity_sold NUMBER(10,2) NOT NULL,
amount_sold NUMBER(10,2) NOT NULL);
CREATE TABLE costs (
prod_id NUMBER NOT NULL,
time_id DATE NOT NULL,
promo_id NUMBER NOT NULL,
channel_id NUMBER(6) NOT NULL,
unit_cost NUMBER(10,2) NOT NULL,
unit_price NUMBER(10,2) NOT NULL);
CREATE TABLE times (
time_id DATE NOT NULL,
day_name VARCHAR2(9) NOT NULL,
day_number_in_week NUMBER(1) NOT NULL,
day_number_in_month NUMBER(2) NOT NULL,
calendar_week_number NUMBER(2) NOT NULL,
fiscal_week_number NUMBER(2) NOT NULL,
week_ending_day DATE NOT NULL,
week_ending_day_id NUMBER NOT NULL,
calendar_month_number NUMBER(2) NOT NULL,
fiscal_month_number NUMBER(2) NOT NULL,
calendar_month_desc VARCHAR2(8) NOT NULL,
calendar_month_id NUMBER NOT NULL,
fiscal_month_desc VARCHAR2(8) NOT NULL,
fiscal_month_id NUMBER NOT NULL,
days_in_cal_month NUMBER NOT NULL,
days_in_fis_month NUMBER NOT NULL,
end_of_cal_month DATE NOT NULL,
end_of_fis_month DATE NOT NULL,
calendar_month_name VARCHAR2(9) NOT NULL,
fiscal_month_name VARCHAR2(9) NOT NULL,
calendar_quarter_desc CHAR(7) NOT NULL,
calendar_quarter_id NUMBER NOT NULL,
fiscal_quarter_desc CHAR(7) NOT NULL,
fiscal_quarter_id NUMBER NOT NULL,
days_in_cal_quarter NUMBER NOT NULL,
days_in_fis_quarter NUMBER NOT NULL,
end_of_cal_quarter DATE NOT NULL,
end_of_fis_quarter DATE NOT NULL,
calendar_quarter_number NUMBER(1) NOT NULL,
fiscal_quarter_number NUMBER(1) NOT NULL,
calendar_year NUMBER(4) NOT NULL,
calendar_year_id NUMBER NOT NULL,
fiscal_year NUMBER(4) NOT NULL,
fiscal_year_id NUMBER NOT NULL,
days_in_cal_year NUMBER NOT NULL,
days_in_fis_year NUMBER NOT NULL,
end_of_cal_year DATE NOT NULL,
end_of_fis_year DATE NOT NULL );
CREATE TABLE products (
prod_id NUMBER(6) NOT NULL,
prod_name VARCHAR2(50) NOT NULL,
prod_desc VARCHAR2(4000) NOT NULL,
prod_subcategory VARCHAR2(50) NOT NULL,
prod_subcategory_id NUMBER NOT NULL,
prod_subcategory_desc VARCHAR2(2000) NOT NULL,
prod_category VARCHAR2(50) NOT NULL,
prod_category_id NUMBER NOT NULL,
prod_category_desc VARCHAR2(2000) NOT NULL,
prod_weight_class NUMBER(3) NOT NULL,
prod_unit_of_measure VARCHAR2(20) ,
prod_pack_size VARCHAR2(30) NOT NULL,
supplier_id NUMBER(6) NOT NULL,
prod_status VARCHAR2(20) NOT NULL,
prod_list_price NUMBER(8,2) NOT NULL,
prod_min_price NUMBER(8,2) NOT NULL,
prod_total VARCHAR2(13) NOT NULL,
prod_total_id NUMBER NOT NULL,
prod_src_id NUMBER ,
prod_eff_from DATE ,
prod_eff_to DATE ,
prod_valid VARCHAR2(1) );
CREATE TABLE channels (
channel_id NUMBER(6) NOT NULL,
channel_desc VARCHAR2(20) NOT NULL,
channel_class VARCHAR2(20) NOT NULL,
channel_class_id NUMBER(6) NOT NULL,
channel_total VARCHAR2(13) NOT NULL,
channel_total_id NUMBER(6) NOT NULL);
CREATE TABLE promotions (
promo_id NUMBER(6) NOT NULL,
promo_name VARCHAR2(30) NOT NULL,
promo_subcategory VARCHAR2(30) NOT NULL,
promo_subcategory_id NUMBER NOT NULL,
promo_category VARCHAR2(30) NOT NULL,
promo_category_id NUMBER NOT NULL,
promo_cost NUMBER(10,2) NOT NULL,
promo_begin_date DATE NOT NULL,
promo_end_date DATE NOT NULL,
promo_total VARCHAR2(15) NOT NULL,
promo_total_id NUMBER NOT NULL);
CREATE TABLE customers (
cust_id NUMBER NOT NULL,
cust_first_name VARCHAR2(20) NOT NULL,
cust_last_name VARCHAR2(40) NOT NULL,
cust_gender CHAR(1) NOT NULL,
cust_year_of_birth NUMBER(4) NOT NULL,
cust_marital_status VARCHAR2(20) ,
cust_street_address VARCHAR2(40) NOT NULL,
cust_postal_code VARCHAR2(10) NOT NULL,
cust_city VARCHAR2(30) NOT NULL,
cust_city_id NUMBER NOT NULL,
cust_state_province VARCHAR2(40) NOT NULL,
cust_state_province_id NUMBER NOT NULL,
country_id NUMBER NOT NULL,
cust_main_phone_number VARCHAR2(25) NOT NULL,
cust_income_level VARCHAR2(30) ,
cust_credit_limit NUMBER ,
cust_email VARCHAR2(50) ,
cust_total VARCHAR2(14) NOT NULL,
cust_total_id NUMBER NOT NULL,
cust_src_id NUMBER ,
cust_eff_from DATE ,
cust_eff_to DATE ,
cust_valid VARCHAR2(1) );
CREATE TABLE countries (
country_id NUMBER NOT NULL,
country_iso_code CHAR(2) NOT NULL,
country_name VARCHAR2(40) NOT NULL,
country_subregion VARCHAR2(30) NOT NULL,
country_subregion_id NUMBER NOT NULL,
country_region VARCHAR2(20) NOT NULL,
country_region_id NUMBER NOT NULL,
country_total VARCHAR2(11) NOT NULL,
country_total_id NUMBER NOT NULL,
country_name_hist VARCHAR2(40));
CREATE TABLE supplementary_demographics
( cust_id NUMBER NOT NULL,
education VARCHAR2(21),
occupation VARCHAR2(21),
household_size VARCHAR2(21),
yrs_residence NUMBER,
affinity_card NUMBER(10),
bulk_pack_diskettes NUMBER(10),
flat_panel_monitor NUMBER(10),
home_theater_package NUMBER(10),
bookkeeping_application NUMBER(10),
printer_supplies NUMBER(10),
y_box_games NUMBER(10),
os_doc_set_kanji NUMBER(10),
comments VARCHAR2(4000));
使用以下的代码加载数据,运行前替换尖括号中的数据,即将
替换为https://objectstorage.ap-seoul-1.oraclecloud.com/n/c4u04/b/bucket-20221121-1704-ADW/o
:
/* Replace below with the URL you copied from your files in OCI Object Storage at runtime.
*/
set define on
define file_uri_base = ''
begin
dbms_cloud.copy_data(
table_name =>'CHANNELS',
credential_name =>'OBJ_STORE_CRED',
file_uri_list =>'&file_uri_base/chan_v3.dat',
format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true')
);
dbms_cloud.copy_data(
table_name =>'COUNTRIES',
credential_name =>'OBJ_STORE_CRED',
file_uri_list =>'&file_uri_base/coun_v3.dat',
format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true')
);
dbms_cloud.copy_data(
table_name =>'CUSTOMERS',
credential_name =>'OBJ_STORE_CRED',
file_uri_list =>'&file_uri_base/cust1v3.dat',
format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true', 'dateformat' value 'YYYY-MM-DD-HH24-MI-SS')
);
dbms_cloud.copy_data(
table_name =>'SUPPLEMENTARY_DEMOGRAPHICS',
credential_name =>'OBJ_STORE_CRED',
file_uri_list =>'&file_uri_base/dem1v3.dat',
format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true')
);
dbms_cloud.copy_data(
table_name =>'SALES',
credential_name =>'OBJ_STORE_CRED',
file_uri_list =>'&file_uri_base/dmsal_v3.dat',
format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true', 'dateformat' value 'YYYY-MM-DD')
);
dbms_cloud.copy_data(
table_name =>'PRODUCTS',
credential_name =>'OBJ_STORE_CRED',
file_uri_list =>'&file_uri_base/prod1v3.dat',
format => json_object('delimiter' value '|', 'quote' value '^', 'ignoremissingcolumns' value 'true', 'dateformat' value 'YYYY-MM-DD-HH24-MI-SS', 'blankasnull' value 'true')
);
dbms_cloud.copy_data(
table_name =>'PROMOTIONS',
credential_name =>'OBJ_STORE_CRED',
file_uri_list =>'&file_uri_base/prom1v3.dat',
format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true', 'dateformat' value 'YYYY-MM-DD-HH24-MI-SS', 'blankasnull' value 'true')
);
dbms_cloud.copy_data(
table_name =>'SALES',
credential_name =>'OBJ_STORE_CRED',
file_uri_list =>'&file_uri_base/sale1v3.dat',
format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true', 'dateformat' value 'YYYY-MM-DD', 'blankasnull' value 'true')
);
dbms_cloud.copy_data(
table_name =>'TIMES',
credential_name =>'OBJ_STORE_CRED',
file_uri_list =>'&file_uri_base/time_v3.dat',
format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true', 'dateformat' value 'YYYY-MM-DD-HH24-MI-SS', 'blankasnull' value 'true')
);
dbms_cloud.copy_data(
table_name =>'COSTS',
credential_name =>'OBJ_STORE_CRED',
file_uri_list =>'&file_uri_base/costs.dat',
format => json_object('ignoremissingcolumns' value 'true', 'dateformat' value 'YYYY-MM-DD', 'blankasnull' value 'true')
);
end;
/
您已成功加载示例表。 您现在可以运行在 Oracle 文档的关系型分析部分的大部分示例查询。 例如,要分析 2000 年某个季度特定客户 ID 的累计销售量,您可以使用“运行脚本”按钮运行以下代码片段中的查询。 阅读有关数据仓库的文档。
SELECT c.cust_id, t.calendar_quarter_desc, TO_CHAR (SUM(amount_sold),
'9,999,999,999.99') AS Q_SALES, TO_CHAR(SUM(SUM(amount_sold))
OVER (PARTITION BY c.cust_id ORDER BY c.cust_id, t.calendar_quarter_desc
ROWS UNBOUNDED
PRECEDING), '9,999,999,999.99') AS CUM_SALES
FROM sales s, times t, customers c
WHERE s.time_id=t.time_id AND s.cust_id=c.cust_id AND t.calendar_year=2000
AND c.cust_id IN (2595, 9646, 11111)
GROUP BY c.cust_id, t.calendar_quarter_desc
ORDER BY c.cust_id, t.calendar_quarter_desc;
运行以下SQL,查询加载任务状态:
select * from user_load_operations;
ID TYPE SID SERIAL# START_TIME UPDATE_TIME STATUS OWNER_NAME TABLE_NAME PARTITION_NAME SUBPARTITION_NAME FILE_URI_LIST ROWS_LOADED LOGFILE_TABLE BADFILE_TABLE STATUS_TABLE TEMPEXT_TABLE CREDENTIAL_NAME EXPIRATION_TIME
-- ---- ----- ------- ------------------------ ------------------------ --------- ---------- -------------------------- -------------- ----------------- -------------------------------------------------------------------------------------------------- ----------- ------------- ------------- ------------ ------------------------- --------------- ------------------------
3 COPY 14375 59976 2022-11-21T09:43:22.102Z 2022-11-21T09:43:23.712Z COMPLETED ADMIN CHANNELS https://objectstorage.ap-seoul-1.oraclecloud.com/n/c4u04/b/bucket-20221121-1704-ADW/o/chan_v3.dat 5 COPY$3_LOG COPY$3_BAD COPY$6IBDMKUVW7MSPMBVKV3B OBJ_STORE_CRED 2022-11-23T09:43:22.102Z
4 COPY 14375 59976 2022-11-21T09:43:23.724Z 2022-11-21T09:43:24.290Z COMPLETED ADMIN COUNTRIES https://objectstorage.ap-seoul-1.oraclecloud.com/n/c4u04/b/bucket-20221121-1704-ADW/o/coun_v3.dat 23 COPY$4_LOG COPY$4_BAD COPY$USI5CNJTPTWLP51X7WDN OBJ_STORE_CRED 2022-11-23T09:43:23.724Z
5 COPY 14375 59976 2022-11-21T09:43:24.304Z 2022-11-21T09:43:26.619Z COMPLETED ADMIN CUSTOMERS https://objectstorage.ap-seoul-1.oraclecloud.com/n/c4u04/b/bucket-20221121-1704-ADW/o/cust1v3.dat 55500 COPY$5_LOG COPY$5_BAD COPY$79JPW25ODVTG3MOI6V6B OBJ_STORE_CRED 2022-11-23T09:43:24.304Z
6 COPY 14375 59976 2022-11-21T09:43:26.631Z 2022-11-21T09:43:27.565Z COMPLETED ADMIN SUPPLEMENTARY_DEMOGRAPHICS https://objectstorage.ap-seoul-1.oraclecloud.com/n/c4u04/b/bucket-20221121-1704-ADW/o/dem1v3.dat 4500 COPY$6_LOG COPY$6_BAD COPY$ERHLCOQXJOIS4N0QUOUQ OBJ_STORE_CRED 2022-11-23T09:43:26.631Z
7 COPY 14375 59976 2022-11-21T09:43:27.577Z 2022-11-21T09:43:28.162Z COMPLETED ADMIN SALES https://objectstorage.ap-seoul-1.oraclecloud.com/n/c4u04/b/bucket-20221121-1704-ADW/o/dmsal_v3.dat 2804 COPY$7_LOG COPY$7_BAD COPY$JD9SFL4W089LOU8KXAMF OBJ_STORE_CRED 2022-11-23T09:43:27.577Z
8 COPY 14375 59976 2022-11-21T09:43:28.174Z 2022-11-21T09:43:28.804Z COMPLETED ADMIN PRODUCTS https://objectstorage.ap-seoul-1.oraclecloud.com/n/c4u04/b/bucket-20221121-1704-ADW/o/prod1v3.dat 72 COPY$8_LOG COPY$8_BAD COPY$QNGIIT6YAJ9P8G4UDLIC OBJ_STORE_CRED 2022-11-23T09:43:28.174Z
9 COPY 14375 59976 2022-11-21T09:43:28.816Z 2022-11-21T09:43:29.643Z COMPLETED ADMIN PROMOTIONS https://objectstorage.ap-seoul-1.oraclecloud.com/n/c4u04/b/bucket-20221121-1704-ADW/o/prom1v3.dat 503 COPY$9_LOG COPY$9_BAD COPY$W0I7JRC2XM6LCB916GRQ OBJ_STORE_CRED 2022-11-23T09:43:28.816Z
10 COPY 14375 59976 2022-11-21T09:43:29.654Z 2022-11-21T09:43:33.593Z COMPLETED ADMIN SALES https://objectstorage.ap-seoul-1.oraclecloud.com/n/c4u04/b/bucket-20221121-1704-ADW/o/sale1v3.dat 916039 COPY$10_LOG COPY$10_BAD COPY$5DL8OEF1FRXTA5NAFTKG OBJ_STORE_CRED 2022-11-23T09:43:29.654Z
11 COPY 14375 59976 2022-11-21T09:43:33.605Z 2022-11-21T09:43:34.487Z COMPLETED ADMIN TIMES https://objectstorage.ap-seoul-1.oraclecloud.com/n/c4u04/b/bucket-20221121-1704-ADW/o/time_v3.dat 1826 COPY$11_LOG COPY$11_BAD COPY$GDJNUIRFWVLIZ3LLEY9Z OBJ_STORE_CRED 2022-11-23T09:43:33.605Z
12 COPY 14375 59976 2022-11-21T09:43:34.500Z 2022-11-21T09:43:35.857Z COMPLETED ADMIN COSTS https://objectstorage.ap-seoul-1.oraclecloud.com/n/c4u04/b/bucket-20221121-1704-ADW/o/costs.dat 82112 COPY$12_LOG COPY$12_BAD COPY$IAW8STVR4UINTBE0WCOL OBJ_STORE_CRED 2022-11-23T09:43:34.500Z
Elapsed: 00:00:00.004
10 rows selected.
运行以下SQL,查询出错的数据加载:
select * from user_load_operations where status='FAILED';
No rows selected
0 rows selected.
要了解有关如何指定文件格式、分隔符、拒绝限制等的更多信息,请查看Autonomous Database Supplied Package Reference 和 DBMS_CLOUD Package Format Options 。
来看一下我们之前用到的格式选型:
在本实验中,您将直接在 Oracle 云基础设施 (OCI) 对象存储上查询文件,而无需将它们加载到您的数据库中。
运行以下代码,运行前替换尖括号中的值,即将
替换为https://objectstorage.ap-seoul-1.oraclecloud.com/n/c4u04/b/bucket-20221121-1704-ADW/o
:
/* Specify the URL that you copied from your files in OCI Object Storage in the define base_URL line below*/
set define on
define &file_uri_base = ''
begin
dbms_cloud.create_external_table(
table_name =>'CHANNELS_EXT',
credential_name =>'OBJ_STORE_CRED',
file_uri_list =>'&file_uri_base/chan_v3.dat',
format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true'),
column_list => 'CHANNEL_ID NUMBER,
CHANNEL_DESC VARCHAR2(20),
CHANNEL_CLASS VARCHAR2(20),
CHANNEL_CLASS_ID NUMBER,
CHANNEL_TOTAL VARCHAR2(13),
CHANNEL_TOTAL_ID NUMBER'
);
dbms_cloud.create_external_table(
table_name =>'COUNTRIES_EXT',
credential_name =>'OBJ_STORE_CRED',
file_uri_list =>'&file_uri_base/coun_v3.dat',
format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true'),
column_list => 'COUNTRY_ID NUMBER ,
COUNTRY_ISO_CODE CHAR(2) ,
COUNTRY_NAME VARCHAR2(40) ,
COUNTRY_SUBREGION VARCHAR2(30) ,
COUNTRY_SUBREGION_ID NUMBER ,
COUNTRY_REGION VARCHAR2(20) ,
COUNTRY_REGION_ID NUMBER ,
COUNTRY_TOTAL VARCHAR2(11) ,
COUNTRY_TOTAL_ID NUMBER ,
COUNTRY_NAME_HIST VARCHAR2(40)'
);
dbms_cloud.create_external_table(
table_name =>'CUSTOMERS_EXT',
credential_name =>'OBJ_STORE_CRED',
file_uri_list =>'&file_uri_base/cust1v3.dat',
format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true', 'dateformat' value 'YYYY-MM-DD-HH24-MI-SS'),
column_list => 'CUST_ID NUMBER ,
CUST_FIRST_NAME VARCHAR2(20) ,
CUST_LAST_NAME VARCHAR2(40) ,
CUST_GENDER CHAR(1) ,
CUST_YEAR_OF_BIRTH NUMBER(4,0) ,
CUST_MARITAL_STATUS VARCHAR2(20),
CUST_STREET_ADDRESS VARCHAR2(40) ,
CUST_POSTAL_CODE VARCHAR2(10) ,
CUST_CITY VARCHAR2(30) ,
CUST_CITY_ID NUMBER ,
CUST_STATE_PROVINCE VARCHAR2(40) ,
CUST_STATE_PROVINCE_ID NUMBER ,
COUNTRY_ID NUMBER ,
CUST_MAIN_PHONE_NUMBER VARCHAR2(25) ,
CUST_INCOME_LEVEL VARCHAR2(30),
CUST_CREDIT_LIMIT NUMBER,
CUST_EMAIL VARCHAR2(50),
CUST_TOTAL VARCHAR2(14) ,
CUST_TOTAL_ID NUMBER ,
CUST_SRC_ID NUMBER,
CUST_EFF_FROM DATE,
CUST_EFF_TO DATE,
CUST_VALID VARCHAR2(1)'
);
dbms_cloud.create_external_table(
table_name =>'SUPPLEMENTARY_DEMOGRAPHICS_EXT',
credential_name =>'OBJ_STORE_CRED',
file_uri_list =>'&file_uri_base/dem1v3.dat',
format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true'),
column_list => 'CUST_ID NUMBER ,
EDUCATION VARCHAR2(21),
OCCUPATION VARCHAR2(21),
HOUSEHOLD_SIZE VARCHAR2(21),
YRS_RESIDENCE NUMBER,
AFFINITY_CARD NUMBER(10,0),
BULK_PACK_DISKETTES NUMBER(10,0),
FLAT_PANEL_MONITOR NUMBER(10,0),
HOME_THEATER_PACKAGE NUMBER(10,0),
BOOKKEEPING_APPLICATION NUMBER(10,0),
PRINTER_SUPPLIES NUMBER(10,0),
Y_BOX_GAMES NUMBER(10,0),
OS_DOC_SET_KANJI NUMBER(10,0),
COMMENTS VARCHAR2(4000)'
);
dbms_cloud.create_external_table(
table_name =>'PRODUCTS_EXT',
credential_name =>'OBJ_STORE_CRED',
file_uri_list =>'&file_uri_base/prod1v3.dat',
format => json_object('delimiter' value '|', 'quote' value '^', 'ignoremissingcolumns' value 'true', 'dateformat' value 'YYYY-MM-DD-HH24-MI-SS', 'blankasnull' value 'true'),
column_list => 'PROD_ID NUMBER(6,0) ,
PROD_NAME VARCHAR2(50) ,
PROD_DESC VARCHAR2(4000) ,
PROD_SUBCATEGORY VARCHAR2(50) ,
PROD_SUBCATEGORY_ID NUMBER ,
PROD_SUBCATEGORY_DESC VARCHAR2(2000) ,
PROD_CATEGORY VARCHAR2(50) ,
PROD_CATEGORY_ID NUMBER ,
PROD_CATEGORY_DESC VARCHAR2(2000) ,
PROD_WEIGHT_CLASS NUMBER(3,0) ,
PROD_UNIT_OF_MEASURE VARCHAR2(20),
PROD_PACK_SIZE VARCHAR2(30) ,
SUPPLIER_ID NUMBER(6,0) ,
PROD_STATUS VARCHAR2(20) ,
PROD_LIST_PRICE NUMBER(8,2) ,
PROD_MIN_PRICE NUMBER(8,2) ,
PROD_TOTAL VARCHAR2(13) ,
PROD_TOTAL_ID NUMBER ,
PROD_SRC_ID NUMBER,
PROD_EFF_FROM DATE,
PROD_EFF_TO DATE,
PROD_VALID VARCHAR2(1)'
);
dbms_cloud.create_external_table(
table_name =>'PROMOTIONS_EXT',
credential_name =>'OBJ_STORE_CRED',
file_uri_list =>'&file_uri_base/prom1v3.dat',
format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true', 'dateformat' value 'YYYY-MM-DD-HH24-MI-SS', 'blankasnull' value 'true'),
column_list => 'PROMO_ID NUMBER(6,0) ,
PROMO_NAME VARCHAR2(30) ,
PROMO_SUBCATEGORY VARCHAR2(30) ,
PROMO_SUBCATEGORY_ID NUMBER ,
PROMO_CATEGORY VARCHAR2(30) ,
PROMO_CATEGORY_ID NUMBER ,
PROMO_COST NUMBER(10,2) ,
PROMO_BEGIN_DATE DATE ,
PROMO_END_DATE DATE ,
PROMO_TOTAL VARCHAR2(15) ,
PROMO_TOTAL_ID NUMBER '
);
dbms_cloud.create_external_table(
table_name =>'SALES_EXT',
credential_name =>'OBJ_STORE_CRED',
file_uri_list =>'&file_uri_base/sale1v3.dat,&file_uri_base/dmsal_v3.dat',
format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true', 'dateformat' value 'YYYY-MM-DD', 'blankasnull' value 'true'),
column_list => 'PROD_ID NUMBER ,
CUST_ID NUMBER ,
TIME_ID DATE ,
CHANNEL_ID NUMBER ,
PROMO_ID NUMBER ,
QUANTITY_SOLD NUMBER(10,2) ,
AMOUNT_SOLD NUMBER(10,2)'
);
dbms_cloud.create_external_table(
table_name =>'TIMES_EXT',
credential_name =>'OBJ_STORE_CRED',
file_uri_list =>'&file_uri_base/time_v3.dat',
format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true', 'dateformat' value 'YYYY-MM-DD-HH24-MI-SS', 'blankasnull' value 'true'),
column_list => 'TIME_ID DATE ,
DAY_NAME VARCHAR2(9) ,
DAY_NUMBER_IN_WEEK NUMBER(1,0) ,
DAY_NUMBER_IN_MONTH NUMBER(2,0) ,
CALENDAR_WEEK_NUMBER NUMBER(2,0) ,
FISCAL_WEEK_NUMBER NUMBER(2,0) ,
WEEK_ENDING_DAY DATE ,
WEEK_ENDING_DAY_ID NUMBER ,
CALENDAR_MONTH_NUMBER NUMBER(2,0) ,
FISCAL_MONTH_NUMBER NUMBER(2,0) ,
CALENDAR_MONTH_DESC VARCHAR2(8) ,
CALENDAR_MONTH_ID NUMBER ,
FISCAL_MONTH_DESC VARCHAR2(8) ,
FISCAL_MONTH_ID NUMBER ,
DAYS_IN_CAL_MONTH NUMBER ,
DAYS_IN_FIS_MONTH NUMBER ,
END_OF_CAL_MONTH DATE ,
END_OF_FIS_MONTH DATE ,
CALENDAR_MONTH_NAME VARCHAR2(9) ,
FISCAL_MONTH_NAME VARCHAR2(9) ,
CALENDAR_QUARTER_DESC CHAR(7) ,
CALENDAR_QUARTER_ID NUMBER ,
FISCAL_QUARTER_DESC CHAR(7) ,
FISCAL_QUARTER_ID NUMBER ,
DAYS_IN_CAL_QUARTER NUMBER ,
DAYS_IN_FIS_QUARTER NUMBER ,
END_OF_CAL_QUARTER DATE ,
END_OF_FIS_QUARTER DATE ,
CALENDAR_QUARTER_NUMBER NUMBER(1,0) ,
FISCAL_QUARTER_NUMBER NUMBER(1,0) ,
CALENDAR_YEAR NUMBER(4,0) ,
CALENDAR_YEAR_ID NUMBER ,
FISCAL_YEAR NUMBER(4,0) ,
FISCAL_YEAR_ID NUMBER ,
DAYS_IN_CAL_YEAR NUMBER ,
DAYS_IN_FIS_YEAR NUMBER ,
END_OF_CAL_YEAR DATE ,
END_OF_FIS_YEAR DATE '
);
dbms_cloud.create_external_table(
table_name =>'COSTS_EXT',
credential_name =>'OBJ_STORE_CRED',
file_uri_list =>'&file_uri_base/costs.dat',
format => json_object('ignoremissingcolumns' value 'true', 'dateformat' value 'YYYY-MM-DD', 'blankasnull' value 'true'),
column_list => 'PROD_ID NUMBER ,
TIME_ID DATE ,
PROMO_ID NUMBER ,
CHANNEL_ID NUMBER ,
UNIT_COST NUMBER(10,2) ,
UNIT_PRICE NUMBER(10,2) '
);
end;
/
查询外部表,我们之上将表名加了_ext后缀:
SELECT c.cust_id, t.calendar_quarter_desc, TO_CHAR (SUM(amount_sold),
'9,999,999,999.99') AS Q_SALES, TO_CHAR(SUM(SUM(amount_sold))
OVER (PARTITION BY c.cust_id ORDER BY c.cust_id, t.calendar_quarter_desc
ROWS UNBOUNDED
PRECEDING), '9,999,999,999.99') AS CUM_SALES
FROM sales_ext s, times t, customers_ext c
WHERE s.time_id=t.time_id AND s.cust_id=c.cust_id AND t.calendar_year=2000
AND c.cust_id IN (2595, 9646, 11111)
GROUP BY c.cust_id, t.calendar_quarter_desc
ORDER BY c.cust_id, t.calendar_quarter_desc;
Execution time: 3.239 seconds
查询外部表会比本地表要慢些,本地表只需Execution time: 0.002 seconds。
有关查询外部数据的更多信息,请参阅文档 Querying External Data with Autonomous Data Warehouse 。
此实验需要安装Oracle Analytics Desktop,然后连自治数据库。略。