PL/SQL基本语法

245 阅读3分钟

1. 面向过程的语言

打印hello word

declare 
    -- 说明部分(变量,光标或者例外)
   begin
      --程序体
      dbms_output.put_line("Hello Word");
   end;
   / --退出编译环境,并执行这个程序
   
   
   --打开输出开关
   set serveroutput on
   / --执行
   
   ------输出结果-------
   Hello World
   
   
   --查看程序包的结构
   desc dbms_output

官方语法文档

database-pl-sql-language-reference.pdf

程序包的相关文档

database-pl-sql-packages-and-types-reference.pdf

定义基本变量

类型 :char,varchar2,date,number,boolean,long

举例: var1 char(15);

married boolean := true;

psal number(7,2);

引用型变量

pename emp.ename%type ; --pename 变量类型会随着emp表中ename 字段的类型变化而变化

类似于 pename varchar2(64);

记录性型变量

注意:代表一行记录,一行记录中有不同类型

emp_rec emp%rowtype;

​ select * into emp_rec from emp where empno= 7839;

if语句的使用

第一种类型

IF 条件 THEN 语句1;
   语句2;
END IF;

第二种类型

IF 条件 THEN 语句1;
  
  ELSE 语句2;
  
END IF;

第三种类型

IF 条件 THEN 语句;
  ELSIF 语句 THEN 语句;
  ELSE 语句;
END IF;

从键盘输入一个数字

image.png

循环语句

第一种类型

While total <= 25000 Loop
.....
total := total+salary;

END LOOP;

第二种类型

Loop
EXIT[when 条件];
......
End loop;

第三种类型

FOR I IN 1...3 LOOp
语句序列;

END LOOP

光标(相当于Java结果集 Resultset)

光标的属性

%fund %notfund 判断光标是否取到一条记录

%isopen: 判断光标是否打开

%rowcount 影响的行数

CURSOR 光标名[(参数名 数据类型[,参数名 数据类型]...)] IS SELECT 语句;

例如 cursor c1 is select ename from emp;

光标数的限制

默认情况下,oracle 数据库只允许在同一个会话中,打开300个光标

查询参数

image.png

修改光标的数量

alter  system set open_cursors=400 scope=both;

打开光标:

open c1;打开光标执行查询

关闭光标:

close c1;关闭游标释放资源

取一行光标的值:

fetch c1 into pename;取一行到变量中

fetch的作用:

1)把当前指针指向的记录返回

2)将指针指向下一条记录

光标的使用

1.定义一个光标 cursor cname is select ......

  1. 为光标定义一个变量 pename emp.ename%type ; (引用类型变量)
  2. 打开光标 open cname
  3. 取一条记录 fetch cname into pename
  4. 关闭光标 close cname
set serveroutput ondeclare-- 定义一个光标cursor  cemp is select ename,sal from emp;--定义一个带参数的光标cursor cemp(dno number) is select ename from emp where deptno = dno;--为光标定义相对的变量pename emp.ename%type;psal emp.sal%type;begin --打开游标open cemp; loop   --取一条记录   fectch cemp into pename,psal;      exit when cemp%notfound;     -- 打印  dbms_output.putline(pename || '的新水量'|| psal);    end loop;      --关闭光标  close cemp;  end;  /

注意: 如果PL/SQL 中对数据进行了修改操作,一定要记得commit ;

​ 对于Oracle ,默认的事务隔离级别是read commiteed ;

异常

抛异常

declare    说明部分(变量说明、光标申明、例外说明)begin     语句序列exception    例外处理语句end;/举例:exception   when no_data_fund then dbms_output.put_line("没有找到该员工");  when others then dbms_output.put_line('其他例外');end;/

常见异常

no_data_fund 没有发现数据

too_many_rows 返回多行数据

zero_divide : 0不能做除数

value_error: 算术或转换错误,就是比如字符串类型的变量转换成数字变量。

自定义异常

image-20210616070110504

当抛出异常没有直接正常关闭光标时,Oracle 会自动启动pmon进程(Process Monitor) 会自动回收垃圾进程,有点像Java中的GC

有不对的地方,欢迎大家一起讨论。 最后,欢迎大家关注我的微信号“涛涛之海”,您的点赞,收藏,转发就是对我的最大鼓励。