fix: 修正公开镜像文档文件名

This commit is contained in:
chen qiang
2026-08-27 10:39:33 +08:00
parent dfc6a96e10
commit 2191805bcd
+482
View File
@@ -0,0 +1,482 @@
# Oracle Jump Query 操作示例
这份文档用于说明如何向 `Oracle Jump Query` 提问,以及它会调用哪些只读能力完成查询。适合给业务分析、存储过程排查、表结构梳理、权限数据查询等场景使用。
## 基本原则
- 只执行只读操作:支持查询元数据和执行 `SELECT`,禁止 `INSERT`、`UPDATE`、`DELETE`、`MERGE`、`TRUNCATE`、`DROP`、`ALTER` 等写操作或结构变更。
- 优先给出明确对象:尽量提供 `schema`、表名、存储过程名、用户 ID、`AD_TABLE.ID` 等信息。
- 业务词先查字典:遇到“零售单”“采购入库”“调拨单”等业务词时,先从 `AD_TABLE`、`AD_COLUMN`、`AD_REFBYTABLE` 确认表和字段。
- 单据统计加状态条件:统计业务单据时,通常需要过滤 `ISACTIVE = 'Y' AND STATUS = '2'`。
- 明细表不靠猜:主表到明细表关系应通过 `AD_REFBYTABLE` 查询确认。
## 常见操作
### 1. 检查服务状态
用于确认中转服务和在线 Agent 是否可用。
用户可以这样问:
```text
检查一下 Oracle Jump Query 服务是否正常,看看有哪些在线 Agent。
```
对应命令:
```bash
python scripts/oracle_skill.py health
python scripts/oracle_skill.py servers
```
### 2. 查询存储过程源码
用于查看某个存储过程的完整 PL/SQL 源码。
用户可以这样问:
```text
帮我看一下 BOS.M_RETAIL_SUBMIT 的源码。
```
对应命令:
```bash
python scripts/oracle_skill.py source BOS M_RETAIL_SUBMIT
```
### 3. 完整分析存储过程
用于一次性查看源码、依赖对象、相关表结构和触发器。
用户可以这样问:
```text
完整分析 BOS.M_RETAIL_SUBMIT,包括源码、依赖表、相关表结构和触发器。
```
对应命令:
```bash
python scripts/oracle_skill.py analyze BOS M_RETAIL_SUBMIT
```
适合排查:
- 提交流程做了哪些校验
- 存储过程更新了哪些业务表
- 是否调用了其他过程或函数
- 哪些触发器可能影响结果
### 4. 查询过程依赖
用于单独查看某个过程依赖的表、视图、函数或其他过程。
用户可以这样问:
```text
查一下 BOS.M_RETAIL_SUBMIT 依赖了哪些表和过程。
```
对应命令:
```bash
python scripts/oracle_skill.py deps BOS M_RETAIL_SUBMIT
```
### 5. 查询表结构
用于查询字段、类型、索引、行数、注释等表结构信息。
用户可以这样问:
```text
查一下 BOSNDS3.XCX_SO 的表结构。
```
对应命令:
```bash
python scripts/oracle_skill.py describe BOSNDS3 XCX_SO
```
### 6. 根据业务词找表
用于从中文业务名称反查系统中的业务表。
用户可以这样问:
```text
帮我找“零售单”对应哪张表,以及提交过程是什么。
```
对应 SQL:
```sql
SELECT ID, NAME, TABLENAME, DESCRIPTION, PROC_SUBMIT
FROM AD_TABLE
WHERE NAME LIKE '%零售%'
OR DESCRIPTION LIKE '%零售%';
```
对应命令:
```bash
python scripts/oracle_skill.py query "SELECT ID, NAME, TABLENAME, DESCRIPTION, PROC_SUBMIT FROM AD_TABLE WHERE NAME LIKE '%零售%' OR DESCRIPTION LIKE '%零售%'"
```
### 7. 查询字段业务含义
用于确认字段显示名、业务描述和字段类型。
用户可以这样问:
```text
查一下 M_RETAILITEM 每个字段的业务含义。
```
对应 SQL:
```sql
SELECT DBNAME, NAME, DESCRIPTION, COLTYPE
FROM AD_COLUMN
WHERE AD_TABLE_ID = (
SELECT ID FROM AD_TABLE WHERE NAME = 'M_RETAILITEM'
)
ORDER BY ORDERNO;
```
对应命令:
```bash
python scripts/oracle_skill.py query "SELECT DBNAME, NAME, DESCRIPTION, COLTYPE FROM AD_COLUMN WHERE AD_TABLE_ID = (SELECT ID FROM AD_TABLE WHERE NAME = 'M_RETAILITEM') ORDER BY ORDERNO"
```
### 8. 查询主表和明细表关系
用于确认主表有哪些明细表,以及明细表通过哪个字段关联主表。
用户可以这样问:
```text
查一下 M_RETAIL 有哪些明细表,外键字段是什么。
```
对应 SQL:
```sql
SELECT t1.NAME AS MAIN_TABLE,
t2.NAME AS DETAIL_TABLE,
c.DBNAME AS REF_COLUMN,
r.ASSOCTYPE
FROM AD_REFBYTABLE r
LEFT JOIN AD_TABLE t1 ON r.AD_TABLE_ID = t1.ID
LEFT JOIN AD_TABLE t2 ON r.AD_REFBY_TABLE_ID = t2.ID
LEFT JOIN AD_COLUMN c ON r.AD_REFBY_COLUMN_ID = c.ID
WHERE t1.NAME = 'M_RETAIL';
```
对应命令:
```bash
python scripts/oracle_skill.py query "SELECT t1.NAME AS MAIN_TABLE, t2.NAME AS DETAIL_TABLE, c.DBNAME AS REF_COLUMN, r.ASSOCTYPE FROM AD_REFBYTABLE r LEFT JOIN AD_TABLE t1 ON r.AD_TABLE_ID = t1.ID LEFT JOIN AD_TABLE t2 ON r.AD_REFBY_TABLE_ID = t2.ID LEFT JOIN AD_COLUMN c ON r.AD_REFBY_COLUMN_ID = c.ID WHERE t1.NAME = 'M_RETAIL'"
```
### 9. 查询有效已提交单据
用于统计或分析正式业务数据。单据类数据通常要排除草稿、审批中、作废或删除记录。
用户可以这样问:
```text
查询 2026-05-01 的有效已提交零售单,返回前 10 条。
```
对应 SQL:
```sql
SELECT *
FROM M_RETAIL
WHERE ISACTIVE = 'Y'
AND STATUS = '2'
AND BILLDATE = 20260501
AND ROWNUM <= 10;
```
对应命令:
```bash
python scripts/oracle_skill.py query "SELECT * FROM M_RETAIL WHERE ISACTIVE = 'Y' AND STATUS = '2' AND BILLDATE = 20260501 AND ROWNUM <= 10"
```
### 10. 查询用户数据权限
用于查看某个用户对某张业务表的数据范围。
用户可以这样问:
```text
查一下用户 940 对 M_OTHER_INOUT 的数据权限,表 ID 是 12983。
```
对应命令:
```bash
python scripts/oracle_skill.py perm 940 12983
```
返回结果通常包含:
- `perm_sql`:权限过滤条件
- `has_restriction`:是否存在权限限制
- 空权限条件:通常表示全权限
### 11. 执行带权限过滤的查询
用于按用户权限自动拼接过滤条件后查询数据。
用户可以这样问:
```text
用用户 940 的权限查询 M_OTHER_INOUT,表 ID 是 12983,只看 2026-05-01 的数据。
```
对应命令:
```bash
python scripts/oracle_skill.py qperm 940 12983 "SELECT * FROM M_OTHER_INOUT WHERE BILLDATE = 20260501"
```
系统会自动把 `get_userspermsql` 返回的权限条件追加到查询中。
### 12. 查询表空间使用情况
用于查看数据库表空间的整体使用状况,包括总大小、已用、剩余、使用率、是否自动拓展等信息。
#### 自动降级策略
脚本按优先级自动尝试 **5 种方式**,无需手动切换:
| 优先级 | 方式 | 条件 |
|:---:|------|------|
| 1️⃣ | 直查 `DBA_DATA_FILES` + `DBA_FREE_SPACE` | 用户有 `SELECT_CATALOG_ROLE` |
| 2️⃣ | DBA 专用函数 `sys.get_tablespace_usage()` | DBA 已执行 CREATE FUNCTION |
| 3️⃣ | 查询 DBA 授权 VIEW `HENLO_TS_USAGE` | DBA 已执行授权 SQL |
| 4️⃣ | 查询 `SYS.HENLO_TS_USAGE`(带 sys.前缀) | DBA 以 SYS 身份创建的视图 |
| 5️⃣ | 查 `USER_FREE_SPACE` | 始终可用(仅剩余空间) |
> **经验**:DBA 以 SYS 身份登录创建的 VIEW 归属到 `SYS` schema,需用 `sys.` 前缀才能查到。脚本会自动先试无前缀,再试 `sys.` 前缀。
#### 无权限时的处理流程
当用户无 DBA 系统视图权限时,脚本会自动输出以下内容:
1. 尝试 DBA 专用函数(如果有)
2. 尝试 DBA 授权 VIEW(无前缀 → sys.前缀)
3. 如果前两步都不存在,输出给 DBA 的授权 SQL
4. 回退到 `USER_FREE_SPACE` 查询,显示各表空间的剩余空间
#### HENLO 环境实际输出(授权前)
```
📊 表空间使用情况(用户视图 -- 无DBA权限,仅显示名称和剩余空间):
| 表空间名称 | 剩余MB |
| --- | --- |
| BOSNDS3 | 518.81 |
| BOSNDS3_IDX | 17.56 |
| RETAILNDS3 | 9.31 |
| RETAILNDS3_IDX | 19 |
| SYSAUX | 329.94 |
| SYSTEM | 7.19 |
| ULOG | 39 |
| UNDOTBS1 | 474.38 |
| USERS | 2.31 |
```
#### DBA 授权后的实际完整输出
DBA 以 SYS 执行授权 SQL 后,再次查询自动获得完整信息(脚本自动识别 `SYS.HENLO_TS_USAGE`):
```
📊 表空间使用情况一览(通过 DBA 授权 VIEW):
| 表空间名称 | 总大小MB | 已用MB | 剩余MB | 使用率% | 自动拓展 | 最大可拓展MB | 最大使用率% |
| --- | --- | --- | --- | --- | --- | --- | --- |
| SYSTEM | 1230 | 1222.8 | 7.2 | 99.4 | YES | 32768 | 3.7 |
| SYSAUX | 6620 | 6290.1 | 329.9 | 95 | YES | 32768 | 19.2 |
| UNDOTBS1 | 505 | 30.6 | 474.4 | 6.1 | YES | 32768 | 0.1 |
| BOSNDS3_IDX | 20 | 2.4 | 17.6 | 12.2 | YES | 32768 | 0 |
| ULOG | 40 | 1 | 39 | 2.5 | YES | 32768 | 0 |
| RETAILNDS3_IDX | 20 | 1 | 19 | 5 | YES | 32768 | 0 |
| USERS | 5 | 2.7 | 2.3 | 53.8 | YES | 32768 | 0 |
| BOSNDS3 | 10690 | 10171.2 | 518.8 | 95.1 | YES | 32768 | 31 |
| RETAILNDS3 | 110 | 100.7 | 9.3 | 91.5 | YES | 32768 | 0.3 |
**共 9 行**
```
⚠️ 脚本自动检测到 3 个表空间使用率 ≥ 95% 并输出告警。
#### 字段解释
| 字段 | 说明 |
|------|------|
| 表空间名称 | Oracle 表空间名称 |
| 总大小MB | 当前数据文件总大小(MB) |
| 已用MB | 已分配使用的空间(MB) |
| 剩余MB | 剩余可用空间(MB) |
| 使用率% | (已用 / 总大小)× 100% |
| 自动拓展 | YES=数据文件自动扩展,NO=固定大小 |
| 最大可拓展MB | 自动扩展后能达到的最大值(MB);不自动扩展时=当前大小 |
| 最大使用率% | (已用 / 最大可拓展)× 100%,反映最终可用的百分比 |
#### 阈值参考
| 使用率 | 状态 | 建议 |
|--------|------|------|
| < 80% | ✅ 正常 | 无需处理 |
| 80% ~ 95% | 🔶 关注 | 评估未来增长,制定扩容计划 |
| ≥ 95% | ⚠️ 紧急 | 尽快扩容或清理空间! |
> **智能告警规则**:脚本逐行解析表空间数据,自动判断衡量指标。
> - `自动拓展=YES`:按 **最大使用率%**(已用/最大可拓展)判断
> - `自动拓展=NO`:按当前 **使用率%**(已用/当前总大小)判断
>
> 例如 SYSTEM 使用率 99.4% 但最大使用率仅 3.7%,说明只是当前数据文件写满而非存储瓶颈,自动扩展后即可释放。
#### 给 DBA 的授权说明
当无 DBA 权限时,脚本会**自动输出**以下信息,请交给 DBA 执行:
```sql
-- 以 SYS 身份执行
CREATE OR REPLACE VIEW SYS.HENLO_TS_USAGE AS
SELECT
df.tablespace_name AS "表空间名称",
ROUND(df.total_bytes / 1048576, 1) AS "总大小MB",
ROUND((df.total_bytes - NVL(fs.free_bytes, 0)) / 1048576, 1) AS "已用MB",
ROUND(NVL(fs.free_bytes, 0) / 1048576, 1) AS "剩余MB",
ROUND((df.total_bytes - NVL(fs.free_bytes, 0)) / df.total_bytes * 100, 1) AS "使用率%",
df.autoextensible AS "自动拓展",
ROUND(df.max_bytes / 1048576, 1) AS "最大可拓展MB",
ROUND((df.total_bytes - NVL(fs.free_bytes, 0)) / NULLIF(df.max_bytes, 0) * 100, 1) AS "最大使用率%"
FROM (
SELECT
tablespace_name,
SUM(bytes) AS total_bytes,
SUM(CASE WHEN autoextensible = 'YES' THEN maxbytes ELSE bytes END) AS max_bytes,
MAX(CASE WHEN autoextensible = 'YES' THEN 'YES' ELSE 'NO' END) AS autoextensible
FROM dba_data_files
GROUP BY tablespace_name
) df
LEFT JOIN (
SELECT tablespace_name, SUM(bytes) AS free_bytes
FROM dba_free_space
GROUP BY tablespace_name
) fs ON df.tablespace_name = fs.tablespace_name
ORDER BY 6 DESC;
GRANT SELECT ON SYS.HENLO_TS_USAGE TO bosnds3;
```
> **为什么加 `SYS.` 前缀**:DBA 以 SYS 身份执行 `CREATE VIEW` 时,视图创建在 `SYS` schema 下。`GRANT` 也必须指定 `SYS.` 前缀,否则普通用户无法找到。脚本会自动处理带前缀和不带前缀两种情况。
> **原理**:Oracle 视图默认使用定义者权限(`DEFINER`),以创建者的 DBA 身份执行。普通用户仅需 `SELECT` 权限,比直接授予 `SELECT_CATALOG_ROLE` 更安全。
#### 给 AI 的指令
当用户通过 AI 查询表空间时,流程:
1. 自动调用 `python oracle_skill.py tablespace`
2. 脚本自动尝试 5 层降级
3. 如果全部权限方案不可用,输出授权 SQL + 回退到剩余空间查询
4. 将授权 SQL 发送给用户,让其联系 DBA 执行
5. DBA 执行后,再次查询即可自动使用完整信息
6. 注意:DBA 以 SYS 执行时,VIEW 会创建在 `SYS` schema 下,GRANT 也需带 `SYS.` 前缀
用户可以这样问:
```text
帮我查一下数据库表空间使用情况
查看表空间
表空间够不够用
```
对应命令:
```bash
python scripts/oracle_skill.py tablespace
# 或
python scripts/oracle_skill.py tablespaces
```
### 13. 生成 NL2SQL 字典
用于为自然语言转 SQL 准备 schema 字典。
用户可以这样问:
```text
给 BOSNDS3 的 RETAIL 业务域生成 NL2SQL schema 字典。
```
对应命令:
```bash
python scripts/oracle_skill.py nl2sql BOSNDS3 RETAIL
```
## 典型完整流程
### 流程一:分析一个业务提交流程
用户可以这样问:
```text
帮我分析零售单提交逻辑,从业务表、提交过程、依赖表到关键校验都梳理出来。
```
推荐执行顺序:
1. 从 `AD_TABLE` 查询“零售单”对应主表和 `PROC_SUBMIT`。
2. 使用 `source` 或 `analyze` 查询提交过程源码。
3. 使用 `deps` 查询依赖对象。
4. 使用 `describe` 查询关键表结构。
5. 结合源码解释提交校验、状态变更、库存或财务影响。
### 流程二:构造一条可靠统计 SQL
用户可以这样问:
```text
我要统计 2026 年 5 月零售销售额,帮我确认主表、明细表、金额字段并生成 SQL。
```
推荐执行顺序:
1. 查 `AD_TABLE`,确认零售主表。
2. 查 `AD_REFBYTABLE`,确认零售明细表。
3. 查 `AD_COLUMN`,确认数量、金额、日期、门店字段。
4. 生成 SQL 时加入 `ISACTIVE = 'Y' AND STATUS = '2'`。
5. 如需按用户权限过滤,使用 `qperm`。
示例 SQL:
```sql
SELECT r.C_STORE_ID,
SUM(i.TOT_AMT_ACTUAL) AS SALE_AMOUNT
FROM M_RETAIL r
JOIN M_RETAILITEM i ON i.M_RETAIL_ID = r.ID
WHERE r.ISACTIVE = 'Y'
AND r.STATUS = '2'
AND r.BILLDATE BETWEEN 20260501 AND 20260531
GROUP BY r.C_STORE_ID;
```
## 排查建议
- `agent not found`:先执行 `servers`,确认 Agent 是否在线。
- 查询超时:缩小查询范围,或对 `analyze` 类命令增加超时时间。
- 查不到业务表:先扩大 `AD_TABLE` 的关键字范围,再结合 `DESCRIPTION` 判断。
- 字段含义不明确:优先查 `AD_COLUMN.DESCRIPTION`,不要只凭字段名猜。
- 统计结果异常:检查是否遗漏 `ISACTIVE`、`STATUS`、日期范围、门店权限等条件。