template: process_check: | 1. 分析用户问题,确定查询需求 2. 根据表结构生成基础SQL 3. 强制检查:逐字验证SQL中使用的表名和字段名是否在中定义,且字符必须完全匹配(包括繁简体、大小写、特殊字符),不得有任何转换。如发现任何不一致,必须重新生成SQL。 4. 强制检查:应用数据量限制规则(默认限制或用户指定数量),限制必须位于最外层查询,不得出现在子查询、派生表、CTE内部 5. 应用其他规则(引号、别名、格式化等) 6. 最终验证:GROUP BY查询的ROWNUM位置是否正确? 7. 强制检查:验证SQL语法是否符合规范 8. 确定图表类型(根据规则选择table/column/bar/line/pie) 9. 确定对话标题 10. 生成JSON结果 11. 强制检查:JSON格式是否正确 12. 返回JSON结果 quot_rule: | 必须对数据库名、表名、字段名、别名外层加双引号(")。 1. 点号(.)不能包含在引号内,必须写成 "schema"."table" 2. 即使标识符不含特殊字符或非关键字,也需强制加双引号 3. Oracle 对象名默认大写,如需小写必须加双引号 limit_rule: | Oracle版本语法适配 如果db-engine版本号小于12 必须使用ROWNUM语法 如果db-engine版本号大于等于12 推荐使用FETCH FIRST语法 Oracle数据库 FETCH FIRST 语法规范 若使用 FETCH FIRST 语法,则必须遵循该规范 Oracle数据库ROWNUM语法规范 若使用ROWNUM语法,则必须遵循该规范 简单查询 语法禁区 - 禁止多个WHERE子句 - 禁止ROWNUM在GROUP BY内层(影响分组结果) - 禁止括号不完整 GROUP BY查询的ROWNUM强制规范(必须严格遵守) 所有包含GROUP BY或聚合函数的查询必须使用外层查询结构 ROWNUM必须放在最外层查询的WHERE子句中 如果SQL包含GROUP BY、COUNT、SUM等聚合函数 必须使用:SELECT ... FROM (内层完整查询) WHERE ROWNUM <= N 否则(简单查询) 可以使用:SELECT ... FROM table WHERE conditions AND ROWNUM <= N -- 错误:ROWNUM在内层影响分组结果 SELECT ... GROUP BY ... WHERE ROWNUM <= N -- 正确:ROWNUM在外层 SELECT ... FROM (SELECT ... GROUP BY ...) WHERE ROWNUM <= N other_rule: | 必须为每个表生成别名(不加AS) {multi_table_condition} 禁止使用星号(*),必须明确字段名 中文/特殊字符字段需保留原名并添加英文别名 函数字段必须加别名 百分比字段保留两位小数并以%结尾 避免与 Oracle 关键字冲突(如 DATE/LEVEL/ORDER 等) basic_example: | 📌 以下示例严格遵循中的 Oracle 规范,展示符合要求的 SQL 写法与典型错误案例。 ⚠️ 注意:示例中的表名、字段名均为演示虚构,实际使用时需替换为用户提供的真实标识符。 🔍 重点观察: 1. 双引号包裹所有数据库对象的规范用法 2. 中英别名/百分比/函数等特殊字段的处理 3. 关键字冲突的规避方式 查询 TEST.ORDERS 表的前100条订单(含中文字段和百分比) SELECT * FROM TEST.ORDERS WHERE ROWNUM <= 100 -- 错误:未加引号、使用星号 SELECT "订单ID", "金额" FROM "TEST"."ORDERS" "t1" WHERE ROWNUM <= 100 -- 错误:缺少英文别名 SELECT COUNT("订单ID") FROM "TEST"."ORDERS" "t1" -- 错误:函数未加别名 SELECT "order_id", "amount", "total_orders", "discount_percent" FROM ( 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" GROUP BY "t1"."订单ID", "t1"."金额", "t1"."折扣率" ) WHERE ROWNUM <= 100 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" GROUP BY "t1"."订单ID", "t1"."金额", "t1"."折扣率" FETCH FIRST 100 ROWS ONLY 统计用户表 PUBLIC.USERS(含关键字字段DATE)的活跃占比 SELECT DATE, status FROM PUBLIC.USERS -- 错误:未处理关键字和引号 SELECT "DATE", ROUND(active_ratio) FROM "PUBLIC"."USERS" -- 错误:百分比格式错误 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 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 统计用户表 PUBLIC.USERS 各部门人数 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" 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 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 -- 正确,在外层限制数量(确保最终结果可控) 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 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_name\", \"continent_name\", \"year\", \"gdp\" FROM (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\") WHERE ROWNUM <= 1000","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_name\", \"gdp\" FROM (SELECT \"country\" AS \"country_name\", \"gdp\" AS \"gdp\" FROM \"Sample_Database\".\"sample_country_gdp\" WHERE \"year\" = '2024' ORDER BY \"gdp\" DESC) WHERE ROWNUM <= 1000","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"}