6、plsql编程

一、PLSQL编程思维导图

二、PLSQL编程思维导图对应笔记

  1 PL/SQL编程    @Holly老师
  2 
  3 
  4 5.1 为什么学习PL/SQL编程?
  5 5.1.1 当我们要批量插入100万数据,怎么办?
  6 1、难道要写一百条insert into吗?不是,由于插入数据的操作是重复的,所以我们可以利用循环去实现,那怎么去实现呢?就用plsql编程去实现!
  7 
  8 5.2 什么是PL/SQL编程
  9 5.2.1 概念
 10 pl/sql是块结构语言,它将一组语句放在一个块中。
 11 PL/SQL程序结构是一种描述性很强、界限分明的块结构、嵌套块结构,被分成单独的过程、函数、触发器,且可以把它们组合为程序包,提高程序的模块化能力。
 12 
 13 5.2.2 组成
 14 1、声明部分
 15 declare
 16 2、执行部分
 17 begin
 18 3、异常处理部分
 19 exception
 20 
 21 5.2.3 PL/SQL块的结构
 22 DECLARE 
 23 --声明部分: 在此声明PL/SQL用到的变量,类型及游标,以及局部的存储过程和函数
 24 BEGIN
 25 -- 执行部分: 过程及SQL 语句 , 即程序的主要部分
 26 EXCEPTION
 27 -- 执行异常部分: 错误处理
 28 END;
 29 其中:执行部分不能省略
 30 
 31 5.2.4 PL/SQL块可以分类
 32 1. 无名块或匿名块(anonymous):动态构造,只能执行一次,可调用其它程序,但不能被其它程序调用。
 33 2. 命名块(named):是带有名称的匿名块,这个名称就是标签。
 34 3. 子程序(subprogram):存储在数据库中的存储过程、函数等。当在数据库上建立好后可以在其它程序中调用它们。
 35 4. 触发器 (Trigger):当数据库发生操作时,会触发一些事件,从而自动执行相应的程序。
 36 5. 程序包(package):存储在数据库 中的一组子程序、变量定义。在包中的子程序可以被其它程序包或子程序调用。但如果声明的是局部子程序,则只能在定义该局部子程序的块中调用该局部子程序。
 37 
 38 5.2.5 PL/SQL结构
 39 1、 PL/SQL块中可以包含子块;
 40 
 41 2、子块可以位于 PL/SQL中的任何部分;
 42 
 43 3、子块也即PL/SQL中的一条命令;
 44 
 45 5.2.6 运算符
 46 关系运算符 
 47 
 48 一般运算符 
 49 
 50 逻辑运算符 
 51 
 52 5.2.7 数据类型
 53 5.2.7.1 LOB数据类型
 54 1、BFILE (Movie)
 55 存放大的二进制数据对象,这些数据文件不放在数据库里,而是放在操作系统的某个目录里,数据库的表里只存放文件的目录。
 56 2、 BLOB(Photo)
 57 存储大的二进制数据类型。变量存储大的二进制对象的位置。大二进制对象的大小<=4GB。
 58 3、 CLOB(Book)
 59 存储大的字符数据类型。每个变量存储大字符对象的位置,该位置指到大字符数据块。大字符对象的大小<=4GB。
 60 4、 NCLOB
 61 存储大的NCHAR字符数据类型。每个变量存储大字符对象的位置,该位置指到大字符数据块。大字符对象的大小<=4GB。 
 62 
 63 5.2.7.2 属性类型
 64 1、使用%TYPE
 651)概念:
 66 定义一个变量,其数据类型与已经定义的某个数据变量(尤其是表的某一列)的数据类型相一致,这时可以使用%TYPE
 672)优点:
 68 使用%TYPE特性的优点在于:
 69 
 70 1. 所引用的数据库列的数据类型可以不必知道;
 71 
 72 2. 所引用的数据库列的数据类型可以实时改变,容易保持一致,也不用修改PL/SQL程序。 
 733)示例1:
 74 例7: 
 75 set serverout on
 76 DECLARE
 77 -- 用%TYPE 类型定义与表相配的字段
 78 TYPE T_Record IS RECORD(
 79 T_no emp.empno%TYPE,
 80 T_name emp.ename%TYPE,
 81 T_sal emp.sal%TYPE );
 82 -- 声明接收数据的变量
 83 v_emp T_Record;
 84 BEGIN
 85 SELECT empno, ename, sal INTO v_emp FROM emp WHERE empno=7788;
 86 DBMS_OUTPUT.PUT_LINE
 87 (TO_CHAR(v_emp.t_no)||' '||v_emp.t_name||' ' || TO_CHAR(v_emp.t_sal));
 88 END;
 89 
 90 /
 91 示例2:
 92 例8:
 93 set serverout on
 94 DECLARE
 95 v_empno emp.empno%TYPE :=&no;
 96 Type t_record is record (
 97 v_name emp.ename%TYPE,
 98 v_sal emp.sal%TYPE,
 99 v_date emp.hiredate%TYPE);
