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

article/2025/11/5 22:15:35

引言:达梦数据库是一款国产数据库,在语法使用和函数方面和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) LOOPINSERT 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、存储过程中插入表的数据长度要小于等于表中该字段的长度,否则会报字符串截断的错误。所以出现字符串截断错误,要重点检查数据长度和表中字段长度是否匹配。


http://chatgpt.dhexx.cn/article/YRe35wLr.shtml

相关文章

MySQL数据库-存储过程详解

存储过程简单来说&#xff0c;就是为以后的使用而保存的一条或多条MySQL语句的集合。可将其视为批件&#xff0c;虽然它们的作用不仅限于批处理。在我看来&#xff0c; 存储过程就是有业务逻辑和流程的集合&#xff0c; 可以在存储过程中创建表&#xff0c;更新数据&#xff0c…

EXTJS5 入门指南

EXTJS5带领EXTJS步入了新的时代&#xff0c;Ext JS 5已经不再支持IE6、IE7和其他旧版本的浏览器了&#xff0c;这样可以显著减少跨整个框架的逻辑和样式设置。再加上额外的优化&#xff0c;Ext JS 5已经为企业级的Web应用程序迈出了惊人的一步。 EXTJS5不在和EXTJS4一样&#x…

ExtJS-入门(转载自http://www.blogjava.net/puras/archive)

2010 - 01 - 13 缩略显示 ExtJS-入门&#xff08;转载自http://www.blogjava.net/puras/archive&#xff09; 文章分类:Web前端 在ExtJS里最常用的,应该就是Ext.onReady这个方法了, 而且它也可能是你学习ExtJS所接触的第一个方法,这个方法在当前的DOM加载完毕后自动调用,保证…

Ext JS 6学习文档–第1章–ExtJS入门指南

Ext JS 入门指南 前言 本来我是打算自己写一个系列的 ExtJS 6 学习笔记的&#xff0c;因为 ExtJS 6 目前的中文学习资料还很少。google 搜索资料时找到了一本国外牛人写的关于 ExtJS 6 的电子书 [Ext JS 6 By Example]。这份资料在 PACKT 上卖 35.99 刀的&#xff0c;当然了万…

Extjs——初步学习

最近在系统学习Extjs框架&#xff0c;从刚一开始接触Extjs到现在发现对Extjs越来越喜欢了。刚开始只是想在页面上实现一个展示大量图片的功能&#xff0c;就像在线订餐系统展示菜单的效果那样&#xff0c;每幅图片上都有一些必要的信息、动作、链接等。效果如下图&#xff1a; …

Extjs基础(一)

1.1基础学习 说明&#xff1a; 本示例的所有代码均在extjs6.2版本上测试通过,学习内容来源于官方文档和自己的一些见解。 1.1.1window组件 简单的一个window面板&#xff1a; title: 窗口标题,height: 220, //可以使用百分比width: 220, html: 内容部分,resizable: true, //…

ExtJS基础入门

公司需要用ExtJS搭建系统框架&#xff0c;然后&#xff0c;这个很老了&#xff0c;没有用过 。 开始进行时候一脸懵逼&#xff0c;因为搜索了相关的知识&#xff0c;面临如下问题&#xff1a; 1.版本太多&#xff0c;从一到六&#xff0c;不知从何入手 2.提供的教程和视频都…

extjs初学者教程

layout 1.面板 (1)类结构 Ext.Base Ext.AbstractComponent Ext.Component Ext.container.AbstractContainer Ext.container.Container Ext.panel.AbstractPanel …

ext.js入门

序言&#xff1a;extjs 是一种OOP语言&#xff0c;可以按照学习Java 的过程来进行学习&#xff0c;可以类比 Java中的图像界面JWT来进行学习。 工具 这些是sencha提供的用于Ext JS应用程序开发的工具&#xff0c;主要用于生产级别。Sencha Cmd Sencha CMD是一个提供Ext JS代码…

EXTJS入门教程及其框架搭建

EXTJS是一个兼容AJAX的前台WEB UI的框架&#xff0c;在普通的HTML文件的 BODY 元素中无须写任何HTML代码&#xff0c;就能产生相应的表格等元素。 原创不易&#xff0c;转载请注明出处&#xff1a;EXTJS入门教程及其框架搭建 代码下载地址:http://www.zuidaima.com/share/17244…

EXTJS详细教程

布局和容器 普通布局 Ext.create(Ext.panel.Panel, {renderTo: Ext.getBody(),width: 400,height: 300,title: Container Panel,items: [{xtype: panel,title: Child Panel 1,height: 100,width: 75%}, {xtype: panel,title: Child Panel 2,height: 100,width: 75%}] });列布…

国嵌视频,买了就是坑

国嵌买视频的&#xff0c;更新慢&#xff0c;谁敢抱怨&#xff0c;踢你&#xff0c;锁你账号&#xff0c;真无语&#xff0c;安卓没录完&#xff0c;3月拖到6月&#xff0c;拖到10月&#xff0c;引起公愤了&#xff0c;就说送路由视频&#xff0c;结果路由视频还没录呢&#xf…

【我爱嵌入式】

童鞋们 自动化嵌入式复习 总结了期末考试简答题的内容 第一章 嵌入式的定义 以应用为中心&#xff0c;以计算机技术为基础&#xff0c;软硬件可裁剪&#xff0c;对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。嵌入式系统主要由嵌入式微处理器、外围硬件设备…

嵌入式教程:什么是嵌入式?

每每有小白接触嵌入式时&#xff0c;总认为是装修风格的一种&#xff0c;类似嵌入式壁炉之类的&#xff0c;而一些有过了 解的朋友可能会以为嵌入式教程就是教单片机的&#xff0c;学习后才发现单片机只是基础。 简单来说&#xff0c;嵌入式就是需要嵌入某些东西里面&#xff…

国嵌视频学习笔记---linux内核开发1

一、linux内核简介 1.linux系统由两部分组成&#xff1a;内核空间和用户空间。 2.用户空间包括&#xff1a;用户应用程序和C库 3.内核空间包括&#xff1a;系统调用接口、内核和体系结构相关代码。 4.ARM处理器7种工作模式&#xff1a;用户模式&#xff0c;快速中断模式、外…

国嵌学习——ARM

从NOR启动&#xff1a;在片选0位置放置的是2M的nor flash&#xff0c;在片选6位置放置的是内存0x30000000 ARM工作模式 ARM处理器的运行模式可以通过软件改变&#xff0c;也可以通过外部中断或异常处理改变。应用程序运行在用户模式下&#xff0c;当处理器运行在用户模式下时&…

国嵌C语言(6-10)

国嵌六&#xff1a; 空结构体的内存&#xff1a; struct D {}; int main(void) {struct D d1;struct D d2;printf("%d\n",sizeof(struct D));printf("%d,%0x\n",sizeof(d1),&d1);printf("%d,%0x\n",sizeof(d2),&d2); } 0 0&#xff…

【嵌入式】

一.进制转换&#xff1a;分别有以下前缀&#xff0c;2进制常用0B表示&#xff0c;8进制常用0O&#xff0c;16进制常用0X表示&#xff1b;1位八进制数等于3位二进制数&#xff0c;1位十六进制数等于4位二进制数&#xff0c;在二进制转化为八&#xff0c;十六进制数时。如果位数不…

关于嵌入式系统

说实话&#xff0c;笔者是对嵌入式有兴趣的&#xff0c;为什么&#xff0c;因为对于我这样的懒人&#xff0c;是希望以后出去找个稳定的工作&#xff0c;随着年龄的增长工资越高&#xff0c;经验越多&#xff0c;就越吃香&#xff0c;而不是当个最底层的码农&#xff0c;35岁之…

国嵌,够欠!---ARM在线教育误区

大家好&#xff0c;先自我介绍一下&#xff0c;我是国嵌学院的一个很普通的学员&#xff0c;因为应届生不好找工作&#xff0c;去培训机构培训又和上课时间冲突&#xff0c;所以选择了自主学习。在机缘巧合之下&#xff0c;购买了国嵌学院的嵌入式Linux开发课程&#xff0c;在此…