DM8开发技能

news2024/11/20 4:44:36

DM8开发技能

基础学习笔记005

文章目录

  • DM8开发技能
  • 1、DMSQL程序设计
    • 1.1 概念
    • 1.2 数据类型
    • 1.3 程序定义
      • 1.3.1 存储过程
      • 1.3.2 存储函数
      • 1.3.3 客户端DMSQL程序
      • 1.3.4 参数
      • 1.3.5 控制结构
        • (1)顺序结构
        • (2)分支结构
        • (3)循环结构
      • 1.3.6 调用语句
    • 1.4 对象及其操作
      • 1.4.1 包
      • 1.4.5类类型
      • 1.4.6 触发器
      • 1.4.7 游标
  • 2、开发实战
    • 2.1 JDBC
      • 2.1.1 提前准备
      • 2.2 代码
    • 2.2 ODBC
      • 2.2.1 配置数据源
      • 2.2.2 测试代码

1、DMSQL程序设计

1.1 概念

DMSQL是一种过程性语言,其DMSQL程序分为两种:存储模块和客户端DMSQL程序

存储模块:一般是存储过程和存储函数的统称

存储过程和存储函数:是用户使用 DMSQL 程序语言创建的过程或函数

1.2 数据类型

数组类型:静态数组、动态数组

集合类型:VARRAY类(可伸缩性数组)、索引表类、嵌套表类

类类型:支持封装成类

游标类型:用于定义游标变量。对游标变量进行赋值时必须是同类型的对象即游标对象

//语法
CURSOR|SYS_REFCURSOR
    
//例子  用 CURSOR 定义游标变量 c2
DECLARE
    CURSOR c1 IS SELECT TITLE FROM RESOURCES.EMPLOYEE WHERE MANAGERID = 3;
	c2 CURSOR;
BEGIN
    c2 =c1;
	open c2;
	close c2;
END;

操作符:算术操作符、关系操作符、比较操作符、逻辑操作符

1.3 程序定义

1.3.1 存储过程

CREATE [OR REPLACE ] PROCEDURE<过程声明><AS_OR_IS><模块体>
//OR REPLACE 选项的作用是当同名的存储过程存在时,首先将其删除,再创建新的存储过程。  

存储过程没有返回值,调用者只能通过访问 OUT 或 IN OUT 参数来获得执行结果

参数模式: 参数模式可设置为 IN、 OUT 或 IN OUT(OUT IN),缺省为 IN 类型

--例子
CREATE OR REPLACE PROCEDURE DMHR.PROC_1(a IN OUT INT) AS
b INT:=10;	
BEGIN
a := a+b;
PRINT a;
EXCEPTION
WHEN OTHERS THEN NULL;
END;
/

1.3.2 存储函数

CREATE [OR REPLACE ] FUNCTION <函数声明><AS_OR_IS><模块体>

存储函数是有返回值

--例1
CREATE OR REPLACE FUNCTION DMHR.fun_1(a INT,b INT) RETURN INT AS
s INT;
BEGIN
s:=a+b;
RETURN s;
EXCEPTION
WHEN OTHERS THEN NULL;
END;
/

SELECT DMHR.FUN_1(1,3);
--例2计算函数
--FOR CALCULATE 指定存储函数为计算函数

CREATE OR REPLACE FUNCTION DMHR.F1 FOR CALCULATE
RETURN INT
IS
BEGIN
RETURN 1;
END;
/
--在表 T 中使用
CREATE TABLE DMHR.T(C1 INT, C2 INT DEFAULT DMHR.F1());
--或者
CREATE TABLE DMHR.T(C1 INT, C2 INT DEFAULT DMHR.F1);

1.3.3 客户端DMSQL程序

客户端DMSQL程序的声明部分必须包含DECLARE。

创建立即执行,执行之后立即释放

1.3.4 参数

参数模式:

​ IN:输入参数,用来将数据传送给模块;

​ IN OUT:输出参数,用来从模块返回数据到进行调用的模块;

​ IN OUT:既作为输入参数,也作为输出参数。

1.3.5 控制结构

