Oracel PL/SQL学习记录

本文介绍了PL/SQL的基础知识,包括PL/SQL块的结构、匿名与命名块的区别、流程控制语句、异常处理机制以及如何使用自定义异常。此外还提供了简单的PL/SQL块示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. PL/SQL块
PL/SQL结构化的语言,其程序结构的基本单位是“块”(Block)。PL/SQL块有三个部分:声明部分、执行部分、异常处理部分
[DECLARE]
    declaration statements
BEGIN
    executable statements
[EXCEPTION]
    exception statements
END

2. PL/SQL程序块可以是一个命名的程序块也可以是一个匿名程序块,匿名程序块可以用在服务器端也可以用在客户端。执行部分包含了所有的语句和表达式,执行部分以关键字BEGIN开始,将以关键字END结束。分号分隔每一条语句,使用赋值操作符:=或SELECT INTO给每个变量赋值,执行部分的错误将在异常处理部分解决,在执行部分中可以使用另一个PL/SQL程序块,这种程序块被称为嵌套块。

    所有的SQL数据操作语句都可以用于执行部分,PL/SQL块不能在屏幕上显示SELECT语句的输出。SELECT语句必须包括一个INTO子串或者是游标的一部分。

    执行部分使用的变量和常量必须首先在声明部分声明,执行部分必须至少包括一条可执行语句,NULL是一条合法的可执行语句,事物控制语句COMMIT和ROLLBACK可以在执行部分使用。

   数据定义语言(Data Definition language)不能在执行部分中使用,DDL语句与EXECUTE IMMEDIATE一起使用或者是DBMS_SQL调用。


变量,常量,表达式:
1. 变量
 声明变量
    Variable_name datatype [(WIDTH)] [:= DEFAULT expression]
 给变量赋值
    通常给变量赋值有两种方式:一是直接给变量赋值;二是通过SQL SELECT INTO给变量赋值。

2. 常量
常量与变量相似,但常量的值在程序内部不能改变,常量的值在定义时赋予,声明方式与变量相似,但必须包括关键字CONSTANT。

DECLARE
 ORDER_NO NUMBER(3);   
 CUST_NAME VARCHAR2(20);
 ORDER_DATE DATE;
 EMP_NO INTEGER:=25;
 PI CONSTANT NUMBER:=3.1416;
BEGIN
 NULL;
END;


流程控制

1. 条件结构:

if结构:
IF condition THEN 
   statement;
END IF;
IF condition THEN 
   statements_1;
ELSE 
   statements_2;
END IF;

case 多分支:
CASE 表达式(或变量)
     WHEN 表达式1 THEN 语句1;
     WHEN 表达式2 THEN 语句2;
     WHEN 表达式3 THEN 语句3;
     WHEN 表达式4 THEN 语句4;
     ELSE 值5;
END CASE;

2. 循环结构

1. loop循环
LOOP
   [statement1]
   [statement2]
   …………
   EXIT WHEN (condition);
END LOOP;

2. while...loop循环
 WHILE (condition) LOOP
   [statement1]
   [statement2]
   …………
END LOOP;

3. for循环
FOR counter IN [REVERSE] start_range .. end_range LOOP
  statements;
END LOOP;
counter是一个隐式声明的变量,初始值是start_range,第二个值是start_range+1(步长),直到end_range。如果使用了REVERSE关键字,那么范围将是一个降序。

3. 异常

    1. PL/SQL的异常

        异常处理块中包含了与异常相关的错误发生以及当错误发生时要进行执行和处理的代码。

        异常部分的语法一般如下:

BEGIN
   EXCEPTION
     WHEN excep_name1 THEN
     ……
     WHEN excep_name2 THEN
     ……
     WHEN OTHERS THEN
     ……
END; 
      2. 预定义异常
        预定义异常是由运行系统产生的。例如,出现被0除时,PL/SQL就会产生一个预定义的ZERO_DIVIDE异常。
      3. 自定义异常
        异常不一定必须是Oracle返回的系统错误,用户可以在自己的应用程序中创建可触发及可处理的自定义异常,调用异常处理     需要使用Raise语句。

常用函数:    

数字函数:

字符函数:

日期函数:


数据类型转换函数:


集合函数:


简单pl块示例:

1.
declare
  a number :=20;
  b number :=-40;
  string varchar2(50);
begin
  string :=case 
           when (a>b)then 'A is greater than B'
           when (a<b)then 'A is less than B'
           else 'A is equal to B'
           end;
  dbms_output.put_line(string);
end;

2. 块嵌套
DECLARE
  v_sno VARCHAR2(6);
  v_sname VARCHAR2(20);
  v_num NUMBER(1);
BEGIN
  v_sno :='001';
  v_sname :='张三';
  BEGIN
    SELECT 1
    INTO v_num
    FROM student
    WHERE trim(sno) =v_sno;
  EXCEPTION
    WHEN NO_DATA_FOUND THEN
      v_num :=0;
    WHEN OTHERS THEN
      dbms_output.put_line('Error in SELECT:'||SQLERRM);
      RETURN;
  END;
  IF (v_num = 0)THEN
    INSERT INTO student(sno,sname) VALUES (v_sno,v_sname);
    Commit;
  END IF;
  dbms_output.put_line('Successful Completion');
EXCEPTION WHEN OTHERS THEN
  dbms_output.put_line(SQLERRM);
END;


捕获用户自定义异常:
DECLARE
  exp_no001 EXCEPTION;   -- a user-defined exception
  v_cnt NUMBER;
BEGIN
  SELECT COUNT(*)
  INTO v_cnt
  FROM sc
  WHERE sno='001';
  IF (v_cnt=0)THEN
    --explicitly raising the user-defined exception
    RAISE exp_no001;
  END IF;
EXCEPTION
  --handling the raised user-defined exception
  WHEN exp_no001 THEN
    dbms_output.put_line('There are no Student NO 001');
  WHEN OTHERS THEN
    dbms_output.pu t_line('ERR:An error occurred with info :'||TO_CHAR(SQLCODE)||' '||SQLERRM);
END;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值