DMSQL 程序是 DM 提供的一种过程化 SQL 语言。本文档介绍了 DMSQL 程序支持的各种语法、功能及其使用方法,并提供了大量示例。读者在阅读完本文档后可以自行设计较为复杂的 DMSQL 程序以实现复杂应用逻辑。
1.1 DMSQL 程序简介
DMSQL程序是达梦数据库对标准SQL语言的扩展,是一种过程化SQL语言。在DMSQL程序中,包括一整套数据类型、条件结构、循环结构和异常处理结构等,DMSQL程序中可以执行SQL语句,SQL语句中也可以使用DMSQL函数。
DMSQL程序是一种技术,而不是一种独立的工具,它是和DM数据库服务器紧密结合在一起的。可以认为这种技术是执行DMSQL程序的一种机器,它可以接受任何有效的DMSQL程序,按照语言本身所规定的语义执行,并将结果返回给客户。
DMSQL程序可以分为存储模块和客户端DMSQL程序两类。
用户可以使用DMSQL程序语言创建过程或函数,称为存储过程和存储函数。这些过程或函数像普通的过程或函数一样,有输入、输出参数和返回值,它们与表和视图等数据库对象一样被存储在数据库中,供用户随时调用。存储过程和存储函数在功能上相当于客户端的一段SQL批处理程序,但是在许多方面有着后者无法比拟的优点,它为用户提供了一种高效率的编程手段,成为现代数据库系统的重要特征。通常,我们将存储过程和存储函数统称为存储模块。
客户端DMSQL程序可以实现的功能与存储模块一致,不同的是客户端DMSQL程序并不创建一个具体的数据库对象。其处理方法为DM数据库服务器在预编译阶段将客户端DMSQL程序转化为虚过程。虚过程不需要存储,创建后立即执行,当执行的语句释放时,虚过程对象也一同被释放。客户端DMSQL程序只从语法上和存储模块兼容,完成和存储模块一样的功能,是一种编程手段。
1.2 使用DMSQL程序的优点
DMSQL程序具有以下优点:
- 与SQL语言的完美结合
SQL语言已成为数据库的标准语言,DMSQL程序支持所有SQL数据类型和所有SQL函数,同时支持所有DM对象类型。在DMSQL程序中可以使用SELECT、INSERT、DELETE、UPDATE数据操作语句,事务控制语句,游标操纵语句以及通过动态SQL执行DDL语句。与SQL语言的完美结合使得DMSQL程序不仅能实现SQL的所有功能,且由于其自身的程序设计特性,能提供更加丰富、强大的功能。
- 提供更高的生产率
在使用DMSQL程序设计应用时,围绕存储过程/函数进行设计,可以避免重复编码,提高生产率;在自顶向下设计应用时,不必关心实现的细节;编程方便。从DM7开始,支持C和JAVA语言语法的DMSQL程序,这样在对自定义的DMSQL程序语法不熟悉的情况下也可以对数据库进行各种操作,对数据库的操作更加灵活,也更加容易。
- 提供更好的性能
DMSQL存储模块在创建时被编译成伪码序列,在运行时不需要重新进行编译和优化处理,具有更快的执行速度,可以同时被多个用户调用,并能够减少操作错误。使用存储模块可减少应用对DM的调用,降低系统资源浪费,显著提高性能,尤其是对在网络上与DM通讯的应用更加显著。
- 便于维护
用户定义的存储模块在DM数据库中集中存放,用户可以根据需要随时查询、删除或重建它们,而调用这些存储模块的应用程序可以不作任何修改,或只做少量调整。存储模块能被其他的DMSQL程序或SQL命令调用,任何客户/服务器工具都能访问存储模块,具有很好的可重用性。
- 提供更高的安全性
存储模块可将用户与具体的内部数据操作进行隔离,提高数据库的安全性。如一个存储模块查询并修改一个表的某几个列,管理员将这个存储模块的执行权限授予某用户,而不必将表的访问和修改权限授予这个用户,保证用户只访问修改其需要的数据。
可以使用DM的管理工具管理存储在数据库中的存储模块的安全性,可以授予或撤销数据库其他用户执行存储模块的权限。
1.3 一个简单的DMSQL程序示例
下面通过一个简单的例子让读者对DMSQL程序有一个直观的了解。
CREATE OR REPLACE PROCEDURE RESOURCES.person_account AS
DECLARE
person_count INT;
BEGIN
SELECT COUNT(*) INTO person_count FROM RESOURCES.EMPLOYEE;
DBMS_OUTPUT.PUT_LINE('公司总人数 ' || person_count);
IF person_count < 5 THEN
RAISE_APPLICATION_ERROR(-20001, '公司总人数过少!');
ELSE
NULL;
END IF;
END;
/
该例子创建一个名为RESOURCES.person_account的存储过程,其中定义了变量,在执行部分执行一条SELECT语句,打印查询结果,并对查询结果进行判断,如果查询出的值<5,则抛出一个异常,否则不做任何处理。
这个例子用到了DMSQL程序的定义存储过程、变量定义、执行DML语句、控制语句、抛出异常等功能,而DMSQL程序的功能远不止这些,后续章节将对DMSQL程序的功能一一进行介绍。