网站首页 > 技术文章 正文
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
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
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;
猜你喜欢
- 2024-10-18 Oracle ocp认证中文考试考题063-3(中文原版)
- 2024-10-18 Oracle ocp认证中文考试考题063-13(中文原版)
- 2024-10-18 Oracle ocp认证中文考试考题063-44(中文原版)
- 2024-10-18 Oracle OCP 12c 071中文考试题库-第15题
- 2024-10-18 Oracle ocp认证中文考试考题063-25(中文原版)
- 2024-10-18 Oracle ocp认证中文考试考题063-36(中文原版)
- 2024-10-18 Oracle ocp认证中文考试考题063-34(中文原版)
- 2024-10-18 记一次oracle数据库substr和instr函数的使用
- 2024-10-18 Oracle ocp认证中文考试考题063-9(中文原版)
- 2024-10-18 Oracle ocp认证中文考试考题063-23(中文原版)
你 发表评论:
欢迎- 05-10如何优化数据库和前端之间的交互?
- 05-10前端代码优化小秘籍(前端优化24条建议)
- 05-10VS Code当中的15个神仙插件,值得收藏
- 05-10如何自己开发一个Google浏览器插件?
- 05-10前端流行框架Vue3教程:14. 组件传递Props效验
- 05-10吃了一年的SU,最好用的插件都在这了
- 05-10前端必看!这款神器让网站界面告别千篇一律
- 05-10程序员请收好:10个非常有用的 Visual Studio Code 插件
- 最近发表
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端md5加密 (49)
- 前端路由 (55)
- 前端数组 (65)
- 前端定时器 (47)
- 前端懒加载 (45)
- 前端接口 (46)
- Oracle RAC (73)
- oracle恢复 (76)
- oracle 删除表 (48)
- oracle 用户名 (74)
- oracle 工具 (55)
- oracle 内存 (50)
- oracle 导出表 (57)
- oracle查询数据库 (45)
- oracle约束 (46)
- oracle 中文 (51)
- oracle链接 (47)
- oracle的函数 (57)
- mac oracle (47)
- 前端调试 (52)
- 前端登录页面 (48)
本文暂时没有评论,来添加一个吧(●'◡'●)