1 1.PL/sql输出语句 2 set serverout on 3 declare 4 v_sname varchar2(20); 5 begin 6 dbms_output.put_line(‘181lj‘); 7 v_sname:=‘王工具人‘; 8 dbms_output.put_line(‘183‘||v_sname||‘跟鬼一样‘); 9 end; 10 / 11 ~~输出结果 12 181lj 13 183王工具人跟鬼一样 14 15 2.边赋值边输出 16 set serverout on 17 declare 18 v_sname varchar2(20):=‘王工具人‘; 19 begin 20 dbms_output.put_line(‘183‘||v_sname||‘跟鬼一样‘); 21 end; 22 / 23 ~~输出结果 24 183王工具人跟鬼一样 25 26 3.输入输出 27 set serverout on 28 declare 29 name varchar2(20):=&p_sname; 30 begin 31 dbms_output.put_line(name||‘跟鬼一样‘); 32 end; 33 / 34 ~~输出结果 35 输入 p_sname 的值: 1 36 原值 2: name varchar2(20):=&p_sname; 37 新值 2: name varchar2(20):=1; 38 1跟鬼一样 39 40 4.创建并获取另一个表的构造 41 create table newdept 42 as 43 select * from dept where 1=2; 44 45 5.为新表插入数据 46 set serverout on 47 declare 48 v_deptno number(2):=&p_deptno; 49 v_dname varchar2(14):=&p_dname; 50 v_loc varchar2(13):=&p_loc; 51 begin 52 insert into newdept(deptno,dname,loc) values(v_deptno,v_dname,v_loc); 53 commit; 54 end; 55 / 56 ~~输出结果 57 输入 p_deptno 的值: 1 58 原值 2: v_deptno number(2):=&p_deptno; 59 新值 2: v_deptno number(2):=1; 60 输入 p_dname 的值: ‘市场部‘ 61 原值 3: v_dname varchar2(14):=&p_dname; 62 新值 3: v_dname varchar2(14):=‘市场部‘; 63 输入 p_loc 的值: ‘阜阳市‘ 64 原值 4: v_loc varchar2(13):=&p_loc; 65 新值 4: v_loc varchar2(13):=‘阜阳市‘; 66 67 6.插入值,但定义变量的数据类型。长度动态的和表中的数据类型,长度保持一致 68 set serverout on 69 declare 70 v_deptno newdept.deptno%type:=&p_deptno; 71 v_dname newdept.dname%type:=&p_dname; 72 v_loc newdept.loc%type:=&p_loc; 73 begin 74 insert into newdept(deptno,dname,loc) values(v_deptno,v_dname,v_loc); 75 commit; 76 end; 77 / 78 ~~输出结果 79 输入 p_deptno 的值: 2 80 原值 2: v_deptno newdept.deptno%type:=&p_deptno; 81 新值 2: v_deptno newdept.deptno%type:=2; 82 输入 p_dname 的值: ‘数学部‘ 83 原值 3: v_dname newdept.dname%type:=&p_dname; 84 新值 3: v_dname newdept.dname%type:=‘数学部‘; 85 输入 p_loc 的值: ‘青网科技园‘ 86 原值 4: v_loc newdept.loc%type:=&p_loc; 87 新值 4: v_loc newdept.loc%type:=‘青网科技园‘; 88 89 7.根据id查询一行数据 90 set serverout on 91 declare 92 v_deptno newdept.deptno%type:=&p_deptno; 93 v_dname newdept.dname%type; 94 begin 95 select dname into v_dname from newdept where deptno=v_deptno; 96 dbms_output.put_line(v_deptno||‘----‘||v_dname); 97 end; 98 / 99 ~~输出结果 100 输入 p_deptno 的值: 1 101 原值 2: v_deptno newdept.deptno%type:=&p_deptno; 102 新值 2: v_deptno newdept.deptno%type:=1; 103 1----市场部 104 105 8.查询多个字段,同时进行多个变量的赋值 106 set serverout on 107 declare 108 v_deptno newdept.deptno%type:=&p_deptno; 109 v_dname newdept.dname%type; 110 v_loc newdept.loc%type; 111 begin 112 select dname,loc into v_dname,v_loc from newdept where deptno=v_deptno; 113 dbms_output.put_line(v_deptno||‘----‘||v_dname||‘----‘||v_loc); 114 end; 115 / 116 ~~输出结果 117 输入 p_deptno 的值: 1 118 原值 2: v_deptno newdept.deptno%type:=&p_deptno; 119 新值 2: v_deptno newdept.deptno%type:=1; 120 1----市场部----阜阳市 121 122 9.创建赋值部分的表结构 123 create table newemp 124 as 125 select empno,ename,job,sal from emp where 1=2; 126 127 10.查询所有字段且赋值 128 set serverout on 129 declare 130 v_empno newemp.empno%type:=&p_empno; 131 v_ename newemp.ename%type; 132 v_job newemp.job%type; 133 v_sal newemp.sal%type; 134 begin 135 select 136 empno,ename,job,sal 137 into 138 v_empno,v_ename,v_job,v_sal 139 from 140 newemp 141 where 142 empno=v_empno; 143 dbms_output.put_line(v_empno||‘----‘||v_ename||‘----‘||v_job||‘----‘||v_sal); 144 end; 145 / 146 147 148 149 10.为newemp添加数据 150 set serverout on 151 declare 152 v_empno newemp.empno%type:=&p_empno; 153 v_ename newemp.ename%type:=&p_ename; 154 v_job newemp.job%type:=&p_job; 155 v_sal newemp.sal%type:=&p_sal; 156 begin 157 insert into newemp(empno,ename,job,sal) values(v_empno,v_ename,v_job,v_sal); 158 commit; 159 end; 160 / 161 162 11.%type的用法:定义变量时,让变量的数据类型,长度动态的和表中的数据类型,长度动态的保持一致 163 查询赋值:select 字段1,字段2,...into 变量1,变量2,...from表名 where条件 164 set serverout on 165 declare 166 v_empno newemp.empno%type:=&p_empno; 167 v_ename newemp.ename%type; 168 v_job newemp.job%type; 169 v_sal newemp.sal%type; 170 begin 171 --使用select...into进行查询赋值操作 172 select 173 empno,ename,job,sal 174 into 175 v_empno,v_ename,v_job,v_sal 176 from 177 newemp 178 where 179 empno=v_empno; 180 --打印输出 181 dbms_output.put_line(v_empno||‘---‘||v_ename||‘---‘||v_job||‘---‘||v_sal); 182 end; 183 / 184 185 12.通过简单的java的类和对象去了解oracle的行数据类型的变量 186 数据库 java 187 表名 类名 188 一行数据 一个对象 189 列名 属性名 190 191 emp表 192 列:empno,ename,job,sal 193 194 Emp类 195 属性:empno,ename,job,sal 196 197 类类型 对象类型(包括很多属性) 198 Emp emp(包括Emp中所有属性) 199 200 表类型 行类型 201 emp %rowtype(包括emp表中所有属性) 202 203 题目:查询某条完整的数据,赋值行变量(表对象==携带完整的某行数据) 204 set serverout on 205 declare 206 --定义存储条件的变量 207 v_empno newemp.empno%type:=&p_empno; 208 209 --定义表对象==行类型变量 210 rec_newemp newemp%rowtype; 211 begin 212 --条件查询某条数据赋值给定义好的行类型变量(表对象) 213 select 214 * 215 into 216 rec_newemp 217 from 218 newemp 219 where 220 empno=v_empno 221 --因为上面将所有列值赋值给了行对象,因此打印输出时,通过行对象,列名的的形式调用 222 dbms_output.put_line(rec_newemp.empno||‘---‘||rec_newemp.ename||‘---‘||rec_newemp.job||‘---‘||rec_newemp.sal); 223 end; 224 / 225 226 13.对newdept插入一行 227 228 set serverout on 229 declare 230 v_deptno newdept.deptno%type:=&p_deptno; 231 v_dname newdept.dname%type:=&p_dname; 232 v_loc newdept.loc%type:=&p_loc; 233 v_info varchar2(100); 234 begin 235 insert into newdept(deptno,dname,loc) values(v_deptno,v_dname,v_loc) 236 returning deptno||‘--‘||dname||‘---‘||loc 237 into v_info; 238 dbms_output.put_line(v_info); 239 end; 240 / 241 输入 p_deptno 的值: 1 242 原值 2: v_deptno newdept.deptno%type:=&p_deptno; 243 新值 2: v_deptno newdept.deptno%type:=1; 244 输入 p_dname 的值: 12 245 原值 3: v_dname newdept.dname%type:=&p_dname; 246 新值 3: v_dname newdept.dname%type:=12; 247 输入 p_loc 的值: 25 248 原值 4: v_loc newdept.loc%type:=&p_loc; 249 新值 4: v_loc newdept.loc%type:=25; 250 1--12---25 251 14.判断 252 题目:薪资小于1000涨薪50 253 set serverout on 254 declare 255 v_empno newemp.empno%type:=&p_empno; 256 v_sal newemp.empno%type; 257 v_info varchar2(100); 258 begin 259 select sal into v_sal from newemp where empno=v_empno; 260 dbms_output.put_line(v_empno||‘的原始薪资为:‘||v_sal); 261 if v_sal<1000 then 262 update newemp set sal=sal+50 where empno=v_empno 263 returning empno||‘涨薪50后的薪资为:‘||sal 264 into v_info; 265 dbms_output.put_line(v_info); 266 else 267 dbms_output.put_line(‘已经能解决温饱,不在加薪‘); 268 end if; 269 end; 270 / 271 延伸: 272 set serverout on 273 declare 274 v_empno newemp.empno%type:=&p_empno; 275 v_sal newemp.empno%type; 276 v_info varchar2(100); 277 begin 278 select sal into v_sal from newemp where empno=v_empno; 279 dbms_output.put_line(v_empno||‘的原始薪资为:‘||v_sal); 280 if v_sal<1000 then 281 update newemp set sal=sal+200 where empno=v_empno 282 returning empno||‘涨薪200后的薪资为:‘||sal 283 into v_info; 284 dbms_output.put_line(v_info); 285 286 else if 1000<v_sal<2000 then 287 update newemp set sal=sal+100 where empno=v_empno 288 returning empno||‘涨薪100后的薪资为:‘||sal 289 into v_info; 290 dbms_output.put_line(v_info); 291 292 else if 2000<v_sal<3000 then 293 update newemp set sal=sal+50 where empno=v_empno 294 returning empno||‘涨薪50后的薪资为:‘||sal 295 into v_info; 296 dbms_output.put_line(v_info); 297 else 298 dbms_output.put_line(‘生活已经小康,不在加薪‘); 299 end if; 300 end; 301 / 302 303 loop循环: 304 语法: 305 Loop 306 要执行的语句; 307 EXIT when<条件语句> 循环退出条件 308 --条件满足,退出循环语句 309 END LOOP; 310 311 循环打印1-10之间的值 312 set serverout on 313 declare 314 i number(10):=1; 315 begin 316 loop 317 dbms_output.put_line(i); 318 exit when i=10; 319 320 i:=i+1; 321 322 end loop; 323 end; 324 / 325 326 15.while循环 327 语法 328 定义循环的初始条件 329 WHILE<布尔表达式> LOOP 330 要执行的语句; 331 END LOOP; 332 案例:循环打印1-10之间的值 333 set serverout on 334 declare 335 --定义循环的初始值 336 i number:=1; 337 begin 338 --定义循环结构且定义循环条件 339 while i<=10 loop 340 --定义循环内容 341 dbms_output.put_line(i); 342 --定义迭代语句 343 i:=i+1; 344 end loop; 345 end; 346 / 347 语法3: 348 [<<循环标签>>] 349 for 循环计数器 in [reverse] 下限 ...上限 loop 350 要执行的语句 351 end loop[循环标签]; 352 案例: 353 set serverout on 354 begin 355 for i in 0..10 loop 356 dbms_output.put_line(i); 357 end loop; 358 end; 359 / 360 16.游标==java的集合 361 游标分为:显示游标,隐式游标 362 隐式游标调用:SQL% 363 drop table emp; 364 create table emp 365 as 366 select empno,ename,job,sal,deptno from newemp where 1=1; 367 set serverout on 368 declare 369 --定义和newemp表中deptno同类型同长度的变量,用来接受系统的值 370 v_deptno newemp.deptno%type:=&p_deptno; 371 begin 372 --删除某个部门下的员工 373 delete from newemp where deptno=v_deptno; 374 --增删改操作时,会存在隐式游标吗,rowcount表示受影响的行数 375 if SQL%ROWCOUNT>0 then 376 dbms_output.put_line(v_deptno||‘下的员工已经删除‘); 377 else 378 --如果某个部门下没有员工,则删除某个部门的信息 379 delete from newdept where deptno=v_deptno; 380 dbms_output.put_line(v_deptno||‘所对应的部门信息已经删除‘); 381 end if; 382 end; 383 / 384 385 386 16.删除数据,如果没有数据删除表 387 set serverout on 388 declare 389 v_deptno newemp.deptno%type:=&p_deptno; 390 begin 391 delete from newemp where deptno=v_deptno; 392 if SQL%rowcount>0 then 393 dbms_output.put_line(v_deptno||‘下的员工已经删除‘); 394 else 395 delete from newdept where deptno=v_deptno; 396 dbms_output.put_line(v_deptno||‘的部门信息已经删除‘); 397 end if; 398 end; 399 / 400 401 17.定义游标 并获取游标 402 set serverout on 403 declare 404 v_deptno newdept.deptno%type; 405 v_dname newdept.dname%type; 406 cursor cursor_newdept 407 is 408 select deptno,dname from newdept; 409 begin 410 open cursor_newdept; 411 fetch cursor_newdept into v_deptno,v_dname; 412 while cursor_newdept%found loop 413 dbms_output.put_line(v_deptno||‘----‘||v_dname); 414 fetch cursor_newdept into v_deptno,v_dname; 415 end loop; 416 close cursor_newdept; 417 end; 418 / 419 420 18.使用行记录变量去接受显示游标查询的结果 421 set serverout on 422 declare 423 record_newemp newemp%rowtype; 424 cursor cursor_newemp 425 is 426 select * from newemp;` 427 begin 428 open cursor_newemp; 429 fetch cursor_newemp into record_newemp; 430 while cursor_newemp%found loop 431 dbms_output.put_line(record_newemp.empno||‘----‘||record_newemp.ename); 432 fetch cursor_newemp into record_newemp; 433 end loop; 434 close cursor_newemp; 435 end; 436 / 437 19.有参数的游标 438 set serverout on 439 declare 440 record_newemp newemp%rowtype; 441 cursor cursor_newemp(p_deptno newdept.deptno%type default 10) 442 is 443 select * from newemp where deptno=p_deptno; 444 begin 445 open cursor_newemp(20); 446 fetch cursor_newemp into record_newemp; 447 while cursor_newemp%found loop 448 dbms_output.put_line(record_newemp.empno||‘----‘||record_newemp.ename||‘----‘||record_newemp.deptno); 449 fetch cursor_newemp into record_newemp; 450 end loop; 451 close cursor_newemp; 452 end; 453 / 454 455 20.低于2000的人加50 456 set serverout on 457 declare 458 record_newemp newemp%rowtype; 459 cursor cursor_newemp 460 is 461 select * from newemp; 462 begin 463 open cursor_newemp; 464 loop 465 fetch cursor_newemp into record_newemp; 466 exit when cursor_newemp%notfound; 467 if record_newemp.sal<2000 then 468 update newemp set sal=sal+50 where empno=record_newemp.empno; 469 dbms_output.put_line(record_newemp.empno||‘----‘||record_newemp.ename||‘----‘||‘薪资加50‘); 470 else 471 dbms_output.put_line(record_newemp.empno||‘----‘||record_newemp.ename||‘----‘||‘生活已经小康,不在加薪‘); 472 end if; 473 fetch cursor_newemp into record_newemp; 474 end loop; 475 close cursor_newemp; 476 end; 477 /