实操教程!用 Oracle 26ai Select AI自然语言一键生成SQL
友情提示:这是一篇技术实操文,有点长,但干货满满,建议先收藏。
我做DBA 快 20 年了,写过无数条SQL ,从单表查询到二十几个表关联,从简单聚合到窗口函数套娃,说实话,写 SQL 这事儿吧,熟练了之后确实快,但架不住需求多、变化快、逻辑绕。
以前最怕的两种情况:一是业务方临时要个数据,描述了半天我还得琢磨表结构;二是自己写复杂查询,一个括号位置不对,跑出来结果全错,排查半天。
Oracle 26ai 这个版本,我盯了很久,不为别的,就为那个叫 "Select AI" 的功能 —— 自然语言直接转 SQL 。
一个字:爽。
今天手把手带你走一遍,从零搭到跑出结果。注意,这不是PPT 上的概念,是真正能落地的实操。
一、先搞清楚这是干什么的
简单说,Select AI 就是 Oracle 数据库里内置了一个 AI 能力,你直接写一句人话,比如 " 查出去年每个月的销售额 " ,它自动生成 SQL ,跑出结果给你。
它不是外挂,不是插件,是数据库内核里就有的功能。用的底层是LLM (大语言模型),支持的厂商还挺多: OCI Generative AI 、 Azure OpenAI 、 OpenAI 、 Cohere 、 Google 、 Anthropic 、 Hugging Face 等等。
你想用哪个大模型都行,自己指定。
二、动手之前,这些准备工作一个都不能少
别急着敲代码,先检查以下几个方面。我刚开始踩过坑,漏一步就跑不起来。
1. 确认你的环境支持
Select AI 在 Oracle 26ai 以上版本都支持。不管是云的( Autonomous AI Database )还是本地部署的,都行。我的环境是 Oracle AI Database 26ai 。
2. 确保有DBMS_CLOUD_AI的执行权限
这一步找管理员给个授权:
sql
GRANT EXECUTE ON DBMS_CLOUD_AI TO 你的用户名;
3. 注册AI供应商并获取密钥
我这次用的是OCI Generative AI ,你也可以选别的。需要在你选择的 AI 平台上申请一个 API Key 。
拿到key 之后,在数据库里创建凭证:
sql
BEGIN
DBMS_CLOUD.CREATE_CREDENTIAL(
credential_name => 'OCI_CRED' ,
username => '你的用户名' ,
password => '你的API密钥'
); END ; /
三、核心操作:创建 AI配置(Profile)
这是最关键的一步。AI 配置就是告诉数据库:你要用哪个 AI 、访问哪些表、用哪个模型。
我第一次做的时候,就卡在这里 —— 配置项多,容易写错。
正确的写法是这样的:
sql
BEGIN
DBMS_CLOUD_AI.CREATE_PROFILE(
profile_name => 'GENAI' ,
attributes => '{
"provider": "oci",
"credential_name": "OCI_CRED",
"object_list": [
{"owner": "SH", "name": "customers"},
{"owner": "SH", "name": "countries"},
{"owner": "SH", "name": "products"},
{"owner": "SH", "name": "sales"}
],
"model": "meta.llama-3.3-70b-instruct"
}'
); END ; /
几个关键点说清楚:
· object_list 就是你想让AI 访问的表。你可以理解为, AI 只看你给它看的表,没在列表里的它不会碰。
· provider 是AI 供应商,我用的 OCI ,你也可以换成 "openai" 、 "azure" 、 "google" 这些。
· model 是具体的模型名,不同的供应商支持的模型不一样。
如果你不想一个个表指定,只想让AI 自己发现相关的表,还可以这么写:
sql
"object_list_mode": "automated"
这个模式比较智能,AI 会自动判断哪些表跟你的问题相关,只拿那些表的元数据去生成 SQL 。适合表特别多、记不住表名的情况。
四、激活配置,开始用自然语言问问题
配置创建好之后,激活它:
sql
EXEC DBMS_CLOUD_AI.SET_PROFILE( 'GENAI' );
检查一下是否激活成功:
sql
SELECT DBMS_CLOUD_AI.get_profile() FROM dual;
看到返回的是你配置的名字,就对了。
接下来就是见证奇迹的时刻 ——
问问题:
sql
SELECT AI how many customers exist;
回车,你会看到:
Number of Customers
-------------------
55500
它直接跑出了结果。不是只给你SQL ,是直接跑了 SQL 然后把结果返给你。
再问一个:
sql
SELECT AI how many customers in San Francisco are married;
同样秒出结果。
我当时第一次跑通的时候,说实话有点恍惚。干了好多年DBA ,头一回觉得写 SQL 这件事儿可以这么轻松。
五、干货:这几种 Action你一定要知道
SELECT AI 后面可以跟不同的动作关键词,作用完全不一样。我整理了最常用的几个:
1. runsql(默认动作)
你直接 SELECT AI 后面跟问题,默认就是跑SQL 。上面两个例子就是这个。
2. showsql——只看SQL不跑
有时候你想看看AI 生成的 SQL 到底是啥样的:
sql
SELECT AI showsql how many customers in San Francisco are married;
返回:
sql
SELECT COUNT ( * ) AS total_married_customers FROM "SH"."CUSTOMERS" c WHERE UPPER (c."CUST_CITY") = UPPER ( 'San Francisco' )
AND UPPER (c."CUST_MARITAL_STATUS") = UPPER ( 'married' )
SQL 写得挺规整的,大小写处理了,条件也对了。这对于学习 SQL 写法的人来说,是个很好的老师。
3. explainsql——让它解释SQL
如果你想理解AI 生成的 SQL 逻辑:
sql
SELECT AI explainsql how many customers in San Francisco are married;
它会返回一个中文解释(取决于模型),告诉你这条SQL 是怎么拼的,每个条件的含义。这个功能对于审核 SQL 特别有用。
4. narrate——用自然语言描述结果
这个功能我觉得特别适合做报表。你跑完数据,让它用自然语言描述结果:
sql
SELECT AI narrate what are the top 3 customers in San Francisco;
它会把结果用一段话描述出来,像是:
" 在旧金山的客户中,排名前三的客户分别是 ……"
做数据分析报告的时候,这个功能帮我省了很多写备注的时间。
5. chat——直接跟LLM聊天
不查数据库,就是纯跟大模型聊天。比如:
sql
SELECT AI chat Write the Python code to compute a confusion matrix;
它会直接给你一段Python 代码。写代码、问问题、查文档,都行。
六、进阶玩法: RAG检索增强生成
如果你觉得光靠表的元数据还不够,想让AI 能看懂业务文档里的内容,那就要上 RAG 了。
RAG (检索增强生成)的大概逻辑是:你把业务文档存到数据库里, AI 在回答问题的时候,会先去文档里找相关的信息,然后结合这些信息来回答。
建一个向量索引(Vector Index ):
sql
BEGIN
DBMS_CLOUD_AI.CREATE_VECTOR_INDEX(
index_name => 'MY_INDEX' ,
attributes => '{
"vector_db_provider": "oracle",
"location": "https://objectstorage.你的区域.oraclecloud.com/...",
"object_storage_credential_name": "OCI_CRED",
"profile_name": "GENAI",
"vector_dimension": 384,
"vector_distance_metric": "cosine",
"chunk_overlap": 128,
"chunk_size": 1024
}'
); END ; /
然后你在AI 配置里引用这个向量索引,再问问题的时候, AI 就会去文档里找线索来回答问题。
这个功能适合那些需要结合私有知识库的场景。比如公司的财务制度、产品说明,AI 都能看懂再回答,而不是瞎编。
七、你可能遇到的坑和解决办法
坑 1:SELECT AI之后报错ORA-00923
ORA -00923 : FROM keyword not found where expected
大概率是你的AI 配置没有激活。检查一下 SET_PROFILE 有没有执行成功。
坑 2:SQL生成不对,结果明显有问题
大模型不是 全能 的,有些复杂逻辑可能会生成错误的SQL 。
解决方法有两个:
· 给表加注释(comments ),注释写得越清楚, AI 生成得越准
· 用feedback 功能,告诉 AI 哪里错了,下次它会记住
加注释的方式:
sql
COMMENT ON TABLE customers IS '客户表,包含客户基本信息' ;
COMMENT ON COLUMN customers.cust_marital_status IS '婚姻状态,取值范围:married, single, divorced' ;
然后在创建AI 配置时加上:
json
"comments": "true"
坑 3:AI生成的SQL里用了不该用的表
在配置里加上:
json
"enforce_object_list": "true"
这样AI 只会用你指定的那些表。
坑 4:想用AI改数据?
注意:SELECT AI 只支持查询( SELECT ),不支持 INSERT 、 UPDATE 、 DELETE 、 DDL 这些操作。官方明确说了,安全考虑。
八、总结一下使用场景
我个人觉得以下场景特别适合用Select AI :
1. 业务方临时要数据
以前得等DBA 或开发写 SQL ,现在自己 "SELECT AI 问一下 " ,效率直接拉满。
2. 自己写复杂查询的辅助
先把需求用自然语言描述,看AI 生成的 SQL ,再手动调整。比从零开始写快很多。
3. 学习 SQL 写法
showsql 和 explainsql 结合起来,是个很好的学习工具。
4. 快速验证数据假设
想验证某个想法,直接说话,不用等写SQL 。
九、最后说几句
AI 辅助写 SQL 这件事,前几年大家都在讨论,今年 Oracle 26ai 是真的落地了。不需要额外部署什么平台,数据库里就有的功能。
别把AI 想得太神,复杂的业务逻辑、多表关联的特定写法,该调还得调。但日常查询、数据探索、 SQL 辅助生成,它确实能省下大量时间。
如果你还没试过,建议今天就在测试库上搭一套试试。跑通一次,你就能感受到" 说话就能查数据 " 是什么样的体验。
工具摆在这,用不用看你自己。反正我用了之后,回不去了。
有什么问题欢迎留言交流,或者你有更好的使用技巧,也欢迎分享。
点赞、在看、转发,是对我最大的支持。