达梦数据库存储过程注意事项

引言:达梦数据库是一款国产数据库,在语法使用和函数方面和MySQL,Oracle有着很多相似的地方。但是也有一 些细微的区别。

1、先看一下达梦数据库的存储过程模板:

CREATE OR REPLACE FUNCTION getName()
AS OR IS
DECLARE
...
BEGIN
...
END;

DECLARE关键字之后的省略号是编写数据对象,BEGIN之后的省略号是编写一些执行性的语句。示范如下:

CREATE OR REPLACE FUNCTION GETNAME() RETURN CHAR(50)
AS
DECLARE
FIRSTNAME VARCHAR2(265) DEFAULT '艺博捷诚辉华润耀邦远万晟诺顿启明丰缘捷飞驰阳浩美永利怡润财务员工
报表资金智能物联互联机器设备公车人员游戏产品培训呼叫质量机械';
GONGNENG VARCHAR2(265) DEFAULT '管控监控审计报账中心汇总管理风险控制运营监管监督制度筹集准备生产销
售分配转移质检旋吉皇源啸创鸿泰格力美的利晟尼佳能源国网南网电商佳洲';
PROJECTNAME VARCHAR2(265) DEFAULT '';
BEGIN
SET PROJECTNAME = CONCAT(PROJECTNAME,SUBSTR( FIRSTNAME, FLOOR( 0+ RAND( ) * 64 ), 2
),SUBSTR( GONGNENG, FLOOR( 0+ RAND( ) * 66 ), 2 ));
RETURN PROJECTNAME;
END;

这是一段返回字符串的存储过程。切记存储过程名不可像MySQL的存储过程一样给名称加单引号;也不可使 用RETURNS作为返回关键字!

2、达梦数据库获取UUID的方法:

SELECT NEWID() FROM DUAL;

3、达梦数据库FLOOR函数,向下取整会保留小数点,所以要使用FLOOR处理后的数字为整数型字段赋值会报编译错误。
在这里插入图片描述
4、达梦数据库存储过程使用循环的方法:
FOR循环:

CREATE OR REPLACE PROCEDURE RPADOWNLOADMANAGE_MAIN()
AS
DECLARE
BEGIN
FOR I IN 1..11 LOOP
PRINT(I);
END LOOP;
END;
CALL RPADOWNLOADMANAGE_MAIN();

WHILE循环:

CREATE OR REPLACE PROCEDURE RPADOWNLOADMANAGE_MAIN()
AS
DECLARE
ROBOTNUM INT DEFAULT 10;
I INT DEFAULT 0;
BEGIN
WHILE I < ROBOTNUM LOOP
PRINT(I);
SET I = I + 1;
END LOOP;
END;

5、如何在存储过程中查询其他表:

FOR SCENE IN (SELECT SCENECODE,SCENENAME,VERSION FROM ECPINDEX.T_PORTAL_RPA_SCENE) LOOP
	INSERT INTO ECPINDEX.RPADOWNLOADMANAGE(GID, COMPID, COMPNAME, CUSTID, CUSTNAME, DOWNTIME,
DOWNPERSON,LESSEEID, ROBOTID, ROBOTNAME, PACKAGETYPE, VERSION)
	VALUES(GID, COMPID, COMPNAME, CUSTID, CUSTNAME, NOW(), DOWNPERSON, LESSEEID, SCENE.SCENECODE,
SCENE.SCENENAME,PACKAGETYPE, SCENE.VERSION);
END LOOP;

在这个循环中查询一个表的数据,并且把查询数据作为参数插入到另一个表中。

6、查询表空间的表注意事项:
查询表空间的表需要在表名前加上表空间的名称,如下(表空间名称为ECPINDEX):

‐‐错误写法
SELECT SCENECODE,SCENENAME,VERSION FROM T_PORTAL_RPA_SCENE;
‐‐正确写法
SELECT SCENECODE,SCENENAME,VERSION FROM ECPINDEX.T_PORTAL_RPA_SCENE;

7、存储过程中字符串不可使用双引号:

‐‐错误写法
COMPID VARCHAR(8) DEFAULT "CESI";
‐‐正确写法
COMPID VARCHAR(8) DEFAULT 'CESI';

8、编写具有返回值功能的存储过程最好是实际返回字符串长度多少就设置返回值长度多少,如果设置的返回长度
比实际返回值长,便会用空格补充后面多余的长度,你得到的实际字符串后面会带有空格。如果设置的返回长度小
于实际返回值长度则会报错。
错误范例:

‐‐创建一个返回长度为20字节的方法

CREATE OR REPLACE FUNCTION GETNAME() RETURN CHAR(20)
AS
DECLARE
FIRSTNAME VARCHAR(265) DEFAULT '艺博捷诚辉华润耀邦远万晟诺顿启明丰缘捷飞驰阳浩美永利怡润财务员工报
表资金智能物联互联机器设备公车人员游戏产品培训呼叫质量机械';
PROJECTNAME VARCHAR(265) DEFAULT '';
BEGIN
SET PROJECTNAME = SUBSTR(FIRSTNAME, 1, 3 );
PRINT(PROJECTNAME || '***');
RETURN PROJECTNAME;
END;
‐‐调用GETNAME方法
CREATE OR REPLACE PROCEDURE RPADOWNLOADMANAGE_MAIN()
AS
DECLARE
BEGIN
PRINT(LENGTH(GETNAME()));
PRINT(CONCAT(GETNAME(),'‐‐‐‐'));
END;
‐‐调用RPADOWNLOADMANAGE_MAIN方法
CALL RPADOWNLOADMANAGE_MAIN();

从打印结果看,在GETNAME方法中打印结果没问题,但是在RPADOWNLOADMANAGE_MAIN方法中打印的结果就出了问题,实际字符串长度为17,并且字符串后面有空格。(一个汉字占用两个字节长度,空格则是 一个字节长度,所有length结果为17)。

正确范例:

‐‐创建一个返回长度为6字节的方法
CREATE OR REPLACE FUNCTION GETNAME() RETURN CHAR(6)
AS
DECLARE
FIRSTNAME VARCHAR(265) DEFAULT '艺博捷诚辉华润耀邦远万晟诺顿启明丰缘捷飞驰阳浩美永利怡润财务员工
报表资金智能物联互联机器设备公车人员游戏产品培训呼叫质量机械';
PROJECTNAME VARCHAR(265) DEFAULT '';
BEGIN
SET PROJECTNAME = SUBSTR(FIRSTNAME, 1, 3 );
PRINT(PROJECTNAME || '***');
RETURN PROJECTNAME;
END;
‐‐调用GETNAME方法
CREATE OR REPLACE PROCEDURE RPADOWNLOADMANAGE_MAIN()
AS
DECLARE
BEGIN
PRINT(LENGTH(GETNAME()));
PRINT(CONCAT(GETNAME(),'‐‐‐‐'));
END;
‐‐调用RPADOWNLOADMANAGE_MAIN方法
CALL RPADOWNLOADMANAGE_MAIN();

在这里插入图片描述

从打印结果可以看出,返回值是正常的,后面没有拼接空格。

9、存储过程中使用参数

CREATE OR REPLACE PROCEDURE MAIN(NTP IN INT, STR IN VARCHAR2(15))
AS
DECLARE
BEGIN
PRINT(NTP);
PRINT(STR);
END;
CALL MAIN(12,'123');

在这里插入图片描述

参数写在过程名括号中,多个参数之间用逗号隔开。

10、存储过程中插入表的数据长度要小于等于表中该字段的长度,否则会报字符串截断的错误。所以出现字符串截断错误,要重点检查数据长度和表中字段长度是否匹配。

  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值