(1)顺序结构

(2)分支结构

​ IF语句、CASE语句、WHICH语句

1> IF语句

语法1:

IF 条件 THEN 
代码
END IF;

语法2:

IF 条件 THEN
代码 1
ELSE
代码 2
END IF;

语法3:

IF 条件 1 THEN
代码 1
ELSEIF 条件 2 THEN
代码 2ELSE
代码 N
END IF;

2> CASE语句

语法1:简单形式:将一个表达式与多个值进行比较

这种形式的 CASE 语句会选择第一个满足条件的对应的执行部分来执行,剩下的则不会计算

CASE <条件表达式>
WHEN <条件> THEN <执行部分>;
{WHEN <条件> THEN <执行部分>;}
[ ELSE <执行部分> ]
END [CASE];
--例 定义一个存储过程
CREATE OR REPLACE PROCEDURE PROC_CASE(GRADE CHAR(10)) AS
DECLARE
appraisal VARCHAR2(20);
BEGIN
appraisal :=
CASE GRADE
WHEN NULL THEN 'IS NULL'
WHEN 'A' THEN 'Excellent'
WHEN 'B' THEN 'Good'
WHEN 'C' THEN 'Fair'
ELSE 'No such grade'
END;
DBMS_OUTPUT.PUT_LINE ('Grade ' ||grade|| ' is ' ||appraisal);
END;
/

语法2:搜索形式:对多个条件进行计算,取第一个结果为真的条件

这种形式:CASE 语句依次执行各条件表达式,当遇见第一个为真的条件时,执行其对应的执行部分,在第一个为真的条件后面的所有条件都不会再执行

--例
CREATE OR REPLACE PROCEDURE PROC_CASE(GRADE CHAR(10)) AS
DECLARE
appraisal VARCHAR2(20);
BEGIN
appraisal :=
CASE
WHEN grade IS NULL THEN 'IS NULL'
WHEN grade = 'A' THEN 'Excellent'
WHEN grade = 'B' THEN 'Good'
WHEN grade = 'C' THEN 'Fair'
ELSE 'No such grade'
END;
DBMS_OUTPUT.PUT_LINE ('Grade ' ||grade|| ' is ' ||appraisal);
END;
/

3> WHICH 语句

语法和C语言同

SWITCH (<条件表达式>)
{
CASE <常量表达式> : <执行部分>; BREAK;
{ CASE <常量表达式> : <执行部分>; BREAK;}
[DEFAULT : <执行部分>; ]
}

(3)循环结构

DMSQL支持的循环语句:LOOP 语句、 WHILE 语句、 FOR 语句、REPEAT 语句和 FORALL 语句。

1> LOOP语句

LOOP
<执行部分>;
END LOOP [标号名];

2> WHILE语句

WHILE <条件表达式> LOOP
<执行部分>;
END LOOP [标号名];

3> FOR语句

FOR <循环计数器> IN [REVERSE] <下限表达式> .. <上限表达式> LOOP
<执行部分>;
END LOOP [标号名];
CREATE OR REPLACE PROCEDURE PROC_FOR1 (a IN OUT INT) AS
BEGIN
FOR I IN REVERSE 1 .. a LOOP
PRINT I;
a:=I-1;
END LOOP;
END;
/
CALL PROC_FOR1(5);

4> REPEAT语句

(好像是C语言中do…while)

REPEAT
<执行部分>;
UNTIL <条件表达式>;

5> FORALL 语句

6> EXIT

7> COUNTINUE

1.3.6 调用语句

[CALL] [<模式名>.]<存储模块名>[@dblink_name] [(<参数>{, <参数>})];

1.4 对象及其操作

包、类、触发器、游标、函数、存储过程

1.4.1 包

使用包可以创建应用程序和管理存储过程和函数

使用语法

--创建包
CREATE [OR REPLACE] PACKAGE BODY [<模式名>.]<包名> [WITH ENCRYPTION] AS|IS <包体部分> END [包名]

--重编译包 重编功能主要用于检验包的正确性。
ALTER PACKAGE [<模式名>.]<包名> COMPILE [DEBUG];