100 Rec t_record;
101 BEGIN
102 SELECT ename, sal, hiredate INTO Rec FROM emp WHERE empno=v_empno;
103 DBMS_OUTPUT.PUT_LINE(Rec.v_name||'---'||Rec.v_sal||'--'||Rec.v_date);
104 END;
105 /
106 2、使用%ROWTYPE
1071)概念
108 PL/SQL 提供%ROWTYPE操作符, 返回一个记录类型, 其数据类型和数据库表的数据结构相一致。
1092)优点
110 使用%ROWTYPE特性的优点在于:
111 
112 1. 所引用的数据库中列的个数和数据类型可以不必知道;
113 
114 2. 所引用的数据库中列的个数和数据类型可以实时改变,容易保持一致,也不用修改PL/SQL程序。 
1153)示例
116 例9: 
117 set serverout on
118 DECLARE
119 v_empno emp.empno%TYPE :=&no;
120 rec emp%ROWTYPE;
121 BEGIN
122 SELECT * INTO rec FROM emp WHERE empno=v_empno;
123 DBMS_OUTPUT.PUT_LINE('姓名:'||rec.ename||'工资:'||rec.sal||'工作时间:'||rec.hiredate); 
124 END;
125 /
126 
127 5.2.7 变量
128 5.2.6.1 变量的定义 
129 1、 定义变量
130 语法:变量名 数据类型[(大小)] [:=变量的初始值] ;
131 2、定义常量
132 语法:常量名 constant 数据类 := 常量值 ;
133 
134 5.2.6.2 命名要求
135 PL/SQL程序设计中的标识符定义与SQL 的标识符定义的要求相同。要求和限制有:
136 
137 1. 标识符名不能超过30字符;
138 
139 2. 第一个字符必须为字母;
140 
141 3. 不分大小写;
142 
143 4. 不能用"-"(减号);
144 
145 5. 不能是SQL保留字。
146 
147 提示: 一般不要把变量名声明与表中字段名完全一样,如果这样可能得到不正确的结果.
148 
149 5.2.6.3 命名规则
150 变量命名规则
151 
152 5.2.7.1 变量类型
153 变量类型
154 
155 5.2.6.3 案例1:
156 例如:下面的例子将会删除所有的纪录,而不是’EricHu’的记录;
157 
158 DECLARE
159 ename varchar2(20) :='EricHu';
160 BEGIN
161 DELETE FROM scott.emp WHERE ename=ename;
162 END;
163 
164 5.2.8 变量增删改示例
165 1. 示例:插入
166 例1. 插入一条记录并显示;
167 set serverout on
168 DECLARE
169 Row_id ROWID;
170 info VARCHAR2(40);
171 BEGIN
172 INSERT INTO scott.dept VALUES (90, '财务室', '海口')
173 RETURNING rowid, dname||':'||to_char(deptno)||':'||loc
174 INTO row_id, info;
175 DBMS_OUTPUT.PUT_LINE('ROWID:'||row_id);
176 DBMS_OUTPUT.PUT_LINE(info);
177 END;
178 /
179 其中:
180 
181 RETURNING子句用于检索INSERT语句中所影响的数据行数,当INSERT语句使用VALUES 子句插入数据 时,RETURNING 字句还可将列表达式、ROWID和REF值返回到输出变量中。在使用RETURNING 子句是应注意以下 几点限制:
182 
183 1.不能与DML语句和远程对象一起使用;
184 
185 2.不能检索LONG 类型信息;
186 
187 3.当通过视图向基表中插入数据时,只能与单基表视图一起使用。
188 2.示例:修改
189 例2. 修改一条记录并显示
190 set serverout on
191 DECLARE
192 Row_id ROWID;
193 info VARCHAR2(40);
194 BEGIN
195 UPDATE dept SET deptno=100 WHERE DNAME='财务室'
196 RETURNING rowid, dname||':'||to_char(deptno)||':'||loc
197 INTO row_id, info;
198 DBMS_OUTPUT.PUT_LINE('ROWID:'||row_id);
199 DBMS_OUTPUT.PUT_LINE(info);
200 END;
201 /
202 其中:
203 
204 RETURNING子句用于检索被修改行的信息。当UPDATE语句修改单行数据时,RETURNING 子句可以检索被修改行的 ROWID和REF值,以及行中被修改列的列表达式,并可将他们存储到PL/SQL变量或复合变量中;当UPDATE语句修改多行数据 时,RETURNING 子句可以将被修改行的ROWID和REF值,以及列表达式值返回到复合变量数组中。在UPDATE中使用 RETURNING 子句的限制与INSERT语句中对RETURNING子句的限制相同。
205 3.删除
206 例3. 删除一条记录并显示
207 set serverout on
208 DECLARE
209 Row_id ROWID;
210 info VARCHAR2(40);
211 BEGIN
212 DELETE dept WHERE DNAME='办公室'
213 RETURNING rowid, dname||':'||to_char(deptno)||':'||loc
214 INTO row_id, info;
215 DBMS_OUTPUT.PUT_LINE('ROWID:'||row_id);
216 DBMS_OUTPUT.PUT_LINE(info);
217 END; 
218 /
219 其中:
220 
221 RETURNING子句用于检索被删除行的信息:当DELETE语句删除单行数据时,RETURNING 子句可以检索被删除行的 ROWID和REF值,以及被删除列的列表达式,并可将他们存储到PL/SQL变量或复合变量中;当DELETE语句删除多行数据 时,RETURNING 子句可以将被删除行的ROWID和REF值,以及列表达式值返回到复合变量数组中。在DELETE中使用 RETURNING 子句的限制与INSERT语句中对RETURNING子句的限制相同。 
222 
223 5.3 如何使PL/SQL编程
224 大家有没有发现我们每天sql语句后面都有什么呀?都有分号!如果在java中
225 
226 5.4 在什么时候使用PL/SQL编程
PLSQL编程思维导图对应笔记

三、具体PLSQL编程案例(1)

  1 --0.创建表
  2 create table(tid number,tname varchar2(20));
  3 
  4 --1.定义变量,完成赋值并输出
  5  set serverout on
  6  declare
  7      v_tid number;
  8      v_tname varchar2(20);
  9   begin
 10      tid:=1;
 11       tname:='holly';
 12       dbms_output.put_line('老师编号:'||tid||';老师姓名:'||tname);
 13   end;
 14   /
 15 
 16 --2.向数据库表中插入数据
 17   set serverout on
 18   begin
 19      insert into teacher values(1,'holly');
 20      commit;
 21   end;
 22   /
 23 
 24 --3.从数据库表中查询两个值并赋值给变量输出
 25 --(1)%type定义变量表示该变量的数据类型和表的数据类型一致
 26 --(2)select 字段1,字段2 into 变量1,变量2 from 表名
 27 --意思是将查询出来的字段1和字段2的值赋值给变量1和变量2
 28 
 29  set serverout on
 30  declare
 31     v_tid teacher.tid%type;
 32     v_tname teacher.tname%type;
 33  begin
 34     select tid,tname into v_tid,v_tname from teacher;
 35     dbms_output.put_line('编号:'||v_tid||' 姓名:'||v_tname);
 36  end;
 37  /
 38     
 39 --4.if判断结构 :如果name等于'holly'输出name的值
 40  set serverout on
 41  declare
 42    v_name varchar2(20);
 43  begin 
 44    v_name:='holly';
 45    if v_name='holly' then
 46      dbms_output.put_line('姓名:'||v_name);
 47    end if;
 48  end;
 49  /
 50 
 51 输出内容:
 52   姓名:holly
 53 
 54 --5.if-else判断结果
 55 --注意:=&str 提示动态输入时,根据数据类型输入值,
 56 --如果是varchar2类型需要输入时加单引号
 57  declare
 58    v_name varchar2(20):=&v_name;
 59  begin
 60    if v_name='holly' then
 61      dbms_output.put_line('姓名:'||v_name);
 62    else
 63      dbms_output.put_line('who?');
 64    end if;
 65  end;
 66  /
 67 运行结果如下:
 68 
 69 输入 v_name 的值:  'json'
 70 原值    2:     v_name varchar2(20):=&v_name;
 71 新值    2:     v_name varchar2(20):='json';
 72 who?
 73 
 74 PL/SQL 过程已成功完成。
 75 
 76 --6.多重if-else
 77 --if  then
 78 --elsif  then
 79 --elsif  then
 80 --else
 81 --end if;
 82 
 83  declare
 84    v_name varchar2(20):=&v_name;
 85  begin
 86    if v_name='holly' then
 87      dbms_output.put_line('姓名:'||'holly');
 88    elsif v_name='json' then
 89      dbms_output.put_line('姓名:'||'json');
 90    elsif v_name='who' then
 91      dbms_output.put_line('姓名:'||'who');
 92    else
 93      dbms_output.put_line('error');
 94    end if;
 95  end;
 96  /
 97 
 98 运行结果如下:
 99 输入 v_name 的值:  'json'
