Files
oracle-jump-query-public/docs/操作示例.md
T

494 lines
15 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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` 查询确认。
- 品小二中文条件:中文值直接写入 `LIKE` 可能因字符集转换返回 0 行,应改用 Oracle `UNISTR` Unicode 转义;其他 client 可按实际验证结果使用,`UNISTR` 也可作为跨环境复用时的 ASCII-safe 兜底。
## 多对话查询
你可以先说“查未芮”,随后直接说“看商品表结构”“查这个过程”。助手沿用当前对话客户,并在每条命令中自动携带 `--client WEIRUI`;另一个对话查其他客户不会影响本对话。下面未带客户参数的历史示例仍兼容默认客户,助手实际调用时应补上本对话编号。
```powershell
python scripts/oracle_skill.py describe --client WEIRUI --json BOSNDS3 M_PRODUCT
```
常规查询无需先检查状态或切换共享默认客户;可信设备已审批时,失效登录由 CLI 自动恢复。
## 常见操作
### 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 '%' || UNISTR('\96F6\552E') || '%'
OR DESCRIPTION LIKE '%' || UNISTR('\96F6\552E') || '%';
```
对应命令:
```bash
python scripts/oracle_skill.py query "SELECT ID, NAME, TABLENAME, DESCRIPTION, PROC_SUBMIT FROM AD_TABLE WHERE NAME LIKE '%' || UNISTR('\96F6\552E') || '%' OR DESCRIPTION LIKE '%' || UNISTR('\96F6\552E') || '%'"
```
### 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`、日期范围、门店权限等条件。