/*
包删除
包对象的删除分为包规范的删除和包主体的删除。
*/
--删除包规范
DROP PACKAGE [IF EXISTS] [<模式名>.]<包名>;
--删除包主体
DROP PACKAGE BODY [IF EXISTS] [<模式名>.]<包名>;

--例1


CREATE TABLE Person(Id INT IDENTITY, Name VARCHAR(100), City VARCHAR(100));
INSERT INTO Person(Name, City) VALUES('Tom','武汉');
INSERT INTO Person(Name, City) VALUES('Jack','北京');
INSERT INTO Person(Name, City) VALUES('Mary','上海');
SELECT * FROM Person;


--创建包规范
CREATE OR REPLACE PACKAGE PersonPackage AS
E_NoPerson EXCEPTION;  --异常定义
PersonCount INT; --变量定义
Pcur CURSOR;   --游标定义
PROCEDURE AddPerson(Pname VARCHAR(100), Pcity varchar(100));  --过程定义
PROCEDURE RemovePerson(Pname VARCHAR(100), Pcity varchar(100));
PROCEDURE RemovePerson(Pid INT);
FUNCTION GetPersonCount RETURN INT;  --函数定义
PROCEDURE PersonList;  
END PersonPackage;


--创建包主体
CREATE OR REPLACE PACKAGE BODY PersonPackage AS

PROCEDURE AddPerson(Pname VARCHAR(100), Pcity varchar(100) )AS
BEGIN
INSERT INTO Person(Name, City) VALUES(Pname, Pcity);
PersonCount = PersonCount + SQL%ROWCOUNT;
END AddPerson;

PROCEDURE RemovePerson(Pname VARCHAR(100), Pcity varchar(100)) AS
BEGIN
DELETE FROM Person WHERE NAME LIKE Pname AND City like Pcity;
PersonCount = PersonCount - SQL%ROWCOUNT;
END RemovePerson;

PROCEDURE RemovePerson(Pid INT) AS
BEGIN
DELETE FROM Person WHERE Id = Pid;
PersonCount = PersonCount - SQL%ROWCOUNT;
END RemovePerson;

FUNCTION GetPersonCount RETURN INT AS
BEGIN
RETURN PersonCount;
END GetPersonCount;

PROCEDURE PersonList AS
DECLARE
V_id INT;
V_name VARCHAR(100);
V_city VARCHAR(100);
BEGIN
IF PersonCount = 0 THEN
RAISE E_NoPerson;
END IF;
OPEN Pcur FOR SELECT Id, Name, City FROM Person;
LOOP
FETCH Pcur INTO V_id,V_name,V_city;
EXIT WHEN Pcur%NOTFOUND;
PRINT ('No.' || (cast (V_id as varchar(100))) || ' ' || V_name || '来自' || V_city );
END LOOP;
CLOSE Pcur;
END PersonList;
BEGIN
SELECT COUNT(*) INTO PersonCount FROM Person;
END PersonPackage;


--重新编译包
ALTER PACKAGE PersonPackage COMPILE;
--调用包中的 AddPerson 过程,往数据表中增加一条记录:
CALL PersonPackage. AddPerson ('BLACK', '南京') ;
CALL PersonPackage.REMOVEPERSON(4);--调用包中删除函数
CALL PersonPackage. RemovePerson ('JACK', '北京') ;
--调用包中的变量
SELECT PersonPackage. PersonCount;
SELECT PersonPackage. GetPersonCount;

--调用包中的过程 PersonList 查看表中的所有记录
CALL PersonPackage. PersonList;

SELECT * FROM Person;

1.4.5类类型

分为普通类和Java类

1.4.6 触发器

触发器的使用语法

--基表上创建触发器
CREATE [OR REPLACE] TRIGGER [<模式名>.]<触发器名> [WITH ENCRYPTION]

CREATE OR REPLACE TRIGGER TRG_UPD
AFTER UPDATE OF NAME,CITY ON PERSION1
BEGIN
PRINT 'UPDATE OPERATION ON COLUMNS NAME OR CITY OF PERSION1';
END;

1.4.7 游标

引入原因:使用查询语句将查询结果存放到变量中进行处理的方法 要么返回一条记录,要么返回很多条记录

游标:允许程序对多行数据(结果集)进行逐条处理

类别:

  1. 静态游标

    • 显式游标

    • 隐式游标

  2. 动态游标

显式游标使用步骤:定义、打开、拨动、关闭

--隐式游标
BEGIN
UPDATE DMHR.EMPLOYEE SET PHONE_NUM=1531248552 WHERE DMHR.EMPLOYEE.EMPLOYEE_NAME='马学铭';
IF SQL%NOTFOUND THEN
PRINT '此人不存在';
ELSE
PRINT '已修改';
END IF;
END;

2、开发实战

2.1 JDBC

2.1.1 提前准备

(1)在IDEA中安装maven——便于项目构建

(2)导入DM8JDBC驱动包

(3)新建一个JDBC连接类,测试连接是否成功

(4)若是需要在IDEA中操作数据库:

​ ① 在IDEA中的数据库中新建DM8的数据源并导入驱动,

​ ② 新建好之后进入DM8数据库,输入用户密码和URL测试连接,即可在IDEA中操作数据库

2.2 代码

JDBC连接类:

package org.example.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class JDBC_CONN {
    static Connection con = null;
    static String cname = "dm.jdbc.driver.DmDriver";
    static String url = "jdbc:dm://localhost:5237";
    static String userid = "SYSDBA";
    static String pwd = "SYSDBA";
    public static void main(String[] args) {
        try {
            Class.forName(cname);
            con = DriverManager.getConnection(url, userid, pwd);
            con.setAutoCommit(true);
            System.out.println("[SUCCESS]conn database");
        } catch (Exception e) {
            System.out.println("[FAIL]conn database:" + e.getMessage());
        }
    }
    public void disConn(Connection con) throws SQLException {
        if (con != null) {
            con.close();
        }
    }
}

简单测试操作数据库:

package org.example.test;


import java.sql.*;

public class test1 {
    static Connection con = null;
    static String cname = "dm.jdbc.driver.DmDriver";
    static String url = "jdbc:dm://localhost:5237";
    static String userid = "SYSDBA";
    static String pwd = "SYSDBA";
    static Statement state = null;
    static ResultSet rs = null;

    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        try {
            //连接JDBC驱动程序
            System.out.println("Loading JDBC Driver...");
            Class.forName(cname);
            System.out.println("加载成功");
            //连接DM数据库
            System.out.println("Connecting to DM Server..");
            con = DriverManager.getConnection(url,userid,pwd);
            //通过连接对象创建java.sql.Statement对象
            state = con.createStatement();
            System.out.println("连接成功");

            System.out.println("-----------------------");

            //定义插入SQL语句
            String sql_insert1 = "insert into SYSDBA.T1(name,age)values('带土',10)";
            state.execute(sql_insert1);
            System.out.println("插入成功");

            //定义删除SQL语句
            String sql_del = "delete  from SYSDBA.T1 where age = 12";
            boolean b = state.execute(sql_del);
            System.out.println("删除成功");

            //修改
            String sql_update = "update SYSDBA.T1 set"+" name = '神秘面具男' where name = '带土';";
            state.executeUpdate(sql_update);
            System.out.println("更新成功");

            //定义查询 SQL
            String sql_selectAll = "select * from SYSDBA.T1";
            //执行查询的 SQL 语句
            rs = state.executeQuery(sql_selectAll);


        }catch (ClassNotFoundException e){
            e.printStackTrace();

        }catch (SQLException e){
            e.printStackTrace();
        }finally {
            try {
                rs.close();
                state.close();
                con.close();
            }catch (SQLException e){
                e.printStackTrace();
            }
        }

    }
}


在这里插入图片描述

2.2 ODBC

2.2.1 配置数据源

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2.2.2 测试代码

DM8达梦数据库ODBC 接口 - 墨天轮 (modb.pro)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/124618.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Doo Prime 德璞资本:道琼斯期货投资前必看的入门知识

