------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------

PL/SQL

PL/SQL(Procedural Language):过程化sql语言!

在原本的sql语句之上,再增加一些逻辑或者循环等操作。

1:基本语法

01.declare     可选部分    声明:变量,异常,游标......

02.begin      必选部分 

03.exception   可选部分     针对于异常的处理

04.end        必选部分 

2:小例子

-- 直接在输出台中显示内容

begin
dbms_output.put_line('真的很神奇。');
end;

-- 查询1002老师编号 ,我们得到对应的老师姓名和薪水

declare  --声明变量

  v_tname   teacher.tname%type;
v_sal teacher.sal%type;
v_result varchar2(30);
begin -- 开始pl/sql编程 select tname,sal into v_tname,v_sal from teacher where tno=1002;
dbms_output.put_line('姓名是==》'||v_tname); -- ||是拼接字符串
dbms_output.put_line('薪水是==》'||v_sal); if v_sal<=30000 then
v_result:='薪水是一般化'||v_sal; -- :=是赋值操作 elsif v_sal>30000 and v_sal<=40000 then
v_result:='薪水是一般以上'||v_sal; else
v_result:='薪水可以了'||v_sal; end if;
dbms_output.put_line(v_result); end;

  3:case块

-- 直接在输出台中显示内容

begin
dbms_output.put_line('真的很神奇。');
end;

-- 查询1002老师编号 ,我们得到对应的老师姓名和薪水

declare  --声明变量
v_tname teacher.tname%type;
v_sal teacher.sal%type;
v_result varchar2(30); begin -- 开始pl/sql编程
select tname,sal into v_tname,v_sal from teacher where tno=1002;
dbms_output.put_line('姓名是==》'||v_tname); -- ||是拼接字符串
dbms_output.put_line('薪水是==》'||v_sal); if v_sal<=30000 then
v_result:='薪水是一般化'||v_sal; -- :=是赋值操作 elsif v_sal>30000 and v_sal<=40000 then
v_result:='薪水是一般以上'||v_sal; else
v_result:='薪水可以了'||v_sal; end if;
dbms_output.put_line(v_result); end;

 

--  case 块

declare
num1 varchar2(20);
v_result varchar2(20); --声明了2个变量 begin
num1:='大家辛苦了20'; -- 给num1赋值 case num1 -- case开始
when '大家辛苦了1' then
v_result:=''; when '大家辛苦了2' then
v_result:=''; when '大家辛苦了3' then
v_result:=''; else
v_result:='默认的'; end case; -- case结束
dbms_output.put_line(v_result); -- 输出结果 end;

4:循环结构

-- 循环结构 do_while

declare
i number; begin
i:=1; --初始化变量 loop --开始循环 dbms_output.put_line(i); --循环体 i:=i+1; exit when i>20; -- 循环条件 end loop; --结束循环 end;

-- while循环

declare
i number; begin
i:=1; --初始化变量 while i<20 loop
dbms_output.put_line(i); --循环体
i:=i+1;
end loop; end;

-- for循环

declare
i number; begin
for i in 1..20
loop
dbms_output.put_line(i); --循环体
end loop;
end;

5:函数

-- 函数

create or replace function fn_teacher_tid
(f_tid varchar2)
return varchar2
is
f_result teacher.tid%type; begin
--判断身份证格式是否正确
if length(f_tid)!=18 then
dbms_output.put_line('身份证格式不正确!'); else
dbms_output.put_line('身份证格式正确!'); --给返回值赋值
f_result:=substr(f_tid,1,6)||'********'||substr(f_tid,15); end if;
return f_result; end fn_teacher_tid; -- 函数结束

-- 调用函数

select fn_teacher_tid(11010119910815477) from dual;

6:游标

游标概念:

01.是一个数据的缓存区,存放的是sql语句执行的结果集;

02.是一个能从多条数据结果集中每次获取一条记录的机制!

作用:

 01.游标可以反复使用,减少访问数据库的次数

 02.大大提高我们的检索效率

分类:

 01.隐式游标: 我们执行dml操作时,数据库自动创建  ==?名字 sql

 02.显示游标: 可以返回多行数据的查询结果

03.REF游标: 用于处理运行时才能确定的动态sql

 

游标常用的属性:

01. %found        是否还有数据   boolean类型的值

02. %notfound     是否没有数据   boolean类型的值

03.%rowcount     sql语句影响的行数

04.%isopen        判断游标是否打开

 

 --游标(显示游标)

