同步 Skill 1.5.47 公共快照
This commit is contained in:
@@ -8,6 +8,61 @@
|
||||
|
||||
处理 BOS 业务单据(如零售单、采购单、调拨单、销售单等)时,必须遵循以下查询路径:
|
||||
|
||||
#### 用户提供表名称时的对象解析顺序
|
||||
|
||||
用户给出一个表名称,且没有明确要求绕过 BOS 元数据、直接按 Oracle 物理对象查询时,不要立即对该名称执行 `describe` 或数据查询。先确认它是 BOS 逻辑表、BOS 实际表,还是未在 BOS 注册的数据库对象。
|
||||
|
||||
1. 先用用户给出的名称精确查询 `AD_TABLE`,同时返回英文名称 `NAME`、通常为中文的显示名称 `DESCRIPTION` 和 `REALTABLE_ID`。必要时再用 `LIKE` 扩大范围,不要把模糊命中的第一条直接当成目标。
|
||||
|
||||
```sql
|
||||
SELECT t.ID,
|
||||
t.NAME,
|
||||
t.DESCRIPTION,
|
||||
t.REALTABLE_ID,
|
||||
rt.NAME AS REALTABLE_NAME,
|
||||
rt.DESCRIPTION AS REALTABLE_DESCRIPTION
|
||||
FROM AD_TABLE t
|
||||
LEFT JOIN AD_TABLE rt ON rt.ID = t.REALTABLE_ID
|
||||
WHERE UPPER(t.NAME) = UPPER('<表名称>')
|
||||
OR t.DESCRIPTION = '<表名称>'
|
||||
```
|
||||
|
||||
2. 查到 `AD_TABLE` 记录后,先向用户说明其 `DESCRIPTION` 和 `NAME`。若 `REALTABLE_ID` 非空,它表示该 BOS table 实际查询的表,应沿 `REALTABLE_ID -> AD_TABLE.ID` 使用目标记录的 `NAME` 继续查询结构或数据。原始名称可能只是 BOS 系统中的虚拟表,在 Oracle 数据库中并不存在;不要因为找不到同名物理表就判定对象不存在。若目标记录仍有 `REALTABLE_ID`,继续解析到最终实际表,并防止循环引用。
|
||||
3. 查到 `AD_TABLE` 记录但 `REALTABLE_ID` 为空时,使用该记录的 `NAME` 作为物理表候选,再到数据库字典确认。
|
||||
4. `AD_TABLE` 完全查不到时,该对象仍可能是未在 BOS 元数据中维护的数据库表。先查数据库表;查不到后再查普通视图,最后查物化视图。使用 `ALL_*` 字典时应返回 `OWNER`,避免把其他 schema 的同名对象误当成当前业务对象。
|
||||
|
||||
```sql
|
||||
SELECT OWNER, TABLE_NAME
|
||||
FROM ALL_TABLES t
|
||||
WHERE t.TABLE_NAME = UPPER('<表名称>')
|
||||
AND NOT EXISTS (
|
||||
SELECT 1
|
||||
FROM ALL_MVIEWS mv
|
||||
WHERE mv.OWNER = t.OWNER
|
||||
AND mv.MVIEW_NAME = t.TABLE_NAME
|
||||
)
|
||||
ORDER BY CASE WHEN OWNER = SYS_CONTEXT('USERENV', 'CURRENT_SCHEMA') THEN 0 ELSE 1 END,
|
||||
OWNER
|
||||
```
|
||||
|
||||
```sql
|
||||
SELECT OWNER, VIEW_NAME
|
||||
FROM ALL_VIEWS
|
||||
WHERE VIEW_NAME = UPPER('<表名称>')
|
||||
ORDER BY CASE WHEN OWNER = SYS_CONTEXT('USERENV', 'CURRENT_SCHEMA') THEN 0 ELSE 1 END,
|
||||
OWNER
|
||||
```
|
||||
|
||||
```sql
|
||||
SELECT OWNER, MVIEW_NAME
|
||||
FROM ALL_MVIEWS
|
||||
WHERE MVIEW_NAME = UPPER('<表名称>')
|
||||
ORDER BY CASE WHEN OWNER = SYS_CONTEXT('USERENV', 'CURRENT_SCHEMA') THEN 0 ELSE 1 END,
|
||||
OWNER
|
||||
```
|
||||
|
||||
只有 `AD_TABLE`、数据库表、普通视图和物化视图都未命中时,才说明当前可见范围内未找到该对象。查询到 BOS 虚拟表时,业务含义和字段配置仍以原 `AD_TABLE` 记录为入口,物理结构与数据查询则以 `REALTABLE_ID` 最终指向的实际表为准。
|
||||
|
||||
**1. 术语 → 表名(AD_TABLE)**
|
||||
|
||||
遇到不懂的业务术语(如"零售单提交"、"采购入库"),先查 AD_TABLE:
|
||||
|
||||
Reference in New Issue
Block a user