美国道琼工业指数是全球最受关注的股指之一&#xff0c;而道琼斯期货则是典型的衍生性金融商品&#xff0c;交易的标的是道琼指数本身&#xff0c;属于期货投资的范畴&#xff0c;适合短线进出、波段交易。想要参与美国的期货投资市场&#xff0c;却不知道期货该如何开始吗&…

C# XPath的概念

一 XPath的概念 1 XPath是对XML进行查询的表达式 ① Axes(路径) / 及 //; ② 第几个子节点[1] 等&#xff1b; ③ 属性 ④ 条件 [] ⑤ 例如 /books/book/title //price para[type“warning”][5] 2 使用XPath ① XmlDocument docnew XmlDocument(); ② doc.LoadXml(strXml)…

通过idea打包java Maven项目 架包与全包

1 仅架包 架包定义&#xff1a;指仅将代码打包到jar中&#xff0c;在运行的平台必须保证依赖。 方法&#xff1a;maven —> Lifecyle —> Clean —> Package 2 架包与全包(推荐) 全包定义&#xff1a;将maven项目中的依赖于代码都打为一个包。 方法&#xff1a;mave…

RK3568平台开发系列讲解(Linux系统篇)Linux 管道的使用

🚀返回专栏总目录 文章目录 一、 管道1.1、单向管道1.2、双向管道沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍管道的使用。 一、 管道 在 fork() 成功创建子进程之后,已经打开的文件描述符在父子进程间是共享的,管道就是利用这一特性来工作的。 创建…

C++:设计一个文本行编辑程序,先从输入文件中读取数据,然后根据行编辑命令处理,将结果写到输出文件中。

3.1题目&#xff1a; 设计一个文本行编辑程序 对文本文件按行进行编辑&#xff1a;先从输入文件中读取数据&#xff0c;然后根据行编辑命令处理&#xff0c;将结果写到输出文件中。行编辑命令包括&#xff1a;序号 行编辑命令格式 功能 &#xff11; *L m&#xff0c;n …

ts概述、ts环境准备和编译、ts类型声明

文章目录1. ts概述2. ts环境准备和编译3. ts类型声明3.1 布尔值3.2 数字类型3.3 字符串类型3.4 any和unknown3.5 void、null、undefined3.6 never类型3.7 字面量类型3.8 枚举类型3.9 object对象类型3.10 数组3.11 元组3.12 自定义类型type3.13 联合类型3.14 交叉类型3.15 类型断…

《深入理解计算机系统》学习笔记 —— 虚拟内存详解

文章目录虚拟内存物理内存、物理地址、虚拟地址虚拟地址空间虚拟内存缓存页表分配页面页命中缺页虚拟内存的好处简化链接mmap虚拟内存的私有性地址翻译我们先看一下使用页表进行地址翻译有哪些东西&#xff1a;虚拟地址到物理地址处理过程页面大小和虚拟地址物理地址关系TLB翻译…

2022年,我45岁,一息尚存不落征帆,静稳前行未来可期

2022年&#xff0c;我45岁&#xff0c;一息尚存不落征帆&#xff0c;静稳前行未来可期&#xff0c; 关键词&#xff1a;模式固定&#xff0c;回顾与审视&#xff0c;不间断地阅读 模式固定 本年的52周&#xff0c;每逢周五我会把还在更新的15册讲书各讲一期。每期讲20分钟左…

nodejs mp2 姿势启动

以前运行 nodejs 代码都是 node xxx.js&#xff1b; 但是很容易就关掉了&#xff0c; 或者你想看跟详细的数据 是看不到的。 可以试试 pm2的方式 运行你的代码&#xff1b;学习新的姿势&#xff01; pm2的安装&#xff1a; 1&#xff1a; npm install pm2 -g C:\Users\Admini…

数据治理:数据治理框架和标准

参考《一本书讲透数据治理》、《数据治理》等 数据治理并不是新概念&#xff0c;在国内外都有实践&#xff0c;这里重点介绍下国内外对数据治理的主流框架和标准 国际数据治理框架 国际上&#xff0c;主流的数据治理框架主要有&#xff1a;ISO数据治理标准、GDI数据治理框架、…

深入浅出scala之函数(匿名函数)(P41-45)

文章目录1.函数的定义2.匿名函数3.递归函数4.无参函数5.方法和函数的区别联系1.函数的定义 package MethodDemoobject FunctionDefinition {// 实现加法的功能&#xff0c;省略写法&#xff0c;把函数体写在返回值的位置val f1 ((a: Int, b: Int) > { a b })val f2 (a: …

Charles - 配置抓Chrome、iOS、Android包环境

官网下载地址&#xff1a;https://www.charlesproxy.com/。 1、设置代理http端口 路径&#xff1a;Proxy > Proxy Settings > Proxies > HTTP proxy > Prot 2、设置代理https端口 路径&#xff1a;SSL Proxying Settings > SSL Proxyin 3、Mac证书配置 …

谷粒商城-基础篇-Day06-属性分组

属性分组 抽取出一个tree组件放到modules下的common下的category.vue <template><el-tree :data"menus" :props"defaultProps" node-key"catId"ref"menu"></el-tree> </template><script> //这里可以…

LVGL学习笔记6 - 输入设备

目录 1. 移植文件 2. 移除多余代码 3. 输入设备初始化 4. 输入设备读回调函数 4.1 LV_INDEV_TYPE_POINTER 4.2 LV_INDEV_TYPE_KEYPAD 4.3 LV_INDEV_TYPE_ENCODER 4.4 LV_INDEV_TYPE_BUTTON 5. 事件 6. 实例 7 Group 7.1 创建Group 7.2 与输入设备关联 7.3 添加对…

低频功率放大器参考电路图解大全

功率放大器一般也被我们称为电压放大器&#xff0c;主要是把微弱信号进行电压放大&#xff0c;其输入输出的电压电流一般很小&#xff0c;不能够直接驱动功率较大的仪器。为了满足使用需求&#xff0c;需要在放大器末级增加功率放大器。而功率放大器主要就是放大信号功率&#…

供应商绩效管理对企业采购组织的重要价值

供应商绩效管理是供应商管理中的重要组成部分&#xff0c;它在企业整个采购管理生命周期中起到重要的作用&#xff0c;作为管理好供应商的一个重要手段&#xff0c;现代企业几乎都会对供应商实施绩效考核。供应商绩效管理是对公司供应商的可靠性、质量和性能的监视和分析。它能…

sec2-GObject

1 类和实例 GObject实例用函数g_object_new创建。GObject不仅仅有实例&#xff0c;也有类。 一个GObject类在第一次访问g_object_new时候创建&#xff0c;只有有一个GObject类存在。GObject实例在任何时候访问g_object_new都会被创建&#xff0c;所以就会创建更多GObject实例…

【剧前爆米花--爪哇岛寻宝】String类型构造,修改的底层逻辑与StringBuilder和StringBuffer的关系

作者&#xff1a;困了电视剧 专栏&#xff1a;《JavaSE语法与底层详解》 文章分布&#xff1a;这是一篇关于String类型及其底层构造的文章&#xff0c;如有疏漏&#xff0c;欢迎大佬指正&#xff01; String对象的创建 字符串的用法比较多&#xff0c;所以String类提供的构造方…

算法复杂度 O(1),O(n),O(logn),O(nlogn)的区别

算法复杂度分为时间复杂度和空间复杂度 时间复杂度是指执行这个算法所需要的计算工作量空间复杂度是指这个算法所需要的内存空间 1.对于一个循环&#xff0c;假设循环体的时间复杂度为O(n),循环次数为n&#xff0c;则这个循环的时间复杂度为O(n*1)。 void aFunc(int n) {for…

嵌入式终端的以太网系统简析

一 初识以太网电路 从硬件的角度看&#xff0c;以太网接口电路主要由 MAC&#xff08;Media Access Control&#xff09;控制器和物理层接口 PHY&#xff08;Physical Layer&#xff09;两大部分构成&#xff0c;一般一个嵌入式终端系统的以太网硬件抽象 如下&#xff1a; 1 网…