100 原值    2:    v_name varchar2(20):=&v_name;
101 新值    2:    v_name varchar2(20):='json';
102 姓名:json
103 
104 PL/SQL 过程已成功完成。
105 
106 
107 --7.嵌套if-else
108 
109 --8.switch选择结构
110 declare
111    v_name varchar2(20):=&v_name;
112  begin
113    case v_name
114      when 'a' then
115         dbms_output.put_line('a');
116      when 'b' then
117         dbms_output.put_line('b');
118    end case;
119  end;
120  /
121 
122 输入 v_name 的值:  'a'
123 原值    2:    v_name varchar2(20):=&v_name;
124 新值    2:    v_name varchar2(20):='a';
125 a
126 
127 PL/SQL 过程已成功完成。
具体PLSQL编程案例(1)

四、具体PLSQL编程案例(2)

  1 --.批量添加数据
  2 --生成随即字符dbms_random.string(选项,长度);
  3 --选项:u表示大写字母,L表示小写字母,x表示数字和字母混合,p表示任意字符
  4 --随机生成数字:语法1:dbms_random.value; 生成0-1之间随机数
  5 --dbms_random.value*num;   生成0到num之间的随机数
  6 --dbms_random.value(min,max);生成min到max之间的随机数
  7 --随机数取整:round(dbms_random.value(min,max));  生成min到max之间的随机整数
  8 --随机数取整:trunc(dbms_random.value(min,max));  生成min到max之间的随机整数
  9 
 10 --1.创建用户
 11 create user holly identified by sys;
 12 
 13 --2.赋权
 14 grant dba to holly;
 15 
 16 --3.切换用户登录
 17 conn holly/sys
 18 
 19 --4.创建表
 20 create table(tid number,tname varchar2(20));
 21 
 22 --5.编写第一个pl/sql块
 23 --注意dos中必须有
 24 --(1)set serverout on 开始
 25 --(2)/结束
 26 
 27  set serverout on
 28  declare
 29    v_name varchar2(20);
 30    begin
 31      v_name:='holly';
 32      dbms_output.put_line('姓名'||v_name);
 33  end;
 34  /
 35 
 36 --6.向teacher表插入数据
 37 set serverout on
 38 begin
 39    insert into teacher values(1,'holly');
 40    commit;
 41 end;
 42 /
 43 
 44 --7.将表数据查询出来赋值给变量并打印
 45 set serverout on
 46 declare
 47    v_tid teacher.tid%type;
 48    v_tname teacher.tname%type;
 49 begin
 50    select tid,tname into v_tid,v_tname
 51    from teacher;
 52   dbms_output.put_line('tid:'||v_tid||'tname:'||v_tname);
 53 end;
 54 /
 55 
 56 tid:1 tname: holly
 57 
 58 --8.动态输入并输出
 59 set serverout on
 60 declare
 61   v_num number:=&num;
 62   v_nam varchar2(20):=&str;
 63 begin
 64   dbms_output.put_line(v_num);
 65   dbms_output.put_line(v_nam);
 66 end;
 67 /
 68 
 69 输入 num 的值:  1
 70 原值    2:   v_num number:=&num;
 71 新值    2:   v_num number:=1;
 72 输入 str 的值:  'holly'
 73 原值    3:   v_nam varchar2(20):=&str;
 74 新值    3:   v_nam varchar2(20):='holly';
 75 1
 76 holly
 77 
 78 --9.if 结构
 79 set serverout on
 80 declare
 81   v_str varchar2(20);
 82 begin
 83   v_str:='holly';
 84   if v_str='holly' then
 85     dbms_output.put_line(v_str);
 86   end if;
 87 end;
 88 /
 89 
 90 --10.if-else
 91 set serverout on
 92 declare
 93   v_str number:=&num;
 94 begin
 95   if v_str=1 then
 96     dbms_output.put_line('zhudaiyu');
 97   else
 98     dbms_output.put_line('zhuweilun');
 99   end if; 
