Oracle PLSQL编程

2023-09-17 20:37:26

PLSQL 介绍

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

语法结构

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

注意:

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

begin
   dbms_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):以数组形式来获取缓冲区的多行信息
begin
   dbms_output.put('a1');
   dbms_output.put('b2');
   dbms_output.new_line(); -- 输出缓存中的信息,新起一行
   dbms_output.put_line('aaaaa'); -- 会输出缓存中的信息和当前的信息,不会换行
end;

2.赋值操作

2.1 :=

-- 定义两个变量 v_a,v_b 计算和是多少
declare
    v_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;

2.2 into

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

declare
   v_name varchar2(30);
   v_sex varchar2(3);
   v_dept varchar2(10);
begin
   select 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 计算和是多少
declare
    v_a number(3) :=&请输入a; --- 声明变量
    v_b number(3) :=&请输入b; -- 声明变量同时赋值
    v_num number(3);
begin
    v_num := v_a + v_b;
    dbms_output.put_line(v_a||'+'|| v_b ||'='||v_num); -- || 字符串拼接我们通过 || 来实现
end;

2.3 属性类型

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

3.控制语句

if语句

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

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

case语句

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

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

无限循环

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

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

有条件循环

通过while来指定循环的条件

declare
   v_i number(3) := 1;
begin
   while v_i <= 10 loop
      dbms_output.put_line(v_i);
      -- 修改变量
      v_i := v_i + 1;
   end loop;
end;

for循环

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

goto

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

-- goto
declare
   v1 number(3) := &请输入v1的值;
begin
   if v1 > 10 then
        goto c1;
   elsif v1 = 10 then 
      goto c2; 
   else
      dbms_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];

案例

-- 可以根据名字或者性别来查询学生的信息
declare
    v_name student.name%type := '&请输入姓名';
    v_sex student.sex%type :='&请输入性别';
    v_sql varchar2(200);
    v_row student%rowtype;
begin
    v_sql := 'select * from student where 1=1 ';
    if v_name is not null then
        v_sql := v_sql || ' and name like ''%'||v_name||'%''' ;
    end if;
  
    if v_sex is not null then
       v_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;

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

5.异常语句

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

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

处理系统预定义异常:

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

自定义异常:

步骤:

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

ip地址的正则表达式

ip地址的正则表达式checkIpSpecial:{//验证IP地址validator:function(value){//varreg=/^((1?\d?\d|(2([0-4]\d|5[0-5])))\.){3}(1?\d?\d|(2([0-4]\d|5[0-5])))$/;这个正则表达式的意思是:以数字开头,紧接着

Redis缓存设计与性能优化最佳实践

开发规范与性能优化一、键值设计1.key名设计(1)【建议】:可读性和可管理性以业务名(或数据库名)为前缀(防止key冲突),用冒号分隔,比如业务名:表名:id(2)【建议】:简洁性保证语义的前提下,控制key的长度,当key较多时,内存占用也不容忽视,例如:(3)【强制】:不要包含特殊字符反例:包含空格、换行、单双引

QT : 仿照QQ 完成弹出登录窗口,并实例化组件

1.运行效果图2.Headers#ifndefMAINWINDOW_H#defineMAINWINDOW_H#include<QMainWindow>classMainWindow:publicQMainWindow{Q_OBJECTpublic:MainWindow(QWidget*parent=nullptr);~

MS COCO数据集介绍以及pycocotools使用

MSCOCO数据集介绍以及pycocotools使用1、MSCOCO数据集简介2、MSCOCO数据集目录结构3、MSCOCO标注文件格式3.1使用Python的json库查看3.2使用官方cocoAPI查看4、目标检测验证任务mAP1、MSCOCO数据集简介2、MSCOCO数据集目录结构├──coco2017:数据集根

log4j2 日志保存至数据库

文章目录概述一、springmvc工程1.创建数据库日志表2.log4j2.xml引入JDBCAppender3.定义日志管理类4.编写日志输出代码5.运行结果6.完整代码二、springboot工程1.创建数据库日志表2.log4j2.xml引入JDBCAppender3.定义日志管理类4.遗留问题5.解决办法6.完

百度SEO优化基本原理(掌握SEO基础,提高网站排名)

随着互联网的迅速发展,越来越多的企业开始意识到网站优化的重要性,其中百度SEO优化是企业不可忽视的一项工作。本文将介绍百度SEO优化的基本概念、步骤、原理、解决方法和提升网站标题优化的方法。蘑菇号-www.mooogu.cn百度SEO优化是指针对百度搜索引擎的搜索算法进行网站优化,提高网站在百度搜索结果页面上的排名。主

方案:浅析AI视频分析与视频监控技术的工厂车间智能化监管方案

一、方案背景工厂生产车间一般是从原材料到成品的流水作业,有大量器械和物料。为保障车间财产安全并提高生产效率,需要进行全面的监管。在生产制造流水线的关键工序中,不仅有作业过程监管需求,同时,也存在生产发生异常及产品质量问题的过程还原需求,需要结合直观现场与客观数据的融合分析。当前工厂车间的监管存在以下痛点:1)生产状态(

一致性思维链(SELF-CONSISTENCY IMPROVES CHAIN OF THOUGHT REASONING IN LANGUAGE MODELS)

概要思维链已经在很多任务上取得了非常显著的效果,这篇论文中提出了一种self-consistency的算法,来代替贪婪解码算法。本方法通过采样多个思维链集合,然后LLM模型生成后,选择一个最一致的答案作为最后的结果。一致性思维链认为复杂的推理问题,有不同的思维方式去解决,从而得到最终唯一答案。经过实验验证,一致性思维链

nginx 配置 ssl

1.1Nginx如果未开启SSL模块,配置Https时提示错误原因也很简单,nginx缺少http_ssl_module模块,编译安装的时候带上--with-http_ssl_module配置就行了,但是现在的情况是我的nginx已经安装过了,怎么添加模块,其实也很简单,往下看:做个说明:我的nginx的安装目录是/u

Python3.11教程6:标准库简介1——os、shutil、sys、random、time、datetime、 threading

文章目录一、文件和目录处理模块1.1os模块1.2shutil模块1.3文件通配符glob1.4stat二、sys模块2.1命令行参数列表2.2-c和-m选项2.3argparse2.3.1argparse使用逻辑2.3.2`add_argument()`语法三、数学3.1math3.2random3.3numpy生成

民安智库(第三方满意度调研公司)建立企业员工满意度测评指标体系

员工满意度是企业管理者关注的重点,企业管理层如何了解职工满意度状况?民安智库借鉴国内外研究成果,总结了企业职工满意度评价指标构建原则、研究方法及研究流程。为什么要建立员工满意度测评指标体系?在现代人力资源管理强调“以人为本”的管理理念下,企业需要尊重并重视员工的需求,并将员工视为最宝贵的、可增值的资源。企业的医务人员作

热文推荐