达梦数据库入门技术总结

说明:

1)该实验所有过程均是本人亲自敲命令完成,所有代码运行正确

2)安装过程使用的是suse11 sp3操作系统,后续的实验过程换成了麒麟中标,因此部分路径可能存在差异

3)安装过程使用了命令行安装,图形界面简单,因此本文没有介绍

4)job部分命令行操作太繁琐,建议使用图形界面操作,因此本文也跳过了此内容

 

正文

1. 安装
 1.1 创建安装用户组
 #groupadd dinstall

 1.2 创建安装用户
 #useradd -g dinstall -m -d /home/dmdba -s /bin/bash dmdba

 #useradd -g dinstall dmdba

1.3 初始化用户密码
 #passwd dmdba

 1.4 修改系统限制
 #vi /etc/security/limits.conf
 dmdba soft nofile 4096
 dmdba hard nofile 65536

 1.5 挂载镜像文件
 #mkdir /dmdb
 #mount -t iso9660 -o loop /root/dm7_setup_rh6_64_ent_7.6.0.197_20190917.iso /dmdb

 1.6 更改权限
 #chown dmdba.dinstall -R /dmdb
 #chmod 755 -R /dmdb

 1.7 修改环境变量
 #su - dmdba
 #vi .bashrc
 export DM_HOME=/home/dmdba/dmdbms
 export PATH=$DM_HOME/bin:$DM_HOME/tool:$PATH

 1.8 采用命令行模式安装
 #su - dmdba
 #cd /dmdb
 #./DMInstall.bin -i
 1)Please select the installer's language (E/e:English C/c:Chinese) [E/e]:e
 2)Whether to input the path of Key File? (Y/y:Yes N/n:No) [Y/y]:n
 3)Whether to Set The TimeZone? (Y/y:Yes N/n:No) [Y/y]:y
 4)Please Select the TimeZone [21]:21
 5)Installation Type:
   1 Typical
   2 Server
   3 Client
   4 Custom
   Please Input the number of the Installation Type [1 Typical]:1
 6)Please Input the install path [/home/dmdba/dmdbms]:
 7)Please Confirm the install path(/home/dmdba/dmdbms)? (Y/y:Yes N/n:No) [Y/y]:y
 8)Confirm to Install? (Y/y:Yes N/n:No):y
 9)Please execute the commands by root:
   /home/dmdba/dmdbms/script/root/root_installer.sh

 1.9 初始化数据
 #/home/dmdba/dmdbms/bin
 #./dminit
 input system dir: /home/dmdba/dmdbms
 input db name: dmdb01
 input port num: 5236
 input page size(4, 8, 16, 32): 8
 input extent size(16, 32): 16
 input sec priv mode(0, 1): 0
 input time zone(-12:59,+14:00): +08:00
 string case sensitive? ([Y]es, [N]o): n
 which charset to use? (0[GB18030], 1[UTF-8], 2[EUC-KR]): 1
 length in char? ([Y]es, [N]o): y
 enable database encrypt? ([Y]es, [N]o): n  
 page check mode? (0/1/2): 0
 input elog path: /home/dmdba/dmdbms/log
 auto_overwrite mode? (0/1/2): 2

 1.10 启动数据库服务
 #cd /home/dmdba/dmdbms/script/root
 ./dm_service_installer.sh -t dmserver -p dmdb01 -i /home/dmdba/dmdbms/dmdb01/dm.ini
 提示信息:
 Move the service script file(/home/dmdba/dmdbms/bin/DmServicedmdb01 to /etc/init.d/DmServicedmdb01)
 insserv: warning: current stop runlevel(s) (empty) of script `DmServicedmdb01' overwrites defaults (2 3 4 5).
 insserv: Service network is missed in the runlevels 4 to use service mysql
 DmServicedmdb01           0:off  1:off  2:on   3:on   4:on   5:on   6:off
 Finished to create the service (DmServicedmdb01)

 #service DmServicedmdb01 start

 1.11 连接验证(默认密码)
 #/home/dmdba/dmdbms/bin/disql
 username:sysdba
 password:SYSDBA

2.通过vnc调出管理工具
  #xhost +
  #su - dmdba  
  #export DISPLAY=127.0.0.1:1.0  
  #/home/dmdba/dmdbms/tool/manager


3.修改参数(v$parameter)
  3.1 参数类型
    0  Sys/session  动态参数,同时修改内存和配置文件
    1  Read only   在数据库运行状态时,不能修改。
    2  In file   静态参数,修改后,重启服务生效。

示例:
SQL> Select para_name,para_value from v$dm_ini where para_name='BUFFER_POOLS';
LINEID     para_name    para_value
    ---------- ------------ ----------
    1          BUFFER_POOLS 3

  3.2 命令
   SP_PARA_SET_VALUE(SCOPE,PARA_NAME,PARA_VALUE);

SCOPE值:
   1: 修改配置文件和内存
   2:只修改配置文件

示例:
   SQL> SP_SET_PARA_VALUE(2,’BUFFER’,1000);

4.重做日志
  4.1 视图
    v$rlogfile
v$rlog

SQL>  select * from v$rlogfile;
说明:这里查出来的rlog_size大小单位是bit,因此再下面添加日志大小的时候需要除以两次1024转成M

  4.2 添加日志文件
   SQL>  alter database add logfile '/home/dmdba/dmdbms/dmdb01/dmdb0103.log' size 256;
说明:默认单位是M,不需要加单位。并且需要和原来的日志文件大小一致

  4.3 修改日志文件大小
   SQL>  alter database resize logfile '/home/dmdba/dmdbms/dmdb01/dmdb0103.log' to 300;
说明:所有的日志文件要大小一致

5.表空间
  5.1视图
   dba_tablespaces
v$tablespace
v$huge_tablespace

 5.2 表空间说明
   SQL> select TABLESPACE_NAME,STATUS from dba_tablespaces;

   System表空间: 数据字典和全局的系统数据。
   ROLL表空间:存放了数据库运行过程中产生的回滚记录。
   TEMP表空间:临时表空间。
   MAIN表空间:数据库默认的表空间,创建数据对象时,如果不指定存储位置,默认存放到该表空间。
   HMAIN表空间:huge 表空间

 5.3 查询所有表空间信息
   SQL> Select name from v$tablespace union select name from v$huge_tablespace;

5.4 创建表空间
   表空间初始文件大小是页大小的4096倍

示例1:表空间初始大小50M,每次扩展1M,最大100M
SQL> create tablespace tbs1 datafile '/dm7/data/dm01/tbs01.dbf' size 50 autoextend on next 1 maxsize 100;

示例2:表空间初始50M,表空间由2个数据文件组成,分别存储到不同的磁盘上,每次扩展1m,每个数据文件最大100M.
   SQL> create tablespace tbs2 datafile '/dm7/data/dm01/tbs02_1.dbf' size 50 autoextend on next 1 maxsize 100,'/dm7/data/tbs02_2.dbf' size 50 autoextend on next 1 maxsize 100;

 5.5 维护表空间
   最常用的方式就是增加数据文件
SQL> alter tablespace tbs2 add datafile '/dm7/data/dm01/tbs02_3.dbf' size 50 autoextend on next 1 maxsize 100;

 5.6 更换文件存储位置
   注意:SYSTEM,ROLL, TEMP 不能offline;
   SQL> alter tablespace tbs2 offline;
SQL> alter tablespace tbs2 rename datafile '/dm7/data/tbs02_2.dbf' to '/dm7/data/dm01/tbs02_2.dbf';
   SQL> alter tablespace tbs2 online;

 5.7 删除表空间
   SQL> drop tablespace tbs2;
如果表空间存有数据,不允许直接删除!

6.用户管理
 6.1 视图
   dba_users

 6.2 内置用户
   sys         --- 达梦数据库的内置管理用户,不能登录数据库,数据库使用的大部分的数据字典和动态性能视图
   Sysdba      --- 数据库的管理员
   Sysauditor  --- 审计用户
   Syssso      --- 安全用户
   sysdbo      --- 数据操作员(安全版有,四权分立)

 6.3 命名规则
   字母开头,a-z,0-9,$#_

 6.4 口令策略
   用户密码最长为48个字节,创建用户语句使用 password policy 子句来指定口令策略(DM.INI  PWD_POLICY).
   系统支持的口令策略:
   0  无策略
   1  禁止与用户名相同
   2  口令长度不小于9
   4  至少包含一个大写字母(A-Z)
  8  至少包含一个数字(0-9)
 16 至少包含一个标点符号(英文状态输入,除”和空格外)
   口令可以单独使用,也可以组合使用,比如需要应策略1和2,则设置口令策略为:3
   密码尝试登录次数  FAILED_LOGIN_ATTEMPS
   密码失败锁定时间  PASSWORD_LOCK_TIME
   密码过期时间      PASSWORD_LIFE_TIME



 6.5 用户权限
   系统权限:  create  drop  alter  能够对数据库做什么操作。
   对象权限(表,视图,过程等等): select  delete  update insert
   角色: dba、public等

 6.6 查看用户权限:
SQL> select grantee,granted_role from dba_role_privs where grantee='USER1';

行号       GRANTEE GRANTED_ROLE
   ---------- ------- ------------
   1          USER1   PUBLIC

 6.7 查看角色拥有的权限
   SQL> select grantee,privilege from dba_sys_privs where grantee='PUBLIC';
   行号     GRANTEE PRIVILEGE      
   ---------- ------- ----------------
   1          PUBLIC  INSERT TABLE
   2          PUBLIC  UPDATE TABLE
   3          PUBLIC  DELETE TABLE
   4          PUBLIC  SELECT TABLE
   5          PUBLIC  REFERENCES TABLE
   6          PUBLIC  GRANT TABLE
   .....

6.8 示例

  示例1:为数据库设置一个用户,该用户可以创建自己的表,有属于自己的独立表空间,用户密码要求每60天变更一次。
  SQL> create tablespace tbs3 datafile '/dm7/data/dm01/tbs03.dbf' size 32;
  SQL> create user user1 identified by user1user1 limit password_life_time  60 default tablespace tbs3;

示例2:创建一个用户,该用户每60天变更一次密码,密码尝试连接2次失败,账户锁定5分钟,用户还可以查询dmhr.employee表
  SQL> create user user2 identified by user2user2 limit password_life_time 60,  FAILED_LOGIN_ATTEMPS 2 ,PASSWORD_LOCK_TIME 5 default tablespace tbs3;
  SQL> grant select on dmhr.employee to user2;

示例3:企业招聘一批录入人员,权限是固定的,只有录入CITY表的权限
  角色:一类权限的集合
  SQL> create role role1;
  SQL> grant insert on dmhr.city to role1;
  SQL> grant references any table to role1;
  SQL>  grant role1 to user2;

 6.9 用户维护

  1)撤销权限
  SQL> revoke select on dmhr.employee from user2;

2)解锁用户
  SQL> alter user user2 account unlock;

3)修改密码
  SQL> alter user user2 identified by user3user3;

  4)删除用户
  SQL> drop user user2;

  5)删除用户(级联删除)
  SQL> drop user user2 cascade;

7.dmsql
 说明:由于SQL查询内容比较复杂,并且作为数据管理型DBA SQL开发也不是重点,所以这里只总结了大概内容。
 7.1 常识
  dmsql主要基于sql92,部分sql99
  SQL:结构化查询语言
  DDL: 定义  create drop alter truncate
  DML: 管理  select update delete insert
  DCL:控制  grant revoke
  TCL:事务控制:commit rollback

 7.2 select
  简单查询:select () from ();
  过滤查询:select () from () where ();
  多表链接:select() from () join() on();
  分组查询:select 聚合函数() from  ()  group by ()  having ();
  子查询:

 7.3 insert into

 7.4 delete

 7.5 update

8.表的管理
 8.1 达梦数据库支持的表
   索引组织表(默认的表)、堆表、临时表、分区表、外部表等。

8.2 创建表时包含的内容
   命名:字母开头 a-z,0-9,$#_
 数据类型:int char varchar date clob blob number等等。
 存储位置:自已的规划的表空间。
 约束(5大约束): 非空约束,唯一约束,主键,检查,外键
 注释:comment
 遵循3范式

8.3 示例
   1)要求
   表名:STU
   学号(id char(10)),
   姓名(sname varchar(20) not null),
   性别 (sex char(1))
   年龄(age int)
   电话(tel varchar(15) not null)
   家庭住址:(address varchar(50))
   表空间:TBS2
   约束:主键列---学号   非空---姓名,电话
   备注:学员信息表

2)SQL语句
   create table USER2.STU
  (
ID CHAR(10) not null ,
SNAME VARCHAR(20) not null ,
SEX CHAR(1),
AGE INT,
TEL VARCHAR(15) not null ,
ADDRESS VARCHAR(50),
primary key(ID)
  ) storage (on TBS2);
  comment on table USER2.STU is '学员信息表';
  comment on column USER2.STU.ID is '学号';
  comment on column USER2.STU.SNAME is '姓名';
  comment on column USER2.STU.SEX is '性别';
  comment on column USER2.STU.AGE is '年龄';
  comment on column USER2.STU.TEL is '电话';
  comment on column USER2.STU.ADDRESS is '家庭住址';

 8.4 查看表结构
  注意:用户名、表名都要大写
  SQL> sp_tabledef('USER2','STU');

行号     COLUMN_VALUE                                                      
  ---------- -------------------------------------------------------------------
  1          CREATE TABLE "USER2"."STU"  (  
  "ID" CHAR(10) NOT NULL,  
  "SNAME" VARCHAR(20) NOT NULL,  
  "SEX" CHAR(1),  "AGE" INT,  
  "TEL" VARCHAR(15) NOT NULL,  
  "ADDRESS" VARCHAR(50),  
  CLUSTER PRIMARY KEY("ID"))
  STORAGE(ON "TBS2", CLUSTERBTR) ;

  或者:
  SQL> select dbms_metadata.get_ddl('TABLE','STU','USER2');

 8.5 查看表所属表空间
  SQL> select table_name,tablespace_name from dba_tables where table_name='STU';
  行号     TABLE_NAME TABLESPACE_NAME
  ---------- ---------- ---------------
  1          STU        TBS2

8.6 查看表有哪些约束
  SQL> select table_name,constraint_name,constraint_type from dba_constraints where table_name='STU';
  行号     TABLE_NAME CONSTRAINT_NAME CONSTRAINT_TYPE
  ---------- ---------- --------------- ---------------
  1          STU        CONS134218774   P


 8.7 创建表时指定约束
   1)非空约束
SQL> create table user2.t1(id int);
SQL> alter table user2.t1 modify id int not null;
或者:
SQL> create table user2.t2(id int not null);

2)唯一约束
SQL> create table user2.t3(id int unique);

3)主键约束
SQL> create table user2.t4(id int primary key);

4)检查约束
SQL> create table user2.t5(id int check(id>=5));

5)外键约束
SQL> create table user2.t6(id int primary key ,sid int foreign key references user2.t4(id));
说明:作为外键约束的列必须是另外一个表的主键

 8.8 表的注释
   SQL> comment on column user2.t1.id is '编号';

 8.9 导入数据到表中
   1)编写a.sql脚本:
insert into user2.t1(id) values(1);
insert into user2.t1(id) values(2);
insert into user2.t1(id) values(3);
insert into user2.t1(id) values(4);
commit;

2)然后:
SQL> start /tmp/a.sql

3)也可以用图形界面的DTS工具去做。

 8.10 维护表
   1)重命名
SQL> alter table user2.t6 rename to tt6;

2)增加删除列
SQL> alter table user2.tt6 add name varchar(10);
SQL> alter table user2.tt6 drop name;

3)启用禁用约束
SQL> select table_name,constraint_name,constraint_type from dba_constraints where table_name='T4';
   行号     TABLE_NAME CONSTRAINT_NAME CONSTRAINT_TYPE
   ---------- ---------- --------------- ---------------
   1          T4         CONS134218776   P

SQL> alter table user2.t4 disable constraint CONS134218776;
   SQL> alter table user2.t4 enable constraint CONS134218776;

9.视图管理
 9.1 视图分类
   简单视图,复杂视图,物化视图
   注:简单视图和复杂视图不占磁盘空间
   物化视图占磁盘空间

 9.2 创建视图
   create view () as select () from () where ();

SQL>  create view v1 as select * from  user2.t1;
   SQL>  select * from v1;

行号     ID        
   ---------- -----------
   1          1
   2          2
   3          3
   4          4

9.3 查看视图
   SQL> select view_name,text from dba_views where view_name='V1';

行号        VIEW_NAME TEXT                            
   ----------  --------- ---------------------------------
   1          V1         SELECT USER2.T1.ID FROM USER2.T1


 9.4 修改视图
SQL> create or replace view v1 as select * from  user2.t2;
SQL> select * from v1;
   未选定行

10.序列管理
  10.1 创建序列
    SQL> create sequence user2.s1
         start with 1   ----序号起始
         increment by 1  --自增多少
         maxvalue 50   ---最大值
         nocache  ---是否缓存
         nocycle;  ---是否循环

10.2 序列的应用
    SQL> insert into user2.t1 values(user2.s1.nextval);
SQL> insert into user2.t1 values(user2.s1.nextval);
向表中插入两条记录。

SQL> select * from user2.t1;

行号     ID        
    ---------- -----------
    1          1
    2          2
    3          3
    4          4
    5          1
    6          2

6 rows got


11.同义词管理
 11.1 创建同义词
    公共:SQL> create public synonym ss1 for dmhr.employee;
    普通:SQL> create synonym ss2 for dmhr.employee;

SQL> select count(*) from ss1;

行号     COUNT(*)            
    ---------- --------------------
    1          856

11.2 修改同义词
    SQL> create or replace synonym ss2 for dmhr.city;

 11.3 删除同义词
    SQL> drop synonym ss2;
    SQL> drop public synonym ss1;

12.索引管理
  12.1 达梦支持的索引
    二级索引、位图索引、唯一索引、复合索引、函数索引、分区索引等。
    默认的表是索引组织表,是利用rowid创建一个默认的索引,所以创建的索引称为二级索引。

12.2 查看表的索引
    SQL> select table_name,index_name from dba_indexes where table_name='T1';
行号     TABLE_NAME INDEX_NAME  
    ---------- ---------- -------------
    1          T1         INDEX33555470

  12.3 索引的作用
     加快表的查询,对数据库做DML操作的时候,数据库会自动维护索引。索引是一棵倒置的树,使用索引,就是对这棵索引树做遍历。

  12.4 建立索引的规则

 1)适合建立索引的情况
   经常查询的列
       接条件列
        谓词经常出现的列(where)
       查询是返回表的一小部分数据

2)不适合做索引的情况:
       列上有大量的null
       列上的数据有限(例如性别)

12.5 创建索引
     规划索引表空间
     表的数据是无序的,索引的数据是有序的

 示例:在Emp中的employee_id 建立索引。
     1)建立表
       SQL> create table user2.emp as select * from dmhr.employee;
     2)建立索引表空间
       SQL> create tablespace tbs_idx1 datafile '/dm7/data/dm01/tbs_idx101.dbf' size 32;
     3)建立索引:
       SQL> create index ind_emp on user2.emp(employee_id) tablespace tbs_idx1;
     4)查询索引:
       SQL> select table_name,index_name from dba_indexes where table_name='EMP';

行号     TABLE_NAME INDEX_NAME  
       ---------- ---------- -------------
       1          EMP        INDEX33555479
       2          EMP        IND_EMP

12.6 重建索引
      SQL> alter index user2.IND_EMP rebuild;

13.备份还原
  13.1 备份分类
     物理备份、逻辑备份

  13.2 物理备份
    1)工具简介
     冷备:(dmap服务打开的状态下,数据库是关闭的)
     热备:(dmap服务一定是打开的,数据库也是打开的,数据库要开归档)
     导入导出:dexp  dimp
     集群:数据守护(dw),dsc(rac)
     达梦支持第三方的备份软件:爱数,鼎甲

2)物理备份过程(冷备)
第一步:创建归档日志存放路径
     #mkdir /dm7/data/dm01/arch

第二步:开归档
    SQL> alter database mount;
    SQL> alter database add archivelog  'type=local,dest=/dm7/data/dm01/arch,file_size=64,space_limit=0';
    SQL> alter database archivelog;
    SQL> alter database open;
    SQL> select ARCH_MODE,STATUS$ from v$database;
行号       ARCH_MODE STATUS$    
    ---------- --------- -----------
    1          Y         4

第三步:停止数据库服务
[dmdba@localhost dm01]$ service DmServicedm01 stop

第四步:使用dmrman备份
        说明:dmrman 命令必须在命令所在的bin目录下执行才行
    [dmdba@localhost bin]$ pwd
     /dm7/bin
    [dmdba@localhost bin]$ ./dmrman
RMAN> backup database '/dm7/data/dm01/dm.ini';
    根据提示信息找到备份文件位置

3) 使用命令行备份(热备)
 使用命令行备份,同样需要开归档,但是不需要停数据库服务
 #mkdir /dm7/data/backup
 SQL> backup database full backupset '/dm7/data/backup/full_bak';
 增量备份
 SQL> insert into user2.t1 values(user2.s1.nextval);
 SQL> select checkpoint(1);
     SQL> backup database increment backupset '/dm7/data/backup/incr_bak';

  13.3 还原数据
     1)选择实验用户和实验表空间
 SQL> select username,default_tablespace from dba_users where username='USER2';

行号     USERNAME DEFAULT_TABLESPACE
     ---------- -------- ------------------
     1          USER2    TBS3

2)模拟表空间文件损坏
  #mv tbs03.dbf tbs03.dbf.bak

 3)重启服务
  #service DmServicedm01 stop
  #service DmServicedm01 start

 4)手动打开数据库
 SQL> alter database open;

 5)查看表空间状态
 SQL> select TABLESPACE_NAME,STATUS from dba_tablespaces where tablespace_name='TBS3';

行号     TABLESPACE_NAME STATUS    
     ---------- --------------- -----------
     1          TBS3            1

6)恢复数据
 SQL> restore tablespace tbs3 from backupset '/dm7/data/backup/full_bak';

 7)online表空间
 SQL> alter tablespace tbs3 online;

 8)查看表空间状态
 SQL> select TABLESPACE_NAME,STATUS from dba_tablespaces where tablespace_name='TBS3';

行号     TABLESPACE_NAME STATUS    
     ---------- --------------- -----------
     1          TBS3            0

 9)查询数据
 SQL> select * from user2.t1;
 行号     ID        
     ---------- -----------
     1          1
     2          2
     3          3
     4          4
     5          1
     6          2
     7          3
     8          4

8 rows got

13.4  逻辑导入导出
    1)工具简介
Dexp 逻辑导出  dimp 逻辑导入
    Dexp和dimp是DM自带的工具,分为四种级别:
    数据库级,用户级、模式级和表级。四种级别独立互斥,不能同时存在。四种级别所提供的功能:
    数据库级(full):导出或导入整个数据库中的访问对象。
    用户级(owner):导出或导入一个或多个用户所拥有的所有对象。
    模式级(schemas):导出或导入一个或多个模式下的所有对象。
    表级(table):导出或导入一个或多个指定的表或表分区。

2)实验过程
第一步:备份user2下的数据
[dmdba@localhost bin]$ pwd
     /dm7/bin
    [dmdba@localhost bin]$./dexp sysdba/SYSDBA file=/dm7/data/backup/user2.dmp log=/dm7/data/backup/user2.log owner=user2

第二步:恢复数据到user1下
[dmdba@localhost bin]$ pwd
     /dm7/bin
    [dmdba@localhost bin]$./dimp sysdba/SYSDBA file=/dm7/data/backup/user2.dmp log=/dm7/data/backup/user1.log fromuser=user2 touser=user1

第三步:数据确认(两次SQL语句是导入数据前后的对比)
SQL> select * from user1.t1;
    select * from user1.t1;
    [-2106]:Error in line: 1
    Invalid table or view name [t1].
    used time: 1.538(ms). Execute id is 0.

SQL>  select * from user1.t1;

LINEID     id        
   ---------- -----------
   1          1
   2          2
   3          3
   4          4
   5          1
   6          2

6 rows got

14.达梦SQL开发
  14.1 配置ODBC(linux下)
    1)安装(root用户)
    #tar -xvf unixODBC-2.3.0.tar.gz
    #cd unixODBC-2.3.0
    # ./configure --enable-gui=no
    #make
    #make install
    # odbc_config --version
      2.3.0
    #odbc_config --odbcini
      /usr/local/etc/odbc.ini
    #odbcinst -j
      unixODBC 2.3.0
      DRIVERS............: /usr/local/etc/odbcinst.ini
      SYSTEM DATA SOURCES: /usr/local/etc/odbc.ini
      FILE DATA SOURCES..: /usr/local/etc/ODBCDataSources
      USER DATA SOURCES..: /root/.odbc.ini
      SQLULEN Size.......: 8
      SQLLEN Size........: 8
      SQLSETPOSIROW Size.: 8

2)修改配置文件
   #cd /usr/local/etc
   #vi odbc.ini
   [dm7]
   Desription=DM ODBC DSND
   Driver = DM7 ODBC DRIVER
   SERVER = localhost
   UID = SYSDBA
   PWD = Abcd.1234
   TCP_PORT = 5236

#vi odbcinst.ini
   [DM7 ODBC DRIVER]
   Description = ODBC DRIVER FOR DM7
   Driver = /dm7/bin/libdodbc.so

3)修改文件权限
   #chmod 775 odbc.ini
   #chmod 775 odbcinst.ini

4)测试
   #su - dmdba
   #isql dm7
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+

14.2 存储过程
   1)匿名块
SQL> set serveroutput on
   SQL> begin
        print('hello world');
        end;
        /

2)命名块(存储过程)
    SQL> CREATE OR REPLACE PROCEDURE USER2.P1
    AS
   BEGIN
   SELECT * from USER2.T1;
   END;
/

SQL> call user2.p1;

LINEID     id        
   ---------- -----------
   1          1
   2          2
   3          3
   4          4
   5          1
   6          2

6 rows got