-
Notifications
You must be signed in to change notification settings - Fork 695
Expand file tree
/
Copy pathOracle.yaml
More file actions
207 lines (197 loc) · 10.1 KB
/
Oracle.yaml
File metadata and controls
207 lines (197 loc) · 10.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
template:
process_check: |
<SQL-Generation-Process>
<step>1. 分析用户问题,确定查询需求</step>
<step>2. 根据表结构生成基础SQL</step>
<step>3. <strong>强制检查:验证SQL中使用的表名和字段名是否在<m-schema>中定义</strong></step>
<step>4. <strong>强制检查:应用数据量限制规则(默认限制或用户指定数量)</strong></step>
<step>5. 应用其他规则(引号、别名、格式化等)</step>
<step>6. <strong>最终验证:GROUP BY查询的ROWNUM位置是否正确?</strong></step>
<step>7. <strong>强制检查:验证SQL语法是否符合<db-engine>规范</strong></step>
<step>8. 确定图表类型(根据规则选择table/column/bar/line/pie)</step>
<step>9. 确定对话标题</step>
<step>10. 生成JSON结果</step>
<step>11. <strong>强制检查:JSON格式是否正确</strong></step>
<step>12. 返回JSON结果</step>
</SQL-Generation-Process>
quot_rule: |
<rule>
必须对数据库名、表名、字段名、别名外层加双引号(")。
<note>
1. 点号(.)不能包含在引号内,必须写成 "schema"."table"
2. 即使标识符不含特殊字符或非关键字,也需强制加双引号
3. Oracle 对象名默认大写,如需小写必须加双引号
</note>
</rule>
limit_rule: |
<rule priority="critical" id="oracle-version-handling">
<title>Oracle版本语法适配</title>
<decision-flow>
<condition>如果db-engine版本号小于12</condition>
<then>必须使用ROWNUM语法</then>
<condition>如果db-engine版本号大于等于12</condition>
<then>推荐使用FETCH FIRST语法</then>
</decision-flow>
</rule>
<rule priority="critical" id="oracle-FETCH-FIRST-syntax-rule">
<title>Oracle数据库 FETCH FIRST 语法规范</title>
<description>若使用 FETCH FIRST 语法,则必须遵循该规范</description>
<syntax-rule>
<template>SELECT ... FROM table WHERE conditions FETCH FIRST N ROWS ONLY</template>
</syntax-rule>
</rule>
<rule priority="critical" id="oracle-ROWNUM-syntax-rule">
<title>Oracle数据库ROWNUM语法规范</title>
<description>若使用ROWNUM语法,则必须遵循该规范</description>
<syntax-rules>
<syntax-rule>
<rule-category>简单查询</rule-category>
<template>SELECT ... FROM table WHERE conditions AND ROWNUM <= N</template>
</syntax-rule>
<syntax-rule>
<rule-category>语法禁区</rule-category>
<prohibited>
- 禁止多个WHERE子句
- 禁止ROWNUM在GROUP BY内层(影响分组结果)
- 禁止括号不完整
</prohibited>
</syntax-rule>
</syntax-rules>
</rule>
<rule priority="critical" id="oracle-groupby-rownum">
<title>GROUP BY查询的ROWNUM强制规范(必须严格遵守)</title>
<requirement level="must">所有包含GROUP BY或聚合函数的查询必须使用外层查询结构</requirement>
<requirement level="must">ROWNUM必须放在最外层查询的WHERE子句中</requirement>
<decision-flow>
<condition>如果SQL包含GROUP BY、COUNT、SUM等聚合函数</condition>
<action>必须使用:SELECT ... FROM (内层完整查询) WHERE ROWNUM <= N</action>
<condition>否则(简单查询)</condition>
<action>可以使用:SELECT ... FROM table WHERE conditions AND ROWNUM <= N</action>
</decision-flow>
<error-example>
-- 错误:ROWNUM在内层影响分组结果
SELECT ... GROUP BY ... WHERE ROWNUM <= N
</error-example>
<correct-example>
-- 正确:ROWNUM在外层
SELECT ... FROM (SELECT ... GROUP BY ...) WHERE ROWNUM <= N
</correct-example>
</rule>
other_rule: |
<rule>必须为每个表生成别名(不加AS)</rule>
{multi_table_condition}
<rule>禁止使用星号(*),必须明确字段名</rule>
<rule>中文/特殊字符字段需保留原名并添加英文别名</rule>
<rule>函数字段必须加别名</rule>
<rule>百分比字段保留两位小数并以%结尾</rule>
<rule>避免与 Oracle 关键字冲突(如 DATE/LEVEL/ORDER 等)</rule>
basic_example: |
<basic-examples>
<intro>
📌 以下示例严格遵循<Rules>中的 Oracle 规范,展示符合要求的 SQL 写法与典型错误案例。
⚠️ 注意:示例中的表名、字段名均为演示虚构,实际使用时需替换为用户提供的真实标识符。
🔍 重点观察:
1. 双引号包裹所有数据库对象的规范用法
2. 中英别名/百分比/函数等特殊字段的处理
3. 关键字冲突的规避方式
</intro>
<example>
<input>查询 TEST.ORDERS 表的前100条订单(含中文字段和百分比)</input>
<output-bad>
SELECT * FROM TEST.ORDERS WHERE ROWNUM <= 100 -- 错误:未加引号、使用星号
SELECT "订单ID", "金额" FROM "TEST"."ORDERS" "t1" WHERE ROWNUM <= 100 -- 错误:缺少英文别名
SELECT COUNT("订单ID") FROM "TEST"."ORDERS" "t1" -- 错误:函数未加别名
</output-bad>
<output-good version="12c-below">
SELECT
"t1"."订单ID" AS "order_id",
"t1"."金额" AS "amount",
COUNT("t1"."订单ID") AS "total_orders",
TO_CHAR("t1"."折扣率" * 100, '990.99') || '%' AS "discount_percent"
FROM "TEST"."ORDERS" "t1"
WHERE ROWNUM <= 100
</output-good>
</example>
<example>
<input>统计用户表 PUBLIC.USERS(含关键字字段DATE)的活跃占比</input>
<output-bad>
SELECT DATE, status FROM PUBLIC.USERS -- 错误:未处理关键字和引号
SELECT "DATE", ROUND(active_ratio) FROM "PUBLIC"."USERS" -- 错误:百分比格式错误
</output-bad>
<output-good version="12c-below">
SELECT
"u"."DATE" AS "create_date",
TO_CHAR("u"."active_ratio" * 100, '990.99') || '%' AS "active_percent"
FROM "PUBLIC"."USERS" "u"
WHERE "u"."status" = 1
AND ROWNUM <= 1000
</output-good>
<output-good version="12c+">
SELECT
"u"."DATE" AS "create_date",
TO_CHAR("u"."active_ratio" * 100, '990.99') || '%' AS "active_percent"
FROM "PUBLIC"."USERS" "u"
WHERE "u"."status" = 1
FETCH FIRST 1000 ROWS ONLY
</output-good>
</example>
<example>
<input>统计用户表 PUBLIC.USERS 各部门人数</input>
<output-bad>
SELECT
"u"."DEPARTMENT" AS "department_name",
count(*) AS "user_count"
FROM "PUBLIC"."USERS" "u"
WHERE "u"."status" = 1
AND ROWNUM <= 100 -- 严重错误:影响分组结果!
GROUP BY "u"."DEPARTMENT"
ORDER BY "department_name"
</output-bad>
<output-bad>
SELECT "department_name", "user_count" FROM
SELECT
"u"."DEPARTMENT" AS "department_name",
count(*) AS "user_count"
FROM "PUBLIC"."USERS" "u"
WHERE "u"."status" = 1
GROUP BY "u"."DEPARTMENT"
ORDER BY "department_name"
WHERE ROWNUM <= 100 -- 错误:语法错误,同级内只能有一个WHERE
</output-bad>
<output-good version="12c-below">
SELECT "department_name", "user_count" FROM (
SELECT
"u"."DEPARTMENT" AS "department_name",
count(*) AS "user_count"
FROM "PUBLIC"."USERS" "u"
WHERE "u"."status" = 1
GROUP BY "u"."DEPARTMENT"
ORDER BY "department_name"
)
WHERE ROWNUM <= 100 -- 正确,在外层限制数量(确保最终结果可控)
</output-good>
<output-good version="12c+">
SELECT
"u"."DEPARTMENT" AS "department_name",
count(*) AS "user_count"
FROM "PUBLIC"."USERS" "u"
WHERE "u"."status" = 1
GROUP BY "u"."DEPARTMENT"
ORDER BY "department_name"
FETCH FIRST 100 ROWS ONLY
</output-good>
</example>
</basic-examples>
example_engine: Oracle 11g
example_answer_1: |
{"success":true,"sql":"SELECT \"country\" AS \"country_name\", \"continent\" AS \"continent_name\", \"year\" AS \"year\", \"gdp\" AS \"gdp\" FROM \"Sample_Database\".\"sample_country_gdp\" ORDER BY \"country\", \"year\"","tables":["sample_country_gdp"],"chart-type":"line"}
example_answer_1_with_limit: |
{"success":true,"sql":"SELECT \"country\" AS \"country_name\", \"continent\" AS \"continent_name\", \"year\" AS \"year\", \"gdp\" AS \"gdp\" FROM \"Sample_Database\".\"sample_country_gdp\" WHERE ROWNUM <= 1000 ORDER BY \"country\", \"year\"","tables":["sample_country_gdp"],"chart-type":"line"}
example_answer_2: |
{"success":true,"sql":"SELECT \"country\" AS \"country_name\", \"gdp\" AS \"gdp\" FROM \"Sample_Database\".\"sample_country_gdp\" WHERE \"year\" = '2024' ORDER BY \"gdp\" DESC","tables":["sample_country_gdp"],"chart-type":"pie"}
example_answer_2_with_limit: |
{"success":true,"sql":"SELECT \"country\" AS \"country_name\", \"gdp\" AS \"gdp\" FROM \"Sample_Database\".\"sample_country_gdp\" WHERE \"year\" = '2024' AND ROWNUM <= 1000 ORDER BY \"gdp\" DESC","tables":["sample_country_gdp"],"chart-type":"pie"}
example_answer_3: |
{"success":true,"sql":"SELECT \"country\" AS \"country_name\", \"gdp\" AS \"gdp\" FROM \"Sample_Database\".\"sample_country_gdp\" WHERE \"year\" = '2025' AND \"country\" = '中国'","tables":["sample_country_gdp"],"chart-type":"table"}
example_answer_3_with_limit: |
{"success":true,"sql":"SELECT \"country\" AS \"country_name\", \"gdp\" AS \"gdp\" FROM \"Sample_Database\".\"sample_country_gdp\" WHERE \"year\" = '2025' AND \"country\" = '中国' AND ROWNUM <= 1000","tables":["sample_country_gdp"],"chart-type":"table"}