SH 中文化样例数据使用手册

在数据库演示与 PoC 场景中,Oracle 自带的 SH 示例模式虽然经典,但英文维度数据往往让国内演示效果打折扣。笔者整理了一套方案:保留 SH 标准英文对象名,同时装载中文化维度数据,并按参数生成可复现的销售历史数据,方便个人测试与概念验证。

01 | 环境准备

使用前请确认满足以下条件:

  • Oracle Database 19c 或更高版本,数据库字符集为 AL32UTF8
  • SQLcl 26.1.2.0 或更高版本。
  • 使用具备创建、删除用户权限的账号连接,例如 SYSTEMADMIN
  • 从仓库内的 sales_history_cn/sales_history 目录执行脚本,且该目录下的 CSV 文件必须完整保留。

注意:若输入 YES 覆盖已有 SH 模式,安装脚本会执行 DROP USER SH CASCADE。这会永久移除该用户及其对象,请勿对承载业务数据的 SH 用户执行。

02 | 安装步骤

在终端中进入脚本目录并连接目标数据库:

bash 复制代码
cd sales_history_cn/sales_history
sql system@//db-host:1521/service_name

在 SQLcl 中运行:

sql 复制代码
@sh_install.sql

安装过程会依次询问 SH 密码、表空间、生成模式及对应参数,最后确认是否覆盖已有 SH 模式。脚本会在当前目录生成 sh_install.log

① 默认方式:最近 N 个完整自然年加今年截至当天

text 复制代码
生成模式 [RECENT|RANGE] [RECENT]: RECENT
RECENT 模式的完整自然年数 [3]: 3

其中"当天"取目标数据库服务器的 SYSDATE。例如服务器日期为 2026-09-09、N 为 3 时,请求范围为 2023-01-012026-09-09

② 自定义方式:指定起止日期

text 复制代码
生成模式 [RECENT|RANGE] [RECENT]: RANGE
RANGE 模式起始日期 (YYYY-MM-DD): 2025-07-01
RANGE 模式结束日期 (YYYY-MM-DD): 2030-12-31

RANGE 的起止日期均包含在最终范围内,可指定未来日期。

03 | 数据生成规则

  • 客户、促销和补充人口统计等维度从 CSV 装载;TIMESSALESCOSTS 不装载原始 CSV,而是在选定范围内完整生成。
  • SALES 每个完整自然年约 200,000 行,不完整年份按实际天数比例生成。最终 MIN(time_id)MAX(time_id) 与选定范围一致。
  • COSTS 按产品、日期、促销和渠道的唯一组合生成,避免多笔销售造成重复成本行。
  • 固定随机种子为 20260909。在 CSV、脚本版本和输入参数一致时,生成的新增事实数据一致。
  • TIMES 使用中国自然日历:周一为首日,周日为周结束日;财年、财月、财季等同自然年口径。时间文本格式示例:2026年09月2026年Q3星期一
  • SALESCOSTS 使用按年自动扩展的 interval 分区,生成到未来年份无需再修改建表 DDL。

04 | 中文化范围

数据库对象名保持 Oracle SH 的英文命名,以兼容标准示例 SQL。装载后,以下展示数据会被中文化:

  • 国家和区域名称;客户姓名、地址、电话、邮箱、收入与婚姻状态。
  • 产品的单位、包装、状态和汇总描述。
  • 促销名称、类别、子类别与汇总描述。
  • 补充人口统计中的教育、职业、家庭规模和备注。
  • TIMES 的星期、月、季及财务期间文本。

客户数据是中国本土模拟数据,仅用于演示,不能视为真实个人信息。

05 | 安装后校验

安装脚本末尾会输出各表实际行数。连接 SH 后可执行以下查询:

sql 复制代码
SELECT MIN(time_id) AS 最早销售日期,
       MAX(time_id) AS 最晚销售日期,
       COUNT(*)     AS 销售行数
FROM sales;

SELECT calendar_year AS 年份,
       COUNT(*) AS 销售行数
FROM sales s
JOIN times t ON t.time_id = s.time_id
GROUP BY calendar_year
ORDER BY calendar_year;

SELECT table_name, partition_name, high_value
FROM user_tab_partitions
WHERE table_name IN ('SALES', 'COSTS')
ORDER BY table_name, partition_position;

可检查中文时间维度:

sql 复制代码
SELECT time_id, day_name, calendar_month_desc, calendar_quarter_desc
FROM times
ORDER BY time_id
FETCH FIRST 10 ROWS ONLY;

06 | 卸载

以具备删除用户权限的账号连接,并在 sales_history_cn/sales_history 目录执行:

sql 复制代码
@sh_uninstall.sql

该操作会删除整个 SH 用户及其全部对象。若需要保留结果,请先按本地运维规范完成 Data Pump 导出或备份。

07 | 常见问题

现象 处理建议
RANGE 参数报错 两个日期都必须填写,并严格使用 YYYY-MM-DD;起始日期不得晚于结束日期。
中文显示乱码 确认数据库字符集为 AL32UTF8,并使用支持 UTF-8 的终端。
找不到 CSV 文件 必须从包含 customers.csvpromotions.csvsupplementary_demographics.csv 等维度文件的 sales_history_cn/sales_history 目录执行安装。
生成数据比预期少 完整年度约为 200,000 行,不完整年份会按实际天数等比例生成。
表空间不足或执行较慢 每完整年会额外增加约 20 万条销售及对应成本数据,并创建本地索引;请增加表空间并预留足够的加载时间。

下载命令:

复制代码
git clone https://github.com/AlfredZhao/sales_history_cn.git

关注我,和AI一起成长~

相关推荐
sunflower#11 小时前
Go学习第五阶段:接口、泛型与包设计,实现可替换的通讯录存储层
学习·oracle·golang
李白客18 小时前
时序数据库入门:什么是 TSDB?时序库与关系型数据库对比、主流产品选型指南(2026)
数据库·oracle·时序数据库
全栈弄潮儿²⁰²⁴19 小时前
AI Agent 开发实战(7):如何接入搜索和数据库工具?
数据库·人工智能·ai·chatgpt·oracle·agent·ai编程
沈管家AI数字员工1 天前
对话式数据分析实操:从自然语言到可视化图表的全流程
数据库·人工智能·ai·oracle·数据分析
凌晨1681 天前
MySQL:DML、DDL与TCL精讲
数据库·mysql·oracle
Java开发追求者1 天前
navicat连接新的数据库提示Oracle library is not loaded.
数据库·oracle·oracle11g·oracle library·is not loaded
AlfredZhao1 天前
Oracle 排除非业务表:一份能直接抄的“全量过滤”SQL
oracle
斑马1392 天前
Linux软件编程学习笔记(十三)——数据库
数据库·oracle
十六年开源服务商2 天前
2026网站备份方案完整指南
数据库·oracle