Oracle_PL/SQL

1.什么是PL/SQL?
 
PL/SQL(Procedure Language/SQL)
 
PLSQL是Oracle对sql语言的过程化扩展
 
指在SQL命令语言中增加了过程处理语句(如分支、循环等),使SQL语言具有过程处理能力。

2.SQL优点: 1.交互式非过程化;
    2.
数据操纵功能强;
    3.
自动导航语句简单;
    4.
调试容易使用方便。

3.PL/SQL优点:
 把SQL语言的数据操纵能力与过程语言的数据处理能力结合起来,
 使得PLSQL面向过程但比过程语言简单、高效、灵活和实用。

4.PL/SQL的程序结构:
declare
     
   说明部分   
   变量说明,光标申明,例外说明 〕

begin
  
   语句序列   (DML语句〕…

exception
     
   例外处理语句

End;

/

5.注意:如果要在屏幕上输出信息,
 需要将serveroutput开关打开
: set serveroutput on ---》在declare之前

6.变量和常量说明
 一般声明变量:pid char(12); psal number(7,2);
 一般声明常量:married boolean := true;
 引用型变量:my_name emp.ename%type;----->my_name的类型与emp表中的ename列的类型一样
 记录型变量:emp_rec emp%rowtype;-------->emp_rec的类型是emp表中整个所有列的类型,该emp_rec值是一个数组

7.if else 语句
 IF   条件  THEN 语句;
 
 ELSIF  语句  THEN  语句;
  -----》elseif的词为elsif 不要用错
 ELSE    语句;
 
 END  IF;

8.提示
 从键盘输入:
accept num prompt '请输入一个数字';---》接收键盘输入 num 是一个地址值(类似指针) 
 得到键盘输入的值:
 pnum number := #
 

9.SQL优化: num绑定变量(尽量使用绑定变量)
select * from emp where deptno=10;  --> 执行计划
select * from emp where deptno=20;  --> 执行计划
上面2条语句在Oracle内部机制中认为是不同的语句,其执行计划是不同的,所以要开启2次执行计划,性能降低
优化采用的方式:select * from emp where deptno=# 只开启一次执行计划

10.循环
我个人采用的:
 Loop 
    EXIT [when   条件];
   
…… 
 End loop;

11.光标
 说明光标语法:
  
CURSOR  光标名 
   [(参数名 数据类型[,参数名 数据类型]...)]
 IS SELECT 语句;
 作用:
 用于存储一个查询返回的多行数据

 打开光标: open c1;(打开光标执行查询)
 
取一行光标的值:fetch c1 into pjob; (取一行到变量中) 
 关闭光标: close c1;(关闭游标释放资源) 

 光标的属性:
 1.%isopen 是否被打开
 2.%rowcount 行数
 3.%notfound 是否有值

 带参数光标:
 cursor c2(jobc varchar2) is
 select ename, sal from emp
 where job=jobc;
 执行open('xxx');

 SQL>show parameters cursor;---->用于显示光标参数的默认值等信息


12.Oracle的异常处理
 系统定义例外
  1.
No_data_found       (没有找到数据)
  
2.Too_many_rows       (select …into语句匹配多个行)
  3.
Zero_Divide         (被零除)
  4.
Value_error         (算术或转换错误)  5.Timeout_on_resource (在等待资源时发生超时)
 用户自定义例外
 DECLARE
    
My_job char(10);    v_sal emp.sal%type;
   
No_data exception;----》自定义No_data例外
   
cursor c1 is select distinct job from emp order by job; BEGIN
    
open c1;
   
Fetch c1 into v_job;
   
IF c1%notFOUND then raise no_data;--->抛出例外
   
end if;
   

 
EXCEPTION
 
    WHEN no_data THEN insert into emp values(‘fetch语句没有获得数据或数据已经处理完');
 
END;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值