Oracle11g全新讲解之PLSQL编程

news/2024/11/18 0:21:45/

在这里插入图片描述

一、PLSQL编程

  是过程语言(Procedural Language)与结构化查询语言(SQL)结合而成的编程语言.通过增加变量、控制语句,使我们可以写一些逻辑更加复杂的数据库操作.

语法结构

declare--声明变量  变量名称 v_ 开头,规范
begin--执行具体的语句--异常处理
end;

注意:

  1. 赋值通过’:='完成
  2. begin和end之间必须有一行可执行的代码
  3. end之后必须跟上’;’
  4. 如果没有需要声明的变量declare可以省略掉
declarev_hello varchar(20);
beginv_hello := 'Hello Oracle';dbms_output.put_line(v_hello);
end;begindbms_output.put_line('hello');
end;

dbms_output不输出的问题。执行如下命令即可

set serveroutput on;

1. dbms_output用法

  dbms_output包主要用于调试pl/sql程序,或者在sql*plus命令中显示信息(displaying message)和报表,譬如我们可以写一个简单的匿名pl/sql程序块,而该块出于某种目的使用dbms_output包来显示一些信息。

  1. enable:在serveroutput on的情况下,用来使dbms_output生效(默认即打开)
  2. disable:在serveroutput on的情况下,用来使dbms_output失效
  3. put:将内容写到内存,等到put_line时一起输出
  4. put_line:不用多说了,输出字符
  5. new_line:作为一行的结束,可以理解为写入buffer时的换行符
  6. get_line(value, index):获取缓冲区的单行信息
  7. get_lines(array, index):以数组形式来获取缓冲区的多行信息
begindbms_output.put('a1');dbms_output.put('b2');dbms_output.new_line(); -- 输出缓存中的信息,新起一行dbms_output.put_line('aaaaa'); -- 会输出缓存中的信息和当前的信息,不会换行
end;

2.赋值操作

2.1 :=

-- 定义两个变量 v_a,v_b 计算和是多少
declarev_a number(3); --- 声明变量v_b number(3) :=20 ; -- 声明变量同时赋值v_num number(3);v_f constant varchar(20) :='我是常量';
begin-- v_f := 'aaa'; -- 常量不能够被修改v_a := 30;v_num := v_a + v_b;dbms_output.put_line(v_a||'+'|| v_b ||'='||v_num); -- || 字符串拼接我们通过 || 来实现
end;

image.png

2.2 into

  into我们在执行SQL操作的时候,需要把查询的字段信息赋值给变量。那么这时我们就可以通过into 关键字来实现。如果有多个字段要赋值。我们只需要在into的左右两侧建立好对应关系即可。

declarev_name varchar2(30);v_sex varchar2(3);v_dept varchar2(10);
beginselect name,sex,department into v_name,v_sex,v_dept from student where id = 901;dbms_output.put_line(v_name||'-'||v_sex||'-'||v_dept);
end;-- 定义两个变量 v_a,v_b 计算和是多少
declarev_a number(3) :=&请输入a; --- 声明变量v_b number(3) :=&请输入b; -- 声明变量同时赋值v_num number(3);
beginv_num := v_a + v_b;dbms_output.put_line(v_a||'+'|| v_b ||'='||v_num); -- || 字符串拼接我们通过 || 来实现
end;

2.3 属性类型

  1. %type:变量和字段类型的绑定
  2. %rowtype:表结构中的一条记录的绑定
-- 变量的类型如果和字段的类型不一致怎么办?
-- 属性类型
declarev_name student.name%type;v_sex student.sex%type;v_dept student.department%type;
beginselect name,sex,department into v_name,v_sex,v_dept from student where id = 901;dbms_output.put_line(v_name||'-'||v_sex||'-'||v_dept);
end;
-- 表结构中有很多个字段。我们对于的就需要声明多少个变量,很繁琐。
declarev_row student%rowtype;
beginselect * into v_row from student where id = 901;dbms_output.put_line(v_row.id||'-'||v_row.name||'-'||v_row.sex);
end;

3.控制语句

3.1 分支语句

3.1.1 if语句

  if语句的作用是控制程序的执行顺序。范围控制

