Oracle快速入门学习笔记(第四课PL

PL/SQL

一、运算符

(1)赋值运算符 :=

(2)判断是否相等 =

(3)字符串相连 ||

(4)不等于 <>

二、PL/SQL——————

Procedure Language & Structured Query Language

PL /SQL是一种高级数据库程序设计语言,该语言专门用于在各种环境下对ORACLE数据

库进行访问。

模块化

过程化

declare

a int;

b int;

c int;

BEGIN

-- 执行的逻辑

a:=10;-- 普通赋值

b:=20;

c:=a+b;

dbms_output.put_line(c);

end;

-- 给变量赋的值来自于表 select ... into ...

-- 统计员工的人数emp

DECLARE

counts int;

BEGIN

select count(*) into counts from emp;

dbms_output.put_line('部门人数'||counts);

end;

-- 查看表结构

select * from user_tab_columns

where Table_Name='EMP';

select * from emp;

-- 将新增的数据返回到变量中 returning ...into ...

DECLARE

names varchar2(20);

row_id ROWID;

BEGIN

insert into emp(empno,ename) values(7779,'好习惯') returning rowid,ENAME into row_id,names ;

dbms_output.put_line(row_id||'----'||names);

end;

select sysdate from dual;

-- 复合数据类型(等同于java中class)

DECLARE

type student is record(

sid int,

names varchar2(10),

birthday date

);

stu1 student;

stu2 student;

BEGIN

stu1.sid:=1;

stu1.names:='刘小伟';

stu1.birthday:=sysdate;

stu2.sid:=9;

stu2.names:='厉小林';

stu2.birthday:=to_date('1999-09-09','yyyy-mm-dd');

dbms_output.put_line(stu1.names||'------'||stu2.names);

dbms_output.put_line(to_char(stu1.birthday,'yyyy-mm-dd')||'------'||stu2.birthday);

end;

-- 从表中获取数据,存入到复合类型

-- 获取10号部门的信息 DEPT

DECLARE

-- 创建复合类型

type dept_t is record(

dno number(2),

dn varchar2(14),

cc varchar2(13)

);

mydept dept_t;

BEGIN

select deptno,dname,loc into mydept from DEPT where DEPTNO=10;

dbms_output.put_line('部门编号 部门名称 部门地址');

dbms_output.put_line(mydept.dno||' '||mydept.dn||' '||mydept.cc);

end;

-- %TYPE

-- 变量类型自动会和表的数据类型一致

DECLARE

-- 创建复合类型

type dept_t is record(

dno dept.DEPTNO%type,

dn DEPT.DNAME%type,

cc DEPT.LOC%type

);

mydept dept_t;

BEGIN

select deptno,dname,loc into mydept from DEPT where DEPTNO=10;

dbms_output.put_line('部门编号 部门名称 部门地址');

dbms_output.put_line(mydept.dno||' '||mydept.dn||' '||mydept.cc);

end;

-- %rowtype

-- 定义的记录类型和表的一行记录一致

DECLARE

myd dept%rowtype;

BEGIN

select deptno,dname,loc into myd from DEPT WHERE deptno=10;

dbms_output.put_line('部门编号 部门名称 部门地址');

-- 记录类型变量.属性(就是表的字段名)

dbms_output.put_line(myd.deptno||' '||myd.dname||' '||myd.loc);

END;

条件控制语句

/*

IF .. THEN

elsif ... THEN

else

end if;

*/

-- 抽奖

-- 生成随机数dbms_random.value [0,1)

select dbms_random.value from dual;

declare

n int;

begin

select 151*dbms_random.value+50 into n from dual;

dbms_output.put_line('随机数='||n);

if mod(n,9)=0 THEN

dbms_output.put_line('恭喜你,中一等奖,走向人生巅峰');

elsif mod(n,7)=0 THEN

dbms_output.put_line('恭喜你,中二等奖,还差一点就要赢取白富美没了');

elsif mod(n,5)=0 THEN

dbms_output.put_line('恭喜你中了三等奖,奖品是一床被子');

ELSE

dbms_output.put_line('谢谢惠顾,纪念奖纸巾一包');

end if;

end;

-- CASE

declare

n int;

begin

select 151*dbms_random.value+50 into n from dual;

dbms_output.put_line('随机数='||n);

case

when mod(n,9)=0 THEN

dbms_output.put_line('恭喜你,中一等奖,走向人生巅峰');

when mod(n,7)=0 THEN

dbms_output.put_line('恭喜你,中二等奖,还差一点就要赢取白富美没了');

when mod(n,5)=0 THEN

dbms_output.put_line('恭喜你中了三等奖,奖品是一床被子');

ELSE

dbms_output.put_line('谢谢惠顾,纪念奖纸巾一包');

end case;

end;

-- case用在select语句中

循环语句

/* 一、简单循环

loop

循环体

exit when 条件

end loop;

*/

-- 1-100之间累和

DECLARE

i int:=1;

s int:=0;

BEGIN

loop

s:=s+i;

i:=i+1;

exit when i>100;--循环结束的条件

end loop;

dbms_output.put_line(s);

END;

-- while循环

/*

while 条件 loop

循环体

end loop;

*/

-- 1-10到累乘的结果

DECLARE

i int:=1;

s int:=1;

BEGIN

while i<=10 loop

s:=s*i;

i:=i+1;

end loop;

dbms_output.put_line(s);

end;

-- FOR循环

/*

for i in a..b loop

循环体

end loop;

【注意】循环变量i不需要声明,可以直接使用

*/

declare

s int :=0;

BEGIN

for i in 1..100 loop

if mod(i,2)=0 THEN

s:=s+i;

end if;

end loop;

dbms_output.put_line('100以内的偶数相加='||s);

end;

-- 判断一个数是否是素数

declare

m int :=9;

flag boolean :=true;

BEGIN

for i in 2..m-1 loop

if mod(m,i)=0 THEN

flag:=false;

exit;

end if;

end loop;

-- ???用函数,将true和false分别用汉字提示代替

dbms_output.put_line(decode(flag,true,'是素数',false,'不是素数'));

end;

游标

/*

游标是一个指向结果集的当前记录的指针,

游标指向哪一行,我们就能读取哪一行的数据

游标最初指向第一行的前一行

游标的分类:

A、显示游标

② 打开游标

③ 提取游标

④ 关闭游标

B、隐式游标

简化上述操作,利用for循环

*/

DECLARE

x emp%rowtype;

cursor c is select * from emp;

BEGIN

-- ② 打开游标

open c;

-- ③ 提取游标

fetch c into x;-- 移动游标并且将当前行保存x变量

while c%found loop

dbms_output.put_line(x.ename||' ');

fetch c into x;-- 遍历,将下一行数据存入x对象

end loop;

--dbms_output.put_line('fsdkfj ');

-- ④ 关闭游标

close c;

end;

select * from emp;

-- 带参数的游标

DECLARE

e emp.ename%type;

j EMP.job%type;

cursor c(n int) is select ename,job from EMP

where mod(empno,n)=0;

BEGIN

-- 打开游标,将参数传入

open c(4);

-- 提取数据

fetch c into e,j;

while c%found loop

dbms_output.put_line(e||' '||j);

fetch c into e,j;

end loop;

-- 关闭游标

close c;

end;

--隐式游标--简化游标操作

DECLARE

cursor c is select * from dept;

BEGIN

for x in c loop

dbms_output.put_line(x.deptno||'--'||x.dname||'--'||x.loc);

end loop;

end;

-- 带参游标

DECLARE

cursor c(i int) is select * from dept where mod(deptno,i)=0;

BEGIN

for x in c(4) loop

dbms_output.put_line(x.deptno||'--'

||x.dname||'--'||x.loc);

end loop;

end;


分享到:


相關文章: