DM SQL程序设计基础

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

SQL程序是包含变量,控制结构,过程,函数等要素的一组SQL语句和控制语句的组合,相比普通的sql
语句,SQL程序有更强大的复杂事务处理能力。程序块可以分为无名块和命名块
无名块
没有命名的程序块,无法调用
命名块
有存储过程,触发器,函数,包等等


SQL程序块结构

语句块是DMSQL的基本程序单元。由块声明,执行部分,异常处理部分组成。语法如下:

DECLARE(可选) --声明部分,(声明头部)
/* 声明部分:此处声明程序用到的类型,游标,变量 */
BEGIN (必须) --执行部分
/* 执行部分,即主要的程序体,此处编写此程序块的功能 */
EXCEPTION (可选) --异常处理部分
/* 异常处理部分,编写可能出现的异常的处理方法*/
END (必须)

简要解释:
变量声明部分由关键字 DECLARE 开始,不需要声明时可以不写。程序的执行部分由 BEGINEND 关键字包含其中,这两个关键字是必须的。程序体中还可能包含可选的异常处理部分 EXCEPTION 。
注意:
除 DECLARE , BEGIN , EXCEPTION 后面没有分号 ; 外,其他命令行(包括程序体中的SQL语句)都以英文分号 ; 结束。


SQL程序编写规则

则部分有变量命名规范,大小写,注释等内容。
单行注释: –
多行注释: /* */


变量声明,赋值及操作符

变量用来临时存储数据,使用前必须先声明。需要声明的内容有:变量名,数据类型,初始值等。数据类型可以是DM数据库中的任意类型,也可以是游标,异常等。
常量在初始化后不能改变数据值,DM SQL中声明常量使用 CONSTANT 关键字,且常量必须在声明的同时初始化。


变量,常量声明

例如定义一个简单的SQL程序,查询姓名为马学铭的人:

DECLARE
v_hire_date DATE;
v_namePre CONSTANT VARCHAR(20) := 'SINO'; --定义常量-姓名前缀字段
v_employee_name VARCHAR(50) := '马学铭';
v_salary NUMBER(5) NOT NULL := 3000;
BEGIN
SELECT *FROM DMHR.employee WHERE employee_name = v_employee_name;
END;

赋值

赋值语法:程序变量 := 值


变量类型

SQL程序中的数据类型包括标量,大对象,记录,数组,集合等。


%TYPE类型

在定义变量来处理某个表数据时,可以直接指定与表列相同的数据类型,但表列的数据类型发生变化后变量类型不能动态改变。%TYPE可以动态获取数据表中的字段类型,即使不知道表字段的类型也可使用。例如定义字段 v_employee_name 动态获取表 EMPLOYEE 表中 EMPLOYEE_NAME 的数据类型:

DECLARE
v_employee_name employee.employee_name%TYPE;

%ROWTYPE

%ROWTYPE是可以动态获取表中一行记录的符合类型,将变量定义为此类型可以存储特定表中的行数据。例如定义变量 emp_record 存储 EMPLOYEE 表中姓名为苏国华的记录。

DECLARE
emp_record employee%ROWTYPE;
BEGIN
SELECT * INTO emp_record from DMHR.employee WHERE employee_name = '苏国华';
PRINT emp_record.employee_id;
PRINT emp_record.employee_name;
END;

记录类型

记录类型是一组自定义的数据类型。
语法格式:

TYPE 记录类型名称 IS RECORD(
...
);

示例:定义记录类型存储EMPLOYEE表中的employee_id, employee_name, email, salary字段

DECLARE
TYPE emp_record_type IS RECORD(
v_id DMHR.employee.employee_id%TYPE,
v_name DMHR.employee.employee_name%TYPE,
v_email DMHR.employee.email%TYPE,
v_salary DMHR.employee.salary%TYPE);
emp_record emp_record_type;
BEGIN
SELECT e.EMPLOYEE_ID,e.employee_name,e.email,e.salary INTO emp_record
FROM DMHR.EMPLOYEE e WHERE employee_name = '苏国华';
PRINT
emp_record.v_id||','||emp_record.v_name||','||emp_record.v_email||','||emp_record.v_sa
lary;
END;

数组类型

数组是存储一组相同类型数据的结构,有动态数组和静态数组,这两种又分为一维数组和多维数组。静态数组在创建时指定大小且之后不能更改,动态数组随数据的增加可以重新指定大小。在DM中,数组下标从1开始。

静态数组

语法格式:
TYPE 数组名 IS ARRAY 数据类型 [ 常量表达式 ];
例如:指定一个INT类型的数组arr_type,长度为3

DECLARE
TYPE arr_type IS ARRAY INT [3]; --定义一维数组类型 arr_type
a arr_type; --声明一维数组a,数据类型为arr_type
TYPE arr1_type IS ARRAY INT [2,3]; --定义二维数组类型 arr1_type
b arr1_type; --声明二维数组b,数据类型为arr1_type
BEGIN
FOR i IN 1..3 LOOP --使用FOR..IN..LOOP循环填充数组a
a[i] := i*10;
print a[i];
END LOOP;
FOR i IN 1..2 LOOP --使用嵌套循环填充二维数组b
FOR j IN 1..3 LOOP
b[i][j] := i*10+j;
print b[i][j];
END LOOP;
END LOOP;
END;

动态数组

与静态数组的定义方式基本一致,只是在定义时不用指定下标,使用时才动态分配空间。
语法格式:
TYPE 数组名 IS ARRAY 数据类型[ ,…]
示例:创建动态数组arr

DECLARE
TYPE arr IS ARRAY INT[];
a arr;
BEGIN
a := NEW INT[3];
FOR i IN 1..3
LOOP
a[i] := i*10;
PRINT a[i];
END LOOP;
END;

利用SQL函数快速插入10万条数据

创建测试表

CREATE TABLE TEST_TABLE(
ID INT,
RANDOM_STRING VARCHAR(50),
RANDOM_ID VARCHAR(50));

创建SQL函数,插入1万条数据

DECLARE
i INT;
BEGIN
i := 0;
WHILE(i < 10000)
LOOP
i := i+1;
INSERT INTO TEST_TABLE(ID,RANDOM_STRING,RANDOM_ID) VALUES
(i,dbms_random.string('x', 20),dbms_random.value(0, 100));
END LOOP;
COMMIT;
END;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值