shell 脚本连接Oracle数据库创建表结构

工作中用到数据库,但是因为权限问题,plsql一直连不上生产库,之前一直是通过sqlplus连接数据库,虽然查询不太方便显示,但是在一些常规的查询,操作,sqlplus还是比较高效的。现在把我今天弄了一上午(初学)的Oracle数据库创建过程记录下。是通过shell脚本通过sqlplus连接数据库并创建表。在这里把创建表和插入数据的学习文件记录下。比较抠脚,哈哈。

一、创建表 create_student2.sh

创建一个学生信息表,表内容包括:

学生ID,姓名,性别(男生 'M', 女生'WM' ),年龄,地址,生日

#!/bin/bash
er="root"  #用变量来存储用户
DB="class"   #数据库为class
TB="student2" #需要建立的表是student
SQE="student2_sequence"

echo "start to create table name is $TB"
sqlplus user/'passwd'@db<<EOF
drop table $TB;
create table $TB(
sid     number(10) primary key not null,
sname   varchar2(20) not null,
sage    number not null, 
ssex    char(2) not null, 
saddress varchar2(20) not null, 
sbirth  date
);

drop sequence $SQE;
create sequence $SQE    
       increment by 1  
       start with 1000     
       nomaxvalue        
       nocycle           
       nocache;         
CREATE TRIGGER student2_trigger  
   BEFORE INSERT ON student2  
   FOR EACH ROW  
   WHEN (new.sid is null)  

begin  
   select $SQE.nextval into :new.sid from sys.dual;  
end;

EOF
echo "create table end"

执行脚本

 

这里说明几个地方:由于子命令中注释语句无法通过,因此没有添加注释。

1.EOF<< 

在shell脚本中,通常将EOF与 << 结合使用,表示后续的输入作为子命令或子Shell的输入,直到遇到EOF为止,再返回到主Shell。

EOF只是一个分界符,当然也可以用abcde替换。
当shell遇到<<时,它知道下一个词是一个分界符。在该分界符以后的内容都被当作输入,直到shell又看到该分界符(位于单独的一行)。
此分界符可以是所定义的任何字符串,其实,不一定要用EOF,只要是“内容段”中没有出现的字符串,都可以用来替代EOF,完全可以换成abcde之类的字符串,只是一个起始和结束的标志罢了。

command<<EOF
(内容)
EOF

2.以上shell脚本子命令中包含下面的语句,这部分语句的作用是创建一个序列和触发器。

drop sequence $SQE; -- 删除序列

-- 创建序列
create sequence $SQE    
       increment by 1  
       start with 1000     
       nomaxvalue        
       nocycle           
       nocache;
--创建触发器         
CREATE TRIGGER student2_trigger  
   BEFORE INSERT ON student2  
   FOR EACH ROW  
   WHEN (new.sid is null)  

begin  
   select $SQE.nextval into :new.sid from sys.dual;  -- 当 sid为null的时候出发序列
end;

3.Oracle创建表的语句:sqlplus UCR_PARAM/'YNNZABC1!'@bosscend <<EOF 属于shell命令范围,表示用sqlplus连接数据库


drop table $TB;
create table $TB(
sid     number(10) primary key not null,
sname   varchar2(20) not null,
sage    number not null, 
ssex    char(2) not null, 
saddress varchar2(20) not null, 
sbirth  date
);

2、插入数据

#!/bin/bash
#DB="class"   #数据库为class
TB="student2" #需要建立的表是student
SQE="student2_sequence"
echo "start to insert into  table name is $TB"
sqlplus UCR_PARAM/'YNNZABC1!'@bosscend <<EOF

insert into $TB(sid,sname,sage,ssex,saddress,sbirth) values(1,'lily', 24, 'M','Shanxi', to_date('1994-01-14','yyyy-mm-dd'));
insert into $TB(sid,sname,sage,ssex,saddress,sbirth) values(2,'kity', 17, 'MW','Tianjin', to_date('2001-01-14','yyyy-mm-dd'));
insert into $TB(sid,sname,sage,ssex,saddress,sbirth) values(3,'bobo', 27, 'WM','Zhejiang', to_date('1993-01-14','yyyy-mm-dd'));
insert into $TB(sid,sname,sage,ssex,saddress,sbirth) values(4,'kavi', 29, 'M','Jiangsu', to_date('1989-02-14','yyyy-mm-dd'));
quit;

EOF
echo "end to insert into  table name is $TB"

执行脚本

 

依然是shell 脚本连接 Oracle数据库并通过子命令向数据库中插入数据

insert into $TB(sid,sname,sage,ssex,saddress,sbirth) values(1,'lily', 24, 'M','Shanxi', to_date('1994-01-14','yyyy-mm-dd'));

这里有个问题,不知道为什么,我创建了序列,但是当我插入不带sid字段的数据时候,脚本提示不能插入null字段的sid。

sqlplus连接数据库查询结果

注意:

sqlplus连接数据库时,感叹号要加反斜杠去特殊字符例如

数据库用户密码:ucr_coll/Ucrcoll!12@billog    (!号要添加反斜杠)

 sqlplus ucr_coll/Ucrcoll\!12@billog

或者密码字段用单引号 ‘ ’

例如

sqlplus ucr_coll/'Ucrcoll\!12'@billog

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值