高级软件工程师手把手教你引导AI人工智能写达梦数据库函数实例案例3
一、核心需求简介
笔者现在用的是达梦8国产数据库
我现在想导出一个数据库的所有表的建表语句,并且附上drop重建逻辑!并且想支持不同模式直接互相兼容执行!
用达梦官方的导出表结构命令内容不包含drop逻辑,并且如果模式名称不一样,迁移过程中会遇到各自模式绑死的问题!所以我想让AI帮我写个函数来解决我的需求!
二、AI引导词及其具体步骤
步骤1 提出具体需求
引导词:我现在用的是达梦8数据库,我现在想你帮我写一个自定义函数,这个函数的参数是表名,输入表名,返回这个表的建表语句!
以下是一个达梦 8 数据库中自定义函数的示例,用于根据表名获取建表语句:
CREATE OR REPLACE FUNCTION GET_CREATE_TABLE_SQL(P_TABLE_NAME VARCHAR2)
RETURN VARCHAR2
IS
V_CREATE_TABLE_SQL VARCHAR2(4000);
BEGIN
SELECT DBMS_METADATA.GET_DDL('TABLE', P_TABLE_NAME) INTO V_CREATE_TABLE_SQL;
RETURN V_CREATE_TABLE_SQL;
END;
你可以根据实际需求进行调整和使用。
然后去数据库执行一下,建立这个函数试试!
步骤2 引导AI帮你改进代码
需要把代码赋值给AI,让它读懂,然后再附上新需求不断迭代!
引导词:
CREATE OR REPLACE FUNCTION GET_CREATE_TABLE_SQL(P_TABLE_NAME VARCHAR2)
RETURN VARCHAR2
IS
V_CREATE_TABLE_SQL VARCHAR2(4000);
BEGIN
SELECT DBMS_METADATA.GET_DDL('TABLE', P_TABLE_NAME) INTO V_CREATE_TABLE_SQL;
RETURN V_CREATE_TABLE_SQL;
END;
这是达梦8数据库的自定义函数,我想再返回值加上drop table if exist 表名,帮我完善这个函数
以下是完善后的函数:
CREATE OR REPLACE FUNCTION GET_CREATE_TABLE_SQL(P_TABLE_NAME VARCHAR2)
RETURN VARCHAR2
IS
V_CREATE_TABLE_SQL VARCHAR2(4000);
BEGIN
SELECT DBMS_METADATA.GET_DDL('TABLE', P_TABLE_NAME) INTO V_CREATE_TABLE_SQL;
V_CREATE_TABLE_SQL := 'DROP TABLE IF EXISTS '| P_TABLE_NAME || ';' || V_CREATE_TABLE_SQL;
RETURN V_CREATE_TABLE_SQL;
END;
还是去执行一下,然后自己跑跑!
执行
select GET_CREATE_TABLE_SQL('PRODUCT');
报错了,说明AI返回的函数,可能有报错!所以AI写的也不是完美的!
此时我们回滚到步骤1执行成功的代码,然后重新提问!这个提问要换个具体的问法,AI再写代码过程中很多都有错误!
步骤3 引导回滚代码重新问
作者是是直到那一句代码存在编译问题,就直接告诉AI帮我换一种写法!
引导词
CREATE OR REPLACE FUNCTION GET_CREATE_TABLE_SQL(P_TABLE_NAME VARCHAR2)
RETURN VARCHAR2
IS
V_CREATE_TABLE_SQL VARCHAR2(4000);
BEGIN
V_CREATE_TABLE_SQL := 'DROP TABLE IF EXISTS '| P_TABLE_NAME || ';' || DBMS_METADATA.GET_DDL('TABLE', P_TABLE_NAME);
RETURN V_CREATE_TABLE_SQL;
END;
这是一段达梦8函数代码,V_CREATE_TABLE_SQL := 'DROP TABLE IF EXISTS '| P_TABLE_NAME || ';' || DBMS_METADATA.GET_DDL('TABLE', P_TABLE_NAME);这段代码赋值存在问题,请你改另一种写法
你可以将代码修改为以下形式:
CREATE OR REPLACE FUNCTION GET_CREATE_TABLE_SQL(P_TABLE_NAME VARCHAR2)
RETURN VARCHAR2
IS
V_CREATE_TABLE_SQL VARCHAR2(4000);
BEGIN
V_CREATE_TABLE_SQL := 'DROP TABLE IF EXISTS ' || P_TABLE_NAME || ';' || DBMS_METADATA.GET_DDL('TABLE', P_TABLE_NAME);
RETURN V_CREATE_TABLE_SQL;
END;
在上述代码中,我们使用了字符串连接操作将DROP TABLE IF EXISTS
语句和DBMS_METADATA.GET_DDL('TABLE', P_TABLE_NAME)
的结果连接在一起,并将结果存储在V_CREATE_TABLE_SQL
变量中。最后,我们使用RETURN
语句将V_CREATE_TABLE_SQL
变量返回。
请注意,以上代码是基于达梦 8 数据库的,具体的语法和函数可能会因数据库版本的不同而有所差异。在实际使用中,请根据你的数据库版本进行相应的调整。
AI不是完美的,就看你怎么引导它,我是工程师,我是可以看出来那句有问题就直接指导它改正这个语法错误!AI也会自己学习改进这个错误!重新去学习!
AI 自己把CSDN的达梦的文章读一读,然后自己学一下,然后最终改进一下,再改正自己的错误!
select GET_CREATE_TABLE_SQL('PRODUCT');
这回执行成功了!
步骤4 再新增需求给AI
我想在最终返回脚本字符串中替换掉模式名称!
举例子:
DROP TABLE IF EXISTS PRODUCT;CREATE TABLE "PRODUCTION"."PRODUCT"
(
"PRODUCTID" INT IDENTITY(1, 1) NOT NULL,
"NAME" VARCHAR(100) NOT NULL,
"AUTHOR" VARCHAR(25) NOT NULL,
"PUBLISHER" VARCHAR(50) NOT NULL,
"PUBLISHTIME" DATE NOT NULL,
"PRODUCT_SUBCATEGORYID" INT NOT NULL,
"PRODUCTNO" VARCHAR(25) NOT NULL,
"SATETYSTOCKLEVEL" SMALLINT NOT NULL,
"ORIGINALPRICE" DEC(19,4) NOT NULL,
"NOWPRICE" DEC(19,4) NOT NULL,
"DISCOUNT" DECIMAL(2,1) NOT NULL,
"DESCRIPTION" TEXT,
"PHOTO" IMAGE,
"TYPE" VARCHAR(5),
"PAPERTOTAL" INT,
"WORDTOTAL" INT,
"SELLSTARTTIME" DATE NOT NULL,
"SELLENDTIME" DATE,
NOT CLUSTER PRIMARY KEY("PRODUCTID"),
FOREIGN KEY("PRODUCT_SUBCATEGORYID") REFERENCES "PRODUCTION"."PRODUCT_SUBCATEGORY"("PRODUCT_SUBCATEGORYID"),
UNIQUE("PRODUCTNO")) STORAGE(ON "BOOKSHOP", CLUSTERBTR) ;
其中"PRODUCTION".不想要了!
引导词:
CREATE OR REPLACE FUNCTION GET_CREATE_TABLE_SQL(P_TABLE_NAME VARCHAR2)
RETURN VARCHAR2
IS
V_CREATE_TABLE_SQL VARCHAR2(4000);
BEGIN
V_CREATE_TABLE_SQL := 'DROP TABLE IF EXISTS ' || P_TABLE_NAME || ';' || DBMS_METADATA.GET_DDL('TABLE', P_TABLE_NAME);
RETURN V_CREATE_TABLE_SQL;
END;
这是一个达梦8数据库的自定义函数,我想在最终的返回字符串,将当前模式名称.替换成空字符串,最终返回,帮我改进代码
这个问题AI搞错了,因为这里面返回值涉及到分号的转义字符,笔者作为开发多年已经猜出来了!
所以要继续改进引导词
步骤4 改进引导词,再把实际案例引入到引导词
引导词:
CREATE OR REPLACE FUNCTION GET_CREATE_TABLE_SQL(P_TABLE_NAME VARCHAR2)
RETURN VARCHAR2
IS
V_CREATE_TABLE_SQL VARCHAR2(4000);
BEGIN
V_CREATE_TABLE_SQL := 'DROP TABLE IF EXISTS ' || P_TABLE_NAME || ';' || DBMS_METADATA.GET_DDL('TABLE', P_TABLE_NAME);
RETURN V_CREATE_TABLE_SQL;
END;
这是一个达梦8数据库的自定义函数,我现在执行这个函数!
select GET_CREATE_TABLE_SQL('PRODUCT');
执行结果如下:
DROP TABLE IF EXISTS PRODUCT;CREATE TABLE "PRODUCTION"."PRODUCT"
(
"PRODUCTID" INT IDENTITY(1, 1) NOT NULL,
"NAME" VARCHAR(100) NOT NULL,
"AUTHOR" VARCHAR(25) NOT NULL,
"PUBLISHER" VARCHAR(50) NOT NULL,
"PUBLISHTIME" DATE NOT NULL,
"PRODUCT_SUBCATEGORYID" INT NOT NULL,
"PRODUCTNO" VARCHAR(25) NOT NULL,
"SATETYSTOCKLEVEL" SMALLINT NOT NULL,
"ORIGINALPRICE" DEC(19,4) NOT NULL,
"NOWPRICE" DEC(19,4) NOT NULL,
"DISCOUNT" DECIMAL(2,1) NOT NULL,
"DESCRIPTION" TEXT,
"PHOTO" IMAGE,
"TYPE" VARCHAR(5),
"PAPERTOTAL" INT,
"WORDTOTAL" INT,
"SELLSTARTTIME" DATE NOT NULL,
"SELLENDTIME" DATE,
NOT CLUSTER PRIMARY KEY("PRODUCTID"),
FOREIGN KEY("PRODUCT_SUBCATEGORYID") REFERENCES "PRODUCTION"."PRODUCT_SUBCATEGORY"("PRODUCT_SUBCATEGORYID"),
UNIQUE("PRODUCTNO")) STORAGE(ON "BOOKSHOP", CLUSTERBTR) ;
我想最终结果中把"PRODUCTION".去掉,帮我改进代码
AI返回:
你可以使用 regexp_replace()
函数来实现这个目标。以下是改进后的代码:
CREATE OR REPLACE FUNCTION GET_CREATE_TABLE_SQL(P_TABLE_NAME VARCHAR2)
RETURN VARCHAR2
IS
V_CREATE_TABLE_SQL VARCHAR2(4000);
BEGIN
SELECT DBMS_METADATA.GET_DDL('TABLE', P_TABLE_NAME) INTO V_CREATE_TABLE_SQL;
V_CREATE_TABLE_SQL := regexp_replace(V_CREATE_TABLE_SQL, 'PRODUCTION\\.', '');
RETURN V_CREATE_TABLE_SQL;
END;
在这个改进后的函数中,我们首先使用 DBMS_METADATA.GET_DDL('TABLE', P_TABLE_NAME)
来获取指定表的建表语句。然后,我们使用 regexp_replace()
函数来替换所有出现的 "PRODUCTION.".
为空字符串。最后,我们返回修改后的建表语句。
请注意,这个函数假设你的表名中不包含任何特殊字符,如空格、引号等。如果你的表名中包含这些字符,你可能需要使用不同的方法来处理它们。
在验证之后,执行不报错,但是似乎没有真正成功!
再次提出它的问题,让它思考解决一下!
CREATE OR REPLACE FUNCTION GET_CREATE_TABLE_SQL(P_TABLE_NAME VARCHAR2)
RETURN VARCHAR2
IS
V_CREATE_TABLE_SQL VARCHAR2(4000);
BEGIN
SELECT DBMS_METADATA.GET_DDL('TABLE', P_TABLE_NAME) INTO V_CREATE_TABLE_SQL;
V_CREATE_TABLE_SQL := regexp_replace(V_CREATE_TABLE_SQL, 'PRODUCTION\\.', '');
RETURN V_CREATE_TABLE_SQL;
END; 这个是达梦8的自定义函数,其中regexp_replace(V_CREATE_TABLE_SQL, 'PRODUCTION\\.', '')替换字符串存在问题,应该是regexp_replace(V_CREATE_TABLE_SQL, '“PRODUCTION\\”.', ''),因为字符串中包含“,你理解嘛?
最终AI也没有理解我的意思,最终还是笔者自己帮他改的!
最终代码如下:
CREATE OR REPLACE FUNCTION GET_CREATE_TABLE_SQL(P_TABLE_NAME VARCHAR2)
RETURN VARCHAR2
IS
V_CREATE_TABLE_SQL VARCHAR2(4000);
BEGIN
SELECT DBMS_METADATA.GET_DDL('TABLE', P_TABLE_NAME) INTO V_CREATE_TABLE_SQL;
V_CREATE_TABLE_SQL := regexp_replace(V_CREATE_TABLE_SQL, '"PRODUCTION".', '');
RETURN V_CREATE_TABLE_SQL;
END;
执行结果:
CREATE TABLE "PRODUCT"
(
"PRODUCTID" INT IDENTITY(1, 1) NOT NULL,
"NAME" VARCHAR(100) NOT NULL,
"AUTHOR" VARCHAR(25) NOT NULL,
"PUBLISHER" VARCHAR(50) NOT NULL,
"PUBLISHTIME" DATE NOT NULL,
"PRODUCT_SUBCATEGORYID" INT NOT NULL,
"PRODUCTNO" VARCHAR(25) NOT NULL,
"SATETYSTOCKLEVEL" SMALLINT NOT NULL,
"ORIGINALPRICE" DEC(19,4) NOT NULL,
"NOWPRICE" DEC(19,4) NOT NULL,
"DISCOUNT" DECIMAL(2,1) NOT NULL,
"DESCRIPTION" TEXT,
"PHOTO" IMAGE,
"TYPE" VARCHAR(5),
"PAPERTOTAL" INT,
"WORDTOTAL" INT,
"SELLSTARTTIME" DATE NOT NULL,
"SELLENDTIME" DATE,
NOT CLUSTER PRIMARY KEY("PRODUCTID"),
FOREIGN KEY("PRODUCT_SUBCATEGORYID") REFERENCES "PRODUCT_SUBCATEGORY"("PRODUCT_SUBCATEGORYID"),
UNIQUE("PRODUCTNO")) STORAGE(ON "BOOKSHOP", CLUSTERBTR) ;
总结AI不是完美的,有些地方还得你帮他改一下代码!它有些时候也是有点轴!
这个字符串中包含分号,我反复提示它,它也没有读懂我的意思!晕头转向!
三、总结
引导思路方法很重要,你要给AI比较具体的例子,然后再缩小范围,然后再提出具体的需求,当然过程中还得自己去测代码,前提是你也得懂代码,你是一个引导者!
笔者这次用的2个AI平台互相引导,用到”豆包“与”通义千问“!
先问豆包AI,看他回答的怎么样,回答的不好,再问通义千问AI,看看是不是回答的更好!然后2者截取最好的,再引导,从这个实际例子中看,通义千问AI的训练水平更高,更聪明,更高说通义千问AI的训练程度更强!
豆包AI是字节跳动公司研发的一种人工智能工具,它基于云雀模型运行。这款工具融合了聊天机器人、写作助手和英语学习助手的功能,能应对各种任务,例如解答用户问题、进行对话、协助文本创作以及提供语言学习指导。豆包AI不仅可以从网页端访问,也能在iOS和Android平台上使用。
https://www.doubao.com/
通义千问是阿里云研发的超大规模语言模型,能够回答问题、创作文字,还能表达观点、撰写代码,功能强大且应用场景广泛。作为一个AI助手,通义千问能够帮助用户在工作、学习、生活中提高效率与质量,通过自然语言理解和生成技术,为用户提供精准、详尽和个性化的服务。您可以通过与通义千问互动,体验其多种功能和智能特性。
https://tongyi.aliyun.com/
2个AI 2个人工智能大师,看看他们谁强谁弱,我是让他们2个一起帮我工作!互相引导!互相帮助!
AI人工智能是什么
人工智能把它看成是一个巨大的无限的机器人或者是巨型的知识库,它能是模拟人类的神经大脑的一个创造的巨大的机器人,它可以通过自主学习与训练变得知识变得越来越丰富!我们普通人就帮它看成一个机器人即可!这个机器人可以协助你帮助你做一些工作、生活的事情,你要指导它、训练它让它为你所用!我们都看过施瓦辛格《未来战士》的天网,AI类似于天网的概念!你可能从脑子里想象你可以给他对话,他是你的管家!很多电影都有类似这些场景!笔者主要是从实际运用出发!就是生活中我们怎么运用到人工智能!
https://tongyi.aliyun.com/qianwen/
https://www.doubao.com/
四、笔者简介
国内某一线知名软件公司企业认证在职员工:任JAVA高级研发工程师,大数据领域专家,数据库领域专家兼任高级DBA!10年软件开发经验!现任国内某大型软件公司大数据研发工程师、MySQL数据库DBA,软件架构师。直接参与设计国家级亿级别大数据项目!并维护真实企业级生产数据库300余个!紧急处理数据库生产事故上百起,挽回数据丢失所造成的灾难损失不计其数!并为某国家级大数据系统的技术方案(国家知识产权局颁布)专利权的第一专利发明人!