100 end;
101 /
102 输入 num 的值:  1
103 原值    2:   v_str number:=&num;
104 新值    2:   v_str number:=1;
105 zhudaiyu
106 
107 --11.多重if-else
108 set serverout on
109 declare
110    v_num number:=&num;
111 begin
112   if v_num=1 then
113     dbms_output.put_line(v_num);
114   elsif v_num=2 then
115     dbms_output.put_line(v_num);
116   elsif v_num=3 then
117     dbms_output.put_line(v_num);
118   else
119     dbms_output.put_line('others?');
120   end if;
121 end;
122 /
123 
124 --12.多重if-else嵌套(自由发挥)
125 
126 
127 --13.switch ,变量是数值
128 set serverout on
129 declare
130    v_num number:=&num;
131 begin
132    case  v_num
133      when  1  then
134        dbms_output.put_line('您输入的是:'||v_num);
135      when  2  then
136        dbms_output.put_line('您输入的是:'||v_num);
137      when  3  then
138        dbms_output.put_line('您输入的是:'||v_num);
139     else
140        dbms_output.put_line('nani');
141    end case;
142 end;
143 /
144 
145 --14.switch ,变量是varchar2
146 set serverout on
147 declare
148    v_str varchar2(20):=&str;
149 begin
150    case  v_str
151      when  'holly1'  then
152        dbms_output.put_line('您输入的是:'||v_str);
153      when  'holly2'  then
154        dbms_output.put_line('您输入的是:'||v_str);
155      when  'holly3'  then
156        dbms_output.put_line('您输入的是:'||v_str);
157      else
158        dbms_output.put_line('nani');
159    end case;
160 end;
161 /
162 
163 
164 --14.for,循环输出十次
165 set serverout on
166 begin
167   for i in 1..10 loop
168     dbms_output.put_line(''||i||'次输出');
169   end loop;
170 end;
171 /
172 
173 --15.do-while循环
174 set serverout on
175 declare
176   v_num number:=&num;
177 begin
178   loop
179     v_num:=v_num+1;
180     dbms_output.put_line(''||v_num||'次输出');
181     exit when v_num=10;
182   end loop;
183 end;
184 /
185 
186 --16.while循环
187 set serverout on
188 declare
189   v_num number:=&num;
190 begin
191   while v_num<10 loop
192     dbms_output.put_line(''||v_num||'次输出');
193     v_num:=v_num+1;
194   end loop; 
195 end;
196 /
197 
198 --17.添加列
199 alter table teacher add(phone varchar2(20));
200 
201 --18.循环插入30条数据,保证tid唯一,并且每次递增1,
202 -- 手机号码130开头的11位到189开头的11位号码
203 --姓名:数字和字母组成
204 set serverout on
205 declare
206   --定义变量并和数据库数据类型保持一致
207   v_tname teacher.tname%type;
208   v_phone teacher.phone%type;
209 begin
210   --for循环 从2到30
211   for i in 2..30 loop
212     --随机生成字符串
213     v_tname:=dbms_random.string('x',5);
214     --随机生成某范围内的整数
215     v_phone:=trunc(dbms_random.value(13000000000,18999999999));
216     insert into teacher values(i,v_tname,v_phone);
217     commit;
218   end loop;
219   dbms_output.put_line('insert ok');
220 end;
221 /
222  
具体PLSQL编程案例(2)

