赞
踩
值的含义:1为大小写敏感,0为大小写不敏感
注意:初始化一旦设定是不能更改了的
SQL> select case_sensitive();
LENGTH_IN_CHAR:1代表以字符为单位进行存储,0代表以字节为单位进行存储 (默认以字节为单位进行存储)
CHARSET/UNICODE_FLAG:字符集选项。取值:0 代表 GB18030,1 代表 UTF-8,2 代表韩文字符集 EUC-KR。默认为 0。
通过这两个参数组合使用,具体存储方案如下所示:
注:以上两个参数初始化一旦设定不允许修改
DIsql 是 DM 数据库的一个命令行客户端工具,用来与 DM 数据库服务器进行交互,其存放在安装目录下的bin文件下,通过./disql username/password@ip:port的方式进行连接数据库(ip和端口不写默认是localhost和5236)
使用login命令或者conn命令进行远程数据库的连接
SQL> login
服务名:192.168.223.20
用户名:SYSDBA
SQL> conn SYSDBA/SYSDBA@192.168.223.20:5236
服务器[192.168.223.20:5236]:处于普通打开状态
登录使用时间 : 3.350(ms)
通过logout或者disconn命令退出远程登录
SQL> logout
SQL> disconn
使用set命令来设置和修改环境变量的值
使用show命令用来查看当前环境变量的值
使用spool命令将查询结果输出到指定文件
SQL> spool ‘/dm8/a.sql’
SQL> select * from student;
SQL> spool off
[root@localhost dm8]# cat a.sql
使用host命令可以切换到操作系统下来执行系统命令(不用退出disql)
SQL> host pwd
使用desc命令获取表或视图、存储过程、函数、包、记录、类的结构描述
SQL> desc student
使用start命令来执行sql脚本文件
用户的模式(Schema)指的是用户账号拥有的对象集,在概念上可将其看作是包含表、视图、索引和权限定义的对象。在 DM 中,一个用户可以创建多个模式,一个模式中的对象(表、视图等)可以被多个用户使用。模式不是严格分离的,一个用户可以访问他所连接的数据库中有权限访问的任意模式中的对象
系统为每一个用户自动建立了一个与用户名同名的模式作为其默认模式,用户还可以用模式定义语句建立其它模式
采用模式的原因有几点:
允许多个用户使用一个数据库而不会干扰其它用户;
把数据库对象组织成逻辑组,让它们更便于管理;
第三方的应用可以放在不同的模式中,这样可以避免和其它对象的名字冲突。模式类似于操作系统层次的目录,只不过模式不能嵌套
create schema test authorization demo
create table t_test(
tid int);
insert into t_test values(666);
set schema test;
select * from t_test;
set schema demo;
drop schema test cascade;
常规数据类型主要包括如下几大类
根据数据库初始化时的参数不同,字符串中能存储的汉字的个数也不尽相同
UNICODE_FALG:此参数表示了数据库中所有数据的字符集,包括数据字典的字符集。需要注意的是,数据库一旦初始化完成,字符集就将无法修改。我们可以使用 select unicode 来查询当前数据库的字符集种类,0 代表 gb18030;1 代表 UTF-8。
LENGTH_IN_CHAR:此参数决定了数据库中的 VARCHAR 类型对象的长度是否以字符为单位。0代表以字节为单位,1代表以字符为单位。
精确数值数据类型包括:NUMERIC、DECIMAL、DEC 类型、NUMBER 类型、INTEGER 类型、INT 类型、BIGINT 类型、TINYINT 类型、BYTE 类型、SMALLINT 类型、BINARY 类型、VARBINARY 类型。
近似数值类型包括:FLOAT 类型、DOUBLE 类型、REAL 类型、DOUBLE PRECISION 类型
NUMERIC[(精度 [, 标度])]
NUMERIC 数据类型用于存储零、正负定点数。其中:精度是一个无符号整数,定义了总的数字数,精度范围是 1 至 38。标度定义了小数点右边的数字位数。一个数的标度不应大于其精度,如果实际标度大于指定标度,那么超出标度的位数将会四舍五入省去
create table t_numeric(
num numeric(4,1));
insert into t_numeric values(999.9);
insert into t_numeric values(-999.9);
select * from t_numeric;
插入的数据超出取值范围(取值范围-999.9-999.9)会报错
insert into t_numeric values(1000);
注:其它数值数据类型均可参照上述方式进行测试,这里就不一一演示啦
一般日期时间数据类型
DATE 类型包括年、月、日信息;TIME 类型包括时、分、秒信息;TIMESTAMP 类型包括年、月、日、时、分、秒信息
时间间隔数据类型
DM 支持两类时间间隔类型:年-月间隔类和日-时间隔类,它们通过时间间隔限定符区分,前者结合了日期字段年和月,后者结合了时间字段日、时、分、秒。时间间隔数据类型所描述的值是有符号的
多媒体数据类型的字值有两种格式:一是字符串,二是 BINARY(十六进制)
多媒体数据类型包括:
---------产品种类表---------------
create table product_class(
product_class_id int primary key,
product_class_name varchar(50) not null);
insert into product_class(product_class_name) values(‘Drinks’);
insert into product_class(product_class_name) values(‘Fruit’);
insert into product_class(product_class_name) values(‘Clothing’);
insert into product_class(product_class_name) values(‘Jewelry’);
---------产品存放表---------------
create table product_save(
product_save_id int primary key,
product_save_name varchar(50));
insert into product_save(product_save_name) values(‘Normal’)
insert into product_save(product_save_name) values(‘Special’);
insert into product_save(product_save_name) values(‘Important’);
insert into product_save(product_save_name) values(‘Danger’);
---------产品信息表----------------
create table product(
product_id int primary key,
product_name varchar(20) not null,
product_class_id int not null foreign key references product_class(product_class_id),
product_save_id int not null foreign key references product_save(product_save_id),
product_price double not null);
---------插入测试数据----------------
insert into product(product_name,product_class_id,product_save_id,product_price)
values(‘cola’,1,1,2.5);
insert into product(product_name,product_class_id,product_save_id,product_price)
values(‘beer’,1,2,5.5);
insert into product(product_name,product_class_id,product_save_id,product_price)
values(‘nike’,3,1,299);
insert into product(product_name,product_class_id,product_save_id,product_price)
values(‘adidas’,3,1,199);
insert into product(product_name,product_class_id,product_save_id,product_price)
values(‘gold’,4,3,10000);
insert into product(product_name,product_class_id,product_save_id,product_price)
values(‘durian’,2,4,99);
insert into product(product_name,product_class_id,product_save_id,product_price)
values(‘apple’,2,1,4);
select * from product;
创建外部数据文件:
[root@localhost ext]# cat ext.txt
创建数据控制文件:
[root@localhost ext]# cat ext.ctl
创建外部表时需要先创建目录,再指定控制文件的名称(直接写控制文件路径是不可以的)
注意:from ‘/dm8/extdir/ext.ctl’会报错
正确的写法如下:
create directory extdir as ‘/dm8/ext’;
create external table ext(
r1 int,
r2 int,
r3 int)
from default directory extdir location(‘ext.ctl’);
select * from ext;
查看表结构
call sp_tabledef(‘DEMO’,‘PRODUCT’);
查看表信息(根据具体需要来查询,此处省略)
使用delete语句在student表中删除名称是liming的所有记录
delete from student where name=‘liming’;
select * from stu;
使用turncate语句删除所有表记录
select * from users;
truncate table users;
使用drop语句删除表数据和结构释放存储空间
drop table users;
select * from users;
索引是为了快速检索和定位数据行而创建的一种数据结构
创建索引的语法格式:
CREATE [OR REPLACE] [CLUSTER|NOT PARTIAL][UNIQUE | BITMAP| SPATIAL] INDEX [IF NOT EXISTS] <索引名>
ON [<模式名>.]<表名>(<索引列定义>{,<索引列定义>}) [GLOBAL][<PARTITION子句>][<表空间子句>][<STORAGE子句>] [NOSORT] [ONLINE] [REVERSE] [UNUSABLE] [<PARALLEL项>];
<索引列定义>::= <索引列表达式>[ASC|DESC]
<表空间子句>::= TABLESPACE <表空间名>
<STORAGE子句>::=<STORAGE子句1>|<STORAGE子句2>
<STORAGE子句1>::= STORAGE(<STORAGE1项> {,<STORAGE1项>})
<STORAGE1项> ::=
[INITIAL <初始簇数目>] |
[NEXT <下次分配簇数目>] |
[MINEXTENTS <最小保留簇数目>] |
[ON <表空间名>] |
[FILLFACTOR <填充比例>]|
[BRANCH <BRANCH数>]|
[BRANCH (<BRANCH数>, <NOBRANCH数>)]|
[NOBRANCH ]|
[CLUSTERBTR]|
[SECTION (<区数>)]|
[STAT NONE]
<STORAGE子句2>::= STORAGE(<STORAGE2项> {,<STORAGE2项>})
<STORAGE2项> ::= [ON <表空间名>]|[STAT NONE]
<PARALLEL项> ::=
NOPARALLEL |
PARALLEL [<并行数>]
<PARTITION子句> ::=请参考3.5.1.4 定义水平分区表
常见的索引分类:
创建聚集索引
create cluster index clu_emp_sex on emp(sex);
explain select * from emp where sex=‘woman’;
创建唯一索引
create unique index uni_emp_name on emp(name);
explain select * from emp where name=‘zhangsan’;
创建位图索引(位图索引与聚集索引不能构建在同一表上)
create bitmap index btm_emp_address on emp(address);
explain select * from emp where address=‘wuhan’;
删除索引
drop index index_name;
触发器(TRIGGER)定义当某些与数据库有关的事件发生时,数据库应该采取的操作。
只有具有创建触发器权限的用户或dba用户可以创建触发器,所以要想使用触发器必须具有创建触发器的权限(可以通过dba用户授予),执行触发器不需要授权,由系统自动触发执行
触发器通常用来自动完成数据库的维护工作:
1、可以对表自动进行复杂的安全性、完整性检查;
2、可以在对表进行 DML 操作之前或者之后进行其它处理;
3、进行审计,可以对表上的操作进行跟踪;
4、实现不同节点间数据库的同步更新。
创建触发器的语法格式:
CREATE [OR REPLACE] TRIGGER 触发器名[WITH ENCRYPTION]
BEFORE|AFTER|INSTEAD OF
DELETE|INSERT|UPDATE [OF 列名]
ON 表名
[FOR EACH ROW [WHEN 条件]]
BEGIN
DMSQL程序语句
END;
复杂语法格式说明:
OR REPLACE----如果存在同名触发器,则删除重新创建
WITH ENCRYPTION----对触发器进行加密,其他人看不到触发器定义代码
BEFORE|AFTER|INSTEAD OF----触发器执行时机,其中INSTEAD OF表示执行将
替换原始操作
DELETE|INSERT|UPDATE----选择需要执行的DML操作其中OF可以指定列名
FOR EACH ROW----指明该触发器是元组级触发器(即行级)默认为表级
触发器可以分为以下三类:
表级触发器都是基于表中数据的触发器,它通过针对相应表对象的插入/删除/修改等 DML 语句触发
创建测试数据:
–学生表 student
create table demo.student(
ID INT,NAME VARCHAR(10),
PHONE VARCHAR(11),
CREATE_TIME DATETIME DEFAULT SYSDATE);
–用户表 users
create table demo.users(
ID INT,NAME VARCHAR(10),
CREATE_TIME DATETIME DEFAULT SYSDATE);
创建 AFTER 触发器,该触发器在插入一条记录后,将该记录中ID、NAME的值插入到表USERS
create or replace trigger demo.tri_stu_after
after insert on demo.student
for each row
begin
insert into demo.users(id,name) values(:NEW.id,:NEW.name);
end;
insert into student values(1,‘zhangsan’,‘15930485760’,sysdate);
补充::NEW 和:OLD使用方法和意义,new 只出现在insert和update时,old只出现在update和delete时。在insert时new表示新插入的行数据,update时new表示要替换的新数据、old表示要被更改的原来的数据行,delete时old表示要被删除的数据。
创建 BEFORE 触发器,该触发器在插入一条记录前,将记录中ID的值加 1
create or replace trigger demo.tri_stu_before
before insert on demo.student
for each row
begin
:NEW.id:=:NEW.id+1;
end;
insert into demo.student values(2,‘lisi’,‘17436785670’,sysdate);
select * from student;
创建 INSTEAD OF 触发器,该触发器在动作触发的时候,替换原始操作,INSTEAD OF 允许建立在视图上,并且只支持行级触发
触发器创建之前的视图信息
create view v_stu as select * from demo.student;
select * from demo.v_stu;
触发器创建之后并执行后的视图信息
create or replace trigger ins_of_v_stu
instead of update on demo.v_stu
begin
insert into demo.student values(666,‘dameng’,‘15623406834’,sysdate);
end;
update demo.v_stu set id=2 where id=3;
select * from demo.v_stu;
时间触发器属于一种特殊的事件触发器,可以定义一些有规律性执行的、定点执行的任务。
创建时间触发器,在屏幕上每隔一分钟输出一行 hello dameng
create or replace trigger demo.tri_time
after timer on database
for each 1 day for each 1 minute
begin
print ‘hello dameng’;
end;
每个触发器创建成功后都自动处于允许状态 (ENABLE),当不想被触发,但是又不想删除这个触发器。这时,可将其设置关闭触发器 (DISABLE)
alter trigger demo.tri_stu_before disable;
alter trigger demo.tri_stu_before enable;
drop trigger demo.ins_of_v_stu;
视图是关系数据库系统提供给用户以多种角度观察数据库中数据的重要机制,它简化了用户数据模型,提供了逻辑数据独立性,实现了数据共享和数据的安全保密
创建视图的语法格式:
CREATE [OR REPLACE] VIEW [<模式名>.]<视图名>[(<列名> {,<列名>})] AS <查询说明> [WITH [LOCAL|CASCADED]CHECK OPTION]|[WITH READ ONLY];
<查询说明>::=<表查询> | <表连接>
<表查询>::=<子查询表达式>[ORDER BY子句]
作用:物化视图可以用于数据复制(Data Replication),也可用于数据仓库缓存结果集以此来提升复杂查询的性能
视图可以通俗的理解为用户通过定义自己所特定需求而提前写好的sql语句,视图中的数据来自基表(查询语句所查询的一张表或多张表),基表数据改变视图数据也跟着改变
由两张或两张以上的表导出时可以称作是复杂视图,复杂视图不允许直接 DML,也就是说复杂视图不允许更新
数据要单独存储,占用磁盘空间,规划表空间。物化视图的数据来自于基表,基表发生的变化,物化视图可以根据更新方式来进行数据更新,更新方式可分为手动(默认)和自动,自动又分成快速(fast)、完全(complete)、选择(force)、不更新(never)
创建物化视图的语法格式:
CREATE MATERIALIZED VIEW [<模式名>.]<物化视图名>[(<列名>{,<列名>})][<辅助表子句>|<预建表子句>][<物化视图刷新选项>][<查询改写选项>]AS<查询说明>
<辅助表子句>::= [BUILD IMMEDIATE|BUILD DEFERRED][<表空间子句>][<STORAGE子句>]
<表空间子句>::= 参见3.5.1.1 定义数据库基表
<STORAGE子句>::= 参见3.5.1.1 定义数据库基表
<预建表子句>::= FOR <预建表表名> ON PREBUILT TABLE [WITH REDUCED PRECISION | WITHOUT REDUCED PRECISION]
<物化视图刷新选项> ::= REFRESH <刷新选项> {<刷新选项>} | NEVER REFRESH
<刷新选项> ::= <刷新方法> | <刷新时机> | <刷新规则> | <完全刷新方式>
<刷新方法> ::= FAST | COMPLETE | FORCE
<刷新时机> ::= ON DEMAND | ON COMMIT |
START WITH datetime_expr | NEXT datetime_expr |
START WITH datetime_expr NEXT datetime_expr
<刷新规则> ::= WITH PRIMARY KEY |
WITH ROWID
<完全刷新方式> ::= USING DEFAULT |
USING TRUNCATE |
USING DELETE
<查询改写选项>::= [DISABLE | ENABLE] QUERY REWRITE
<查询说明>::= <表查询> | <表连接>
<表查询>::= <子查询表达式> [ORDER BY子句]
<datetime_expr>::= SYSDATE [+<数值常量>]
考虑到物化视图会实际占用磁盘空间,首先创建表空间专门用来存放物化视图,在创建物化视图时指定该表空间
grant dba to demo;
create tablespace mv datafile ‘/dm8/mv/mv1.dbf’ size 32;
create materialized view demo.mv1 storage (on mv) as select * from demo.student;
select * from mv1;
更新基表数据,由于物化视图的更新方式为手动(创建时不指定自动则为默认),所以基本数据修改物化视图不会更新数据,需要手动刷新
update student set id=6 where name=‘dameng’;
select * from mv1;
refresh materialized view mv1;
select * from mv1;
物化日志的介绍:
当基表上有 DML 操作时,系统将变化记录在日志表里,然后使用这些日志刷新到物化视图,这种刷新方式为快速刷新。通过快速刷新避免了全量刷新,也降低了同步数据的开销。
首先需要创建物化日志,当不指定刷新方式时,默认为force(选择刷新)
创建自动刷新且方式为快速(fast):
alter table student add primary key(id);
create materialized view log on demo.student;
create materialized view demo.mv2 storage (on mv)
refresh fast on commit
as select * from demo.student;
insert into student values(4,‘xiaoming’,‘18946578734’,sysdate);
select * from mv2;
创建刷新方式为完全刷新
可以修改物化视图的刷新时机为自动,删除物化视图日志,删除物化视图
序列是一个数据库实体,通过它多个用户可以产生唯一整数值,可以用序列来自动地生成主关键字值。
创建序列的语法格式:
CREATE SEQUENCE [ <模式名>.] <序列名> [ <序列选项列表>];
<序列选项列表> ::= <序列选项>{<序列选项>}
<序列选项> ::=
INCREMENT BY <增量值>|
START WITH <初值>|
MAXVALUE <最大值>|
NOMAXVALUE|
MINVALUE <最小值>|
NOMINVALUE|
CYCLE|
NOCYCLE|
CACHE <缓存值>|
NOCACHE|
ORDER |
NOORDER |
GLOBAL |
LOCAL
创建序列的初始值为1,增长步幅为2,最大值为100,最小值为1;
create sequence seq1 increment by 2 start with 7 maxvalue 100 minvalue 1;
insert into student values(seq1.nextval,‘liming’,‘15657577880’,sysdate);
select * from student;
将序列的增幅步长修改为10,插入数据测试查看结果
alter sequence seq1 increment by 10;
insert into student values(seq1.nextval,‘liming’,‘15657577880’,sysdate);
select * from student;
drop sequence seq1;
同义词(Synonym)让用户能够为数据库的一个模式下的对象提供别名。同义词通过掩盖一个对象真实的名字和拥有者,并且对远程分布式的数据库对象给予了位置透明特性以此来提供了一定的安全性。同时使用同义词可以简化复杂的 SQL 语句。同义词可以替换模式下的表、视图、序列、函数、存储过程等对象
创建同义词的语法格式:
CREATE [OR REPLACE] [PUBLIC] SYNONYM [<模式名>.]<同义词名> FOR [<模式名>.]<对象名>
创建同义词,并测试查看结果
create synonym stu for student;
select * from stu;
删除同义词
drop synonym stu;
DM 提供两种自增列方式:IDENTITY 自增列和 AUTO_INCREMENT 自增列。两者不能同时指定。
<IDENTITY 子句 > 自增列不能使用 <DEFAULT 子句 >。<IDENTITY 子句 > 的种子和增量缺省值均为 1。
查看自增列的信息:
create table emp(
id int identity(1,1),
name varchar(20),
sex char(5),
address varchar(50),
salary double);
insert into emp values(‘zhangsan’,‘man’,‘wuhan’,8000);
select * from emp;
AUTO_INCREMEN 列必须为主键或主键的部分,只支持整数类型(支持 TINYINT/SMALLINT/INT/BIGINT,不支持 dec(N, 0)等),不能违反主键的唯一性约束
AUTO_INCREMENT 关键字需要和 <AUTO_INCREMENT 子句 >、三个 AUTO_INCREMENT 相关 INI 参数(
alter session set ‘auto_increment_increment’=2;
alter session set ‘auto_increment_offset’=6;
alter session set ‘no_auto_value_on_zero’=1;
create table dept(
id int primary key auto_increment,
name varchar(30)
);
insert into dept(name) values(‘sales’);
insert into dept(name) values(‘computer’);
insert into dept(name) values(‘market’);
select * from dept;
外部链接对象(LINK)是 DM 中的一种特殊的数据库实体对象,它记录了远程数据库的连接和路径信息,用于建立与远程数据的联系
用户可以通过外部链接对远程数据库的表进行查询和增删改操作,以及本地调用远程的存储过程
创建外部链接的语法格式:
CREATE [OR REPLACE] [PUBLIC] LINK <外部链接名> CONNECT [‘<连接库类型>’] WITH <登录名> IDENTIFIED BY <登录口令> USING ‘<外部连接串>’ [<OPTION子句>];
<连接库类型> ::=
DAMENG |
ORACLE |
ODBC |
DPI
<外部链接串>::=
<DAMENG外部链接串>|
<ORACLE外部链接串> |
<ODBC外部链接串> |
<DPI外部链接串>
<DAMENG外部链接串>::=[<连接类型>;]<服务器列表>
<连接类型>::=
PRIMARY FIRST |
STANDBY FIRST |
PRIMARY ONLY |
STANDBY ONLY
<服务器列表>::=
<服务器地址> |
<服务器地址>{,<服务器地址>}
<服务器地址>::=
<实例IP地址>/<实例端口号> |
<MAL IP地址>/<MAL端口号> |
<实例名>
<ORACLE外部链接串>::=
<tsn_name> |
|
<IP地址>/<服务名>
::=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=<IP地址>)(PORT=<端口号>)))(CONNECT_DATA=(SERVICE_NAME=<服务名>)))
<ODBC外部链接串>::= <ODBC数据源DSN>
<DPI外部链接串>::= <IP地址>:<端口号> | <服务名>
<OPTION子句>:: =(<option项>{, <option项>})
<option项>:: =
LOCAL_CODE=<选项值> |
CONVERT_MODE=<选项值> |
BYTES_IN_CHAR=<选项值> |
DB_TYPE=<选项值> |
DATA_CHARSET=<选项值>
CASE_OPT=<选项值>
通过外部链接,可以对远程服务器的对象进行查询或进行增删改操作,可以调用远程的过程或函数
使用外部链接进行查询或增删改的语法格式与普通格式基本一致,唯一的区别在于指定外部链接对象时需要使用如下格式:
<对象名> @ <外部链接名>
首先在两台服务器都配置dmmal.ini启用内部高速通道
服务器1:192.168.223.15
服务器2:192.168.223.20
1) 在每台机器的dm.ini修改MAL_INI=1设置打开
2) 并在和dm.ini目录下创建dmmal.ini,文件内容如下:
[mal_inst1]
mal_inst_name = DMSERVER
mal_host = 192.168.223.15
mal_port = 5282
[mal_inst2]
mal_inst_name = DMSERVER2
mal_host = 192.168.223.20
mal_port = 5283
3) 配置完成后需要重新启动数据库服务
[root@localhost DAMENG]# systemctl restart DmServiceDMSERVER.service
[root@localhost /dm8/data/DAMENG]# systemctl restart DmServiceDMSERVER2
创建服务器1:192.168.223.15的外部链接到服务器2:192.168.223.20
create public link link1 connect with SYSDBA
identified by SYSDBA using ‘192.168.223.20/5283’;
使用外部链接,并验证连通性测试结果
在服务器2:192.168.223.20新建表并插入数据,在服务器1:192.168.223.15通过外部链接访问服务器2:192.168.223.20表中的数据并插入一条数据
注意:这里我一直报这个错:
SQL> select * from users@LINK1;
select * from users@LINK1;
第1 行附近出现错误[-6010]:连接丢失.
已用时间: 0.909(毫秒). 执行号:0.
原因是没有关闭被访问服务器的防火墙,导致网络通讯被阻
[root@localhost /dm8/data/DAMENG]# systemctl stop firewalld
删除外部链接
drop link link2;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。