declarev_age number(3) := &请输入年龄;
begin dbms_output.put_line('v_age='||v_age);if v_age = 18 thendbms_output.put_line('成年小伙');end if;dbms_output.put_line('-------');if v_age = 18 thendbms_output.put_line('成年小伙');elsedbms_output.put_line('未知...');end if;dbms_output.put_line('-------');if v_age = 18 thendbms_output.put_line('成年小伙');elsif v_age < 18 thendbms_output.put_line('小孩子');elsif v_age > 18 thendbms_output.put_line('成年人');elsedbms_output.put_line('未知...');end if;
end;

3.1.2 case语句

  case语句是一个非常强大的关键字。既可以实现类似于Java中的switch语句的作用。也可以像if语句一样来实现范围的处理。

-- case 语句
declarev_age number(3) := &输入年龄;
begincasewhen v_age < 18 thendbms_output.put_line('小朋友');when v_age > 18 then dbms_output.put_line('成年人');elsedbms_output.put_line('刚好成年');end case;
end;
-- case 语句可以实现类似于Java中的switch语句。在 case 和when之间声明变量就可以
-- 如果是在when 和 then 之间指定条件那么和if语句是类似的
declarev_age number(3) := &输入年龄;
begincase v_agewhen 18 thendbms_output.put_line('18');when 19 then dbms_output.put_line('19');elsedbms_output.put_line('未知');end case;
end;

3.2 循环语句

3.2.1 无限循环

  loop循环可以通过exit来指定条件跳出循环。如果不指定那么就是无限循环

-- 输出1~10
declarev_i number(3) := 1;
beginloopdbms_output.put_line(v_i);exit when v_i >= 10; -- 退出循环v_i := v_i + 1;end loop;
end;

3.2.2 有条件循环

通过while来指定循环的条件

declarev_i number(3) := 1;
beginwhile v_i <= 10 loopdbms_output.put_line(v_i);-- 修改变量v_i := v_i + 1;end loop;
end;

3.2.3 for循环

--for循环
beginfor i in 1..10 loopdbms_output.put_line(i);end loop;
end;
select * from student;
beginfor cur_row in (select id,name,sex,department  from student) loopdbms_output.put_line(cur_row.id||'-'|| cur_row.name ||'-' || cur_row.sex || '-' || cur_row.department);end loop;
end;

3.2.4 goto

顺序控制用于按顺序执行语句,goto关键字会跳转到我们指定的位置开始自上而下执行。

-- goto
declarev1 number(3) := &请输入v1的值;
beginif v1 > 10 thengoto c1;elsif v1 = 10 then goto c2; elsedbms_output.put_line('其他');end if;dbms_output.put_line('666');<<c1>>dbms_output.put_line('大于10');<<c2>>dbms_output.put_line('等于10');dbms_output.put_line('----1----');dbms_output.put_line('----2----');
end;

4.动态SQL语句

  动态 SQL 是指在PL/SQL程序执行时生成的SQL 语句。

语法结构为:

EXECUTE IMMEDIATE dynamic_sql_string[INTO  define_variable_list][USING bind_argument_list];

案例