declare
c_tname teacher.tname%type;
cursor tname_cursor is select tname from teacher; -- 声明游标 begin
open tname_cursor; --打开游标
fetch tname_cursor into c_tname; -- 给变量赋值 --循环输出教师名称
while tname_cursor%found loop
dbms_output.put_line('老师的姓名'||c_tname);
fetch tname_cursor into c_tname; -- 给变量赋值
end loop; close tname_cursor; --关闭游标
end;

7:存储过程

定义:

01.就是一组用于完成特定数据库功能的sql语句的集合;

02.经常被使用;

03.sql语句的集合必须编译成功后才能存储在数据库系统中。

 

组成部分:

   01.声明  变量:输入的变量,输出的变量

   02.执行

   03.异常处理

-- 创建一个新增部门信息的  存储过程

create or replace procedure  pro_dept_add
(
p_deptno dept.deptno%type,
p_dname dept.dname%type,
p_loc dept.loc%type
) is e_deptno exception; -- 声明存储过程中可能出现的异常
begin
if p_deptno<10 then
raise e_deptno; --抛出异常 end if;
--新增部门信息
insert into dept(deptno,dname,loc)
values (p_deptno,p_dname,p_loc); --手动提交事务
commit; exception -- 对异常进行处理
when e_deptno then
dbms_output.put_line('部门编号不合法'); when others then
dbms_output.put_line('其他的异常'); end pro_dept_add;

-- 调用存储过程

call pro_dept_add(10,'新增部门','一楼');

8:触发器

定义:

   01.在创建触发器的时候,规定了触发的时机

   02.人为的不能去调用

组成部分:

  01.触发器名

  02.触发时间

  03.before:在数据库动作执行之前

  04.after:在数据库动作执行之后

  05.insert

  06.update

  07.delete

  08.表名: 触发器所在的表

  09.for each row

属性:

  :old  代表修改之前的值

  :new 代表修改之后的值

只能在.for each row中使用

Insert   ====>:new

Delete  ====>:old

Update  ====>:old  :new

-- 创建一个序列

create sequence sq_teacherlog_logid
minvalue 1
maxvalue 9999999
start with 1
increment by 1
cache 50;

-- 创建一个表 用来 监听 teacher表的变化

create  table  teacher_log(
logid number not null primary key,
log_type varchar2(10) not null,
log_time date not null,
log_data varchar2(50)
)

-- 创建一个触发器

create  or replace trigger tr_teacher
after insert or update or delete -- 触发时机
on teacher for each row declare
t_type teacher_log.log_type%type;
t_time teacher_log.log_time%type;
t_data teacher_log.log_data%type; begin
if inserting then --新增
t_type:='insert';
t_data:=:new.tno||'===='||:new.sal; elsif deleting then -- 删除
t_type:='delete';
t_data:=:old.tno||'===='||:old.sal; else
t_type:='update';
t_data:=:old.tno||'===='||:old.sal||'===='||:new.sal; end if;

  -- 将用户操作的数据保存到 teacher_log

insert into teacher_log
values(sq_teacherlog_logid.nextval,t_type,sysdate,t_data);
end tr_teacher;

-- 新增数据到teacher

insert into teacher(tno,sal) values(1200,20000);

-- 修改上面的新增数据

update teacher  set sal=40000 where tno=1200;

-- 删除上面的数据

delete from teacher where tno=1200;

原作者:晨曦Dawn

博客地址:https://www.cnblogs.com/DawnCHENXI/p/9073382.html

转载请注明出处!!!!!!!如果有错误请指出,会更改,感激不尽

