CITY
VARCHAR
(
50
)
INSERT
INTO
TEST
(
NAME
,
CITY
)
VALUES
(
'叶枫'
,
'上海'
)
,
(
'沈淼'
,
'武汉'
)
,
(
'罗云'
,
'成都'
)
;
创建包规范
CREATE OR REPLACE PACKAGE PERSON AS
NOPERSON EXCEPTION;
PERSONCOUNT INT;
CSR CURSOR;
PROCEDURE ADDPERSON(NAME VARCHAR(50),CITY VARCHAR(50));
PROCEDURE REMOVEPERSON(V_NAME VARCHAR(50),V_CITY VARCHAR(50));
PROCEDURE REMOVEPERSON(V_ID INT);
FUNCTION GETPERSONCOUNT RETURN INT;
PROCEDURE GETPERSONLIST;
END PERSON;
创建包主体
CREATE OR REPLACE PACKAGE BODY PERSON AS
PROCEDURE ADDPERSON(NAME VARCHAR(50),CITY VARCHAR(50)) AS
BEGIN
INSERT INTO TEST(NAME,CITY) VALUES(NAME,CITY);
PERSONCOUNT=PERSONCOUNT+SQL%ROWCOUNT;
END ADDPERSON;
PROCEDURE REMOVEPERSON(V_NAME VARCHAR(50),V_CITY VARCHAR(50)) AS
BEGIN
DELETE FROM TEST WHERE NAME LIKE V_NAME AND CITY LIKE V_CITY;
PERSONCOUNT=PERSONCOUNT-SQL%ROWCOUNT;
END REMOVEPERSON;
PROCEDURE REMOVEPERSON(V_ID INT) AS
BEGIN
DELETE FROM TEST WHERE ID=V_ID;
PERSONCOUNT=PERSONCOUNT-SQL%ROWCOUNT;
END REMOVEPERSON;
FUNCTION GETPERSONCOUNT RETURN INT AS
BEGIN
RETURN PERSONCOUNT;
END GETPERSONCOUNT;
PROCEDURE GETPERSONLIST AS
DECLARE
V_ID INT;
V_NAME VARCHAR(50);
V_CITY VARCHAR(50);
BEGIN
IF PERSONCOUNT=0 THEN
RAISE NOPERSON;
END IF;
OPEN CSR FOR SELECT ID,NAME,CITY FROM TEST;
FETCH CSR INTO V_ID,V_NAME,V_CITY;
EXIT WHEN CSR%NOTFOUND;
PRINT (CAST(V_ID AS VARCHAR(50))||'号学生是'||V_NAME||',来自'||V_CITY);
END LOOP;
CLOSE CSR;
END GETPERSONLIST;
BEGIN
SELECT COUNT(*) INTO PERSONCOUNT FROM TEST;
END PERSON
重新编译包
ALTER PACKAGE PERSON COMPILE;
调用包中的ADDPERSON过程,往表中加一条记录
SQL> CALL PERSON.ADDPERSON('赵开','北京');
DMSQL 过程已成功完成
已用时间: 1.963(毫秒). 执行号:1925.
SQL> SELECT * FROM TEST;
行号 ID NAME CITY
---------- ----------- ---- ----
1 1 叶枫 上海
2 2 沈淼 武汉
3 3 罗云 成都
4 4 赵开 北京
已用时间: 0.412(毫秒). 执行号:1926.
调用REMOVEPERSON过程,删除刚刚加的记录
SQL> CALL PERSON.REMOVEPERSON('赵开','北京');
DMSQL 过程已成功完成
已用时间: 13.914(毫秒). 执行号:1979.
SQL> SELECT * FROM TEST;
行号 ID NAME CITY
---------- ----------- ---- ----
1 1 叶枫 上海
2 2 沈淼 武汉
3 3 罗云 成都
已用时间: 0.159(毫秒). 执行号:1980.
REMOVEPERSON过程重载,譬如传ID将罗云删除
SQL> CALL PERSON.REMOVEPERSON(3);
DMSQL 过程已成功完成
已用时间: 49.736(毫秒). 执行号:1989.
SQL> SELECT * FROM TEST;
行号 ID NAME CITY
---------- ----------- ---- ----
1 1 叶枫 上海
2 2 沈淼 武汉
已用时间: 0.342(毫秒). 执行号:1990.
引用包中变量,获取总人数
SQL> SELECT PERSON.PERSONCOUNT;
行号 PERSON.PERSONCOUNT
---------- ------------------
1 2
已用时间: 0.867(毫秒). 执行号:1991.
调用包中函数,获取总人数
SQL> SELECT PERSON.GETPERSONCOUNT;
行号 GETPERSONCOUNT
---------- --------------
1 2
已用时间: 0.623(毫秒). 执行号:1992.
调用GETPERSONLIST过程查看表中详细信息
SQL> CALL PERSON.GETPERSONLIST;
1号学生是叶枫,来自上海
2号学生是沈淼,来自武汉
DMSQL 过程已成功完成
已用时间: 0.290(毫秒). 执行号:1995.
包的实现创建测试集DROP TABLE IF EXISTS TEST;CREATE TABLE TEST( ID INT IDENTITY(1,1), NAME VARCHAR(50), CITY VARCHAR(50));INSERT INTO TEST(NAME,CITY) VALUES('叶枫','上海'),('沈淼','武汉'),('罗云','成都');创建包规范CREATE OR REPLACE PACKAGE PERSON AS --创建规范 NOPERSO
包的创建分为两部分,包规范和包体。
1、包定义:包定义部分是为应用程序的接口,声明包内数据类型、变量、常量、游标、子程序和异常错误处理等元素,这些元素为包的公有元素。
CREATE [OR REPLACE] PACKAGE package_name
{IS | AS}
[公有数据类型定义]
[公有游标声明]
[公有变量、常量声明]
[公有子程序声明]
END [package_name];
2、包主体:包主体则是包定义部分的具体实现,它定义了包定义部分所声明的游标和子
dm中和oracle一样,也分为实例和数据库两个概念,而且这两者的概念也基本一致。
唯一的区别是:达梦是单进程,而oracle是多进程的。
实例:共享内存+后台的进程或线程。
数据库:存放到磁盘的文件。
一般是一个db对应一个实例,但是DSC(DM共享集群)多个实例对一个数据库。
dm的服务器组成:
客户端+服务器(实例+数据库)
客户端不能直接去访问数据库,客户端把请求交给实例,实例去访问数据库,把访问信息,返回实例,实例交给交给客户端。
dm的逻辑存储结构:
数据库由一个或多个表空间组成。
每个表空间由一个或多个数据文件组成。
每个数据文件由一个或多个簇组成。
达梦支持哪些类型的表?
和oracle和相似,在oracle中支持的表类型几乎在dm中都存在,但不同的是,oracle中默认是堆表,而在dm中默认是索引组织表,当然这个可以在初始化实例的时候修改。此外,dm中还支持临时表,分区表,外部表等。
如何去规划表?
命名:字母开头 a-z,0-9,$#_
数据类型:int char varchar date clob blob number等等
存储位置:自已的规划表空间
约束(5大约束)
非空,唯一,主键,检查,外键
注释:comment
遵循3范式
案例1:规划一张学员信息表
表名:STU
列:学号(id char(10)),姓名(sname va