五、批量插入数据案例

  1 --1.数据库表
  2 --1.1 用户表:用户编号,姓名,密码,电话,是否是管理员
  3  create table userinfo(id number(4),name varchar2(50),password varchar2(20),telephone 
  4 
  5 varchar2(15),isadmin varchar2(5));
  6 
  7 --1.2 房屋类型表:房屋类型编号,房屋类型名称
  8  create table house_type(id number,name varchar2(50));
  9 
 10 --1.3 区域表:区域编号,区域名称
 11  create table district (id number,name varchar2(50));
 12 
 13 --1.4街道表:街道编号,街道名称,区域编号
 14  create table street(id number,name varchar2(50),district_id number);
 15 
 16 --1.5房屋表:房屋编号,房屋标题,房屋描述信息,价格,发布时间,面积,联系人,用户编号,房屋类型
 17 
 18 编号,街道编号,房屋图片地址,联系人图片地址
 19  create table house(id number,title varchar2(50),description varchar2(2000),
 20   price number(6),pubdate date,floorage number(4),contact varchar2(100),user_id number,
 21   housetype_id number,street_id number,houseurl varchar2(50),personurl varchar2(50));
 22 
 23 --2.添加主键
 24 --2.1 用户表主键
 25 alter table userinfo add constraint pk_userinfo_id primary key(id);
 26 
 27 --2.2 房屋类型表主键
 28  alter table house_type add constraint pk_housetype_id primary key(id);
 29 
 30 --2.3 区域表主键
 31  alter table district add constraint pk_district_id primary key(id);
 32 
 33 --2.4 街道表主键
 34  alter table street add constraint pk_street_id  primary key(id);
 35 
 36 --2.5 房屋信息表主键
 37  alter table house add constraint pk_house_id primary key(id);
 38  
 39 
 40 --3.添加外键
 41 --3.1房屋表和用户表关联
 42  alter table house add constraint fk_house_userid foreign key(user_id) references userinfo
 43 
 44 (id);
 45 
 46 --3.2房屋表和房屋类型表关联
 47  alter table house add constraint fk_house_housetypeid foreign key(housetype_id) references 
 48 
 49 house_type(id);
 50 
 51 --3.3房屋表和街道表关联
 52  alter table house add constraint fk_house_streetid foreign key(street_id) references 
 53 
 54 street(id);
 55 
 56 --3.4 区县和街道的外键关联
 57 alter table street add constraint fk_street_districtid foreign key(district_id) 
 58 references  district(id);
 59 
 60 
 61 --4.创建序列
 62 --4.1 街道序列
 63 create sequence seq_street;
 64 
 65 --4.2 用户表序列
 66 create sequence seq_userinfo;
 67 
 68 --4.3 房屋类型序列
 69 create sequence seq_housetype;
 70 
 71 --4.4 区域序列
 72 create sequence seq_district;
 73 
 74 --4.5 房屋序列
 75 create sequence seq_house;
 76 
 77 
 78 --5.插入数据
 79 --生成随即字符dbms_random.string(选项,长度);
 80 --选项:u表示大写字母,L表示小写字母,x表示数字和字母混合,p表示任意字符
 81 --随机生成数字:语法1:dbms_random.value; 生成0-1之间随机数
 82 --dbms_random.value*num;   生成0到num之间的随机数
 83 --dmbs_random.value(min,max);生成min到max之间的随机数
 84 --随机数取整:round(dmbs_random.value(min,max));  生成min到max之间的随机整数
 85 --随机数取整:trunc(dmbs_random.value(min,max));  生成min到max之间的随机整数
 86 
 87 --5.1 为用户表插入10条数据
 88 set serverout on
 89 begin
 90        for i in 1 .. 10 loop
 91          insert into userinfo values(seq_userinfo.nextval,dbms_random.string
 92 
 93 ('u',5),dbms_random.string('x',6),
 94           round(dbms_random.value(13000000000,18900000000)),'');
 95        end loop;
 96        commit;
 97 end;
 98 /
 99 
100 --查询插入的数据
101 select count(1) from userinfo;
102 
103 --5.2  为房屋类型表添加数据
104 set serverout on
105 begin
106         for i in 1..7 loop
107            for j in 1..7 loop
108              insert into house_type values(seq_housetype.nextval,i||''||j||'');
109            end loop;
110         end loop;
111 end;
112 /
113   
114 --5.3 为区域表插入数据
115 insert into district values(seq_district.nextval,'江宁区');
116 insert into district values(seq_district.nextval,'鼓楼区');
117 insert into district values(seq_district.nextval,'六合区');
118 insert into district values(seq_district.nextval,'大厂区');
119 insert into district values(seq_district.nextval,'玄武区');
120 insert into district values(seq_district.nextval,'栖霞区');
121 insert into district values(seq_district.nextval,'白下区');
122 insert into district values(seq_district.nextval,'建邺区');
123 insert into district values(seq_district.nextval,'浦口区');
124 insert into district values(seq_district.nextval,'下关区');
125 commit;
126 
127 或者
128 
129 set serverout on
130 begin
131   for i in 1..10 loop
132    insert into district values(seq_district.nextval,dbms_random.string('u',5)||'');
133   end loop;
134   commit;
135 end;
136 /
137 --查询插入的数据
138 select * from tbl_district;
139 
140 
141 --5.4 为街道插入数据
142 set serverout on
143 declare
144    v_id  district.id%type;
145    v_name district.name%type;
146    v_discount number;
147 begin
148     --通过select into将表字段查询出来赋值给变量
149     select count(1) into v_discount from district;
150     for i in 1..v_discount loop
151         for j in 1..10 loop
152            select id,name into v_id,v_name from district where id=i;
153            insert into street values(seq_street.nextval,substr(v_name,1,2)||
154 
155 dbms_random.string('x',10)||'街道',v_id);
156         end loop;
157     end loop;
158 end;
159 /
160 
161 --查询插入的数据   
162 select count(1) from street ;
163 
164 
165 --5.5 为房屋信息插入数据
166 set serverout on
167 declare
168    --定义用户表id的最小值和最大值
169    v_min_userinfoid  userinfo.id%type;
170    v_max_userinfoid  userinfo.id%type;
171    --定义房屋户型id的最小值和最大值
172    v_min_housetypeid house_type.id%type;
173    v_max_housetypeid house_type.id%type;
174    --定义街道id的最小值和最大值
175    v_min_streetid street.id%type;
176    v_max_streetid street.id%type;
177 begin
178    --将所有的表的id的最大值和最小值求出来分别赋值给变量
179     select min(id),max(id) into v_min_userinfoid,v_max_userinfoid from  userinfo;
180     select min(id),max(id) into v_min_housetypeid,v_max_housetypeid from house_type;
181     select min(id),max(id) into v_min_streetid,v_max_streetid  from street;
182     
183     --打印
184    -- dbms_output.put_line(v_min_userinfoid);
185     --dbms_output.put_line(v_max_userinfoid);
186     --dbms_output.put_line(v_min_housetypeid);
187     --dbms_output.put_line(v_max_housetypeid);
188    -- dbms_output.put_line(v_min_streetid);
189    -- dbms_output.put_line(v_max_streetid);
190    
191    --循环插入50万条数据 
192    for i in 1..500000 loop
193            insert into house 
194            values(seq_house.nextval,dbms_random.string('u',5),dbms_random.string('x',15),
195                  trunc(dbms_random.value(1000,900000)),to_date('2015-12-06','yyyy-mm-dd'),
196                  trunc(dbms_random.value(30,1000)),dbms_random.string('u',6),
197                  trunc(dbms_random.value(v_min_userinfoid,v_max_userinfoid)),
198                  trunc(dbms_random.value(v_min_housetypeid,v_max_housetypeid)),
199                  trunc(dbms_random.value(v_min_streetid,v_max_streetid)),
200                  i||'.jpg',i||'.jpg');
201     end loop;
202     commit;
203 end;
204 /
205 
206   
207    
批量插入数据案例

 

posted @ 2016-07-18 22:58  红酒人生  阅读(783)  评论(0编辑  收藏  举报