Oracle-14:PLSQL的更多相关文章

  1. oracle教程:PLSQL常用方法汇总

    oracle教程:PLSQL常用方法汇总 在SQLPLUS下,实现中-英字符集转换alter session set nls_language='AMERICAN';alter session set ...

  2. 本地不安装oracle,PLsql远程连接

    Oracle的Instant client工具包可以很好地解决本地不安装oracle,PLsql远程连接. 1.首先到Oracle网站下载Instant Client : http://www.ora ...

  3. oracle用plsql登陆出错,提示ORA-12170:TNS:链接超时 --------关闭防火墙试试

    oracle用plsql登陆出错,提示ORA-12170:TNS:链接超时 但是使用sqlplus可以连接 ping 本机127.0.0.1 显示一般故障 后关闭防火墙,问题解决. ps:登录时使用@ ...

  4. Oracle在plsql中修改数据

    Oracle在plsql中想要修改数据,有两种方式: a.使用rowid+点击锁图标,语句为: select t.*,rowid from T_BIC_PLY_MAIN t;   b.使用for up ...

  5. Oracle数据库PLSQL编程和存储过程

    一.PLSQL编程 1.1.使用PLSQL实现 Hello world! 1 -- Created on 2022/8/22 by ADMINISTRATOR 2 declare 3 -- 这是申明变 ...

  6. Oracle安装:64位电脑安装64位Oracle、PLSQL步骤

    步骤: 1.安装64位Oracle 2.安装64位PLSql 3.将11.2.0.win32的压缩包解压,放在Oracle的安装目录:product下 4.配置PLSQL参数: Tools -> ...

  7. 搭建java,oracle,plsql开发环境

    一:安装jdk和jre; (1)有两种方法:1,从官网网址上安装:2,安装绿色版 (2)配置环境变量 在"系统变量"下进行如下配置: (1)新建->变量名:JAVA_HOME ...

  8. oracle通过plsql导入dmp数据文件

    首先安装Oracle,新建一个空的数据库mydb 从开始菜单运行cmd控制台:sqlplus "用户名/密码@数据库名 as sysdba"//例如sqlplus sys/admi ...

  9. Oracle基础 PL-SQL编程基础(4) 异常处理

    异常处理: 即使良好的PL-SQL程序也会遇到错误或者未预料的事件,一个优秀的程序都应该能够处理各种出错情况,尽可能的从错误中恢复.程序在运行时出现的错误成为异常.发生异常后,语句讲终止执行,PLSQ ...

  10. Oracle基础 PL-SQL编程基础(1) 变量和常量

    一.什么是PL-SQL PL-SQL是结合了Oracle过程语言和结构化查询语言(SQL)的一种扩展语言.具体来说,PL-SQL就是在普通的SQL语句的基础上增加了编程语言的特点,将数据操作和查询语句 ...

随机推荐

  1. 关于ruby gem无法连接到rubygems.org的解决方案

    RubyGems 镜像 - 淘宝网 为什么有这个? 由于国内网络原因(你懂的),导致 rubygems.org 存放在 Amazon S3 上面的资源文件间歇性连接失败.所以你会与遇到 gem ins ...

  2. 信息化建设中的IT规划精要

    IT规划在信息化建设中发挥着"定位"和"导航"的作用,IT规划理论方法更是博大精深,细细讲来,会成为IT版本的"一千零一夜".因此,本文以& ...

  3. Install OpenCV 3.0 and Python 2.7+ on Ubuntu

    为了防止原文消失或者被墙,转载留个底,最好还是去看原贴,因为随着版本变化,原贴是有人维护升级的 http://www.pyimagesearch.com/2015/06/22/install-Open ...

  4. svn Server sent unexpected return value (403 Forbidden) in response to CHECKOUT

    今天,提交資料到公司svn服務器,但是一直提示 Server sent unexpected return value (403 Forbidden) in response to CHECKOUT ...

  5. linux下面调试C、C++

    (1)写好makefile文件(支持debug) objects = Main.o Satellite.o TimeSystem.o  SRPPara:$(objects) g++ -g -o SRP ...

  6. Java自学开发编程路线图(文中有资源福利)

    Java 语言入门 免费视频资源<毕向东Java基础教程>:http://yun.itheima.com/course/7.html JavaEE 学习大纲 所处阶段 主讲内容 技术要点 ...

  7. 单调队列——求m区间内的最小值

    单调队列,顾名思义是指队列内的元素是有序的,队头为当前的最大值(单调递减队列)或最小值(单调递增序列),以单调递减队列为例来看队列的入队和出队操作: 1.入队: 如果当前元素要进队,把当前元素和队尾元 ...

  8. DDGScreenShot — 复杂屏幕截屏(如view ScrollView webView wkwebView)

    写在前面 最近有这么一个需求,分享页面,分享的是web订单截图,既然是web 就会有超出屏幕的部分, 生成的图片还要加上我们的二维码,这就涉及到图片的合成了. 有了这样的需求,就是各种google.也 ...

  9. 一道面试题引发的思考(C#值类型和引用类型)

    某年某月,笔者去面试招行的一个外包项目,辗转来到面试地点以后,面试官给了我一份试卷,试卷只有两道题目,其中一道是这样的: 阅读以下程序 class Program { struct Point { p ...

  10. html5 标签在 IE 下使用

    (function(){if(!/*@cc_on!@*/0)return;var e = "abbr,article,aside,audio,bb,canvas,datagrid,datal ...