-- 可以根据名字或者性别来查询学生的信息
declarev_name student.name%type := '&请输入姓名';v_sex student.sex%type :='&请输入性别';v_sql varchar2(200);v_row student%rowtype;
beginv_sql := 'select * from student where 1=1 ';if v_name is not null thenv_sql := v_sql || ' and name like ''%'||v_name||'%''' ;end if;if v_sex is not null thenv_sql := v_sql || ' and sex = '''|| v_sex||'''' ;end if;execute immediate v_sql into v_row ;dbms_output.put_line(v_row.name||'---'||v_row.sex||'---'||v_row.department);
end;

如果查询的结果不存在或者返回的记录过多那么都会爆出异常信息

image.png

5.异常语句

在运行程序时出现的错误叫做异常
发生异常后,语句将停止执行,控制权转移到PL/SQL 块的异常处理部分
异常有两种类型

  • 预定义异常 - 当 PL/SQL 程序违反 Oracle 规则或超越系统限制时隐式引发
  • 用户定义异常 - 用户可以在 PL/SQL 块的声明部分定义异常,自定义的异常通过 RAISE 语句显式引发

处理系统预定义异常:

-- 异常的应用
-- 系统预定义异常: 
-- too_many_rows 多行数据
-- no_data_found 找不到
-- others 其他异常
declarev_name student.name%type;beginselect name into v_name from student where id = 900 ;dbms_output.put_line(v_name);-- 异常语句块exceptionwhen too_many_rows thendbms_output.put_line('返回太多行');when no_data_found thendbms_output.put_line('找不到数据');when others thendbms_output.put_line('其他错误');
end;

自定义异常:

步骤:

  1. 需要显示的声明自定义的异常
  2. 在业务逻辑代码中通过raise关键字抛出自定义异常
  3. 我们需要在异步部分来声明自定义异常满足条件的处理方案
-- 自定义异常
declaremyException exception; -- 声明异常v_name varchar2(30) := '张三1';
beginif v_name not in ('张三','李四','王五') then-- 满足条件就抛出异常raise myException;elsedbms_output.put_line('---------------------');end if;dbms_output.put_line('---------66666------------');exceptionwhen myException thendbms_output.put_line('---------触发了自定义异常------------');when others thendbms_output.put_line('---------其他异常------------');
end;

http://www.ppmy.cn/news/46157.html

相关文章

数据结构入门-11-红黑树

史上最负盛名的平衡二叉树–红黑树&#xff0c;但其实就是2-3树的一种实现 文章目录 一、红黑树性质二、红黑树性质推导过程2-3树2.3.1 如何维护绝对平衡2-3树2.3.2 红黑树&2-3树2.3.3 再来看红黑树的性质1.每个节点为 Black or Red2.根节点是Black3.每一个叶子节点(最后的…

程序员阿里三面无理由挂了,被HR一句话噎死,网友:这可是阿里啊

进入互联网大厂一般都是“过五关斩六将”&#xff0c;难度堪比西天取经&#xff0c;但当你真正面对这些大厂的面试时&#xff0c;有时候又会被其中的神操作弄的很是蒙圈。 近日&#xff0c;某位程序员发帖称&#xff0c;自己去阿里面试&#xff0c;三面都过了&#xff0c;却被…

15、异常处理

文章目录 1、错误处理1、默认规则2、定制错误处理逻辑3、异常处理自动配置原理4、异常处理步骤流程 【尚硅谷】SpringBoot2零基础入门教程-讲师&#xff1a;雷丰阳 笔记 路还在继续&#xff0c;梦还在期许 1、错误处理 1、默认规则 默认情况下&#xff0c;Spring Boot提供/er…

Python标记数组的连通域

文章目录 连通域标记structure参数操作连通域定位连通域 连通域标记 通过label函数&#xff0c;可以对数组中的连通区域进行标注&#xff0c;效果如下 from scipy.ndimage import label import numpy as np a np.array([[0,0,1,1,0,0],[0,0,0,1,0,0],[1,1,0,0,1,0],[0,0,0,1…

王道计组(23版)1_计算机系统概述

1.计算机发展历程 硬件的发展&#xff1a; 电子管、晶体管、中小规模集成电路、超大规模集成电路 摩尔定律&#xff1a; 价格不变时&#xff0c;每18个月&#xff0c;集成电路可容纳的晶体管数量和性能增加一倍 微型计算机的发展以微处理器技术为标志 计算机体系结构&#xf…

信息系统项目管理师-项目干系人管理

1.过程 1.1 识别干系人 定期识别项目干系人&#xff0c;分析和记录他们的利益、参与度、相互依赖性、影响力和对项目成功的潜在影响力的过程。 1.2 规划干系人参与 根据干系人的期望、需求、利益和对项目潜在的影响&#xff0c;制定项目干系人参与项目的方法的过程。 1.3 管理干…

适配器详解

目录 1、适配器简介 2、函数对象适配器 ​编辑 3、函数指针作为适配器 ptr_fun ​编辑 4、类中的成员函数作为适配器 mem_fun_ref 5、取反适配器 5.1、not1 一元取反适配器 ​编辑 5.2、not2 二元取反适配器 1、适配器简介 适配器 为算法 提供接口 目前的适配器最多能…

spring redis Sentinel 哨兵 原理

客户端选择 redis 常用的连接客户端 有三个 Jedis&#xff1a;是老牌的Redis的Java实现客户端&#xff0c;提供了比较全面的Redis命令的支持&#xff0c;Redisson&#xff1a;实现了分布式和可扩展的Java数据结构。Lettuce&#xff1a;高级Redis客户端&#xff0c;用于线程安…