PLSQL 基础语法

2023-11-19

01. PLSQL 语法(变量,if,loop,cursor,exception)

1. 语法

  • 在数据库服务器上保存的打断可执行方法,供其他开发人员调用

  • 可以有效的减少数据库端和服务端的数据交互,提高效率,降低带宽消耗

  • 语法格式:

    declare -- 定义部分,保存变量,引用型变量,记录型异常
    
    begin -- 逻辑处理部分
    
    exception -- 需要捕获异常是写上
    
    end; -- 结束
    

2. 定义变量

定义 描述
constant 常量
表名%rowtype 记录型变量
表名.列名%type 引用型变量
:= 给变量赋予默认值
into 把查询出来的数据进行赋值
  • 实例
declare
	-- 定义变量
	i number := 1;
	-- 定义常量
	pi constant number := 2;
	-- 定义记录型变量/记录一行数据
	-- 变量名 表名%rowtype;
	v_emp emp%rowtype;
	-- 定义引用型变量
	-- 变量名.列明%type
	pname emp.ename%type;
	
begin
	select * into pemp from emp;
end;

3. if判断

  • 语法:

    /*
    if判断:
    if 条件表达式 then
    
    elsif 条件表达式 then
    
    else 
    
    end if;
    */
    
    -- 实例:
    declare
    	age number := 18;
    begin
    	if age = 17 then
    	dbms_output.put_line('我是17');
            elsif age = 18 then
            dbms_output.put_line('我是18');
            	else
            	dbms_output.put_line('我是??');
    	end if;
    end;
    

4. loop循环

  • 语法:

    /*
    语法一: 相当于while循环
    while 条件表达式 loop
    
    end loop;
    */
    -- 实例
    declare
      i number := 0;
    begin
      while i < 10 loop
        i := i + 1;
        dbms_output.put_line(i);
      end loop;
    end;
    
    /*
    语法二:
    loop
    	exit when 退出循环条件
    
    end loop;
    */
    -- 实例:
    declare
      i number := 0;
    begin
      loop
        i := i + 1;
        exit when i > 10;
        dbms_output.put_line(i);
      end loop;
    end;
    
    /*
    语法三:
    1..10: 也可以是查询出来的结果集
    for 变量 in 1..10 loop;
    
    end loop
    */
    -- 实例:
    declare
      i number := 0;
    begin
      for i in 1..10 loop
        dbms_output.put_line(i);
      end loop;
    end;
    

5. cursor游标

  • 是一个私有的SQL工作区,分为隐式游标和显示游标,我们通常声明的是显示游标

  • 用来操作结果的,相当于java中的迭代器

  • 语法:

    /*
    开发步骤:
    	1. 声明游标: cursor 游标名 is 查询结果集
    	2. 打开游标: open 游标名
    	3. 从游标中取出数据: fetch 游标名 into 变量名
    			游标名%found: 找到数据
    			游标名%notfound: 没有找到数据
        4. 关闭游标
    */
    
    declare
      emp_rows emp%rowtype;
      -- 1.
      cursor rows is select * from emp;
    begin
      -- 2.
      open rows;
      	-- 2.1
        loop
          -- 3.
          fetch rows into emp_rows;
          -- 3.1
          exit when rows%notfound;
          dbms_output.put_line(emp_rows.ename);
        -- 3.2
        end loop;
      -- 4.
      close rows;
    end;
    

6. exception异常

类型 描述
no_data_found 找不到数据
too_many_rows 匹配到多个字符
zero_divide 零除
value_error 算数或转换异常
timeout_on_resource 在等待资源时发生超时
others 最大的异常/相当于java中的exception
  • 语法:

    /*
    yvfa:
    declare
    
    begin
    
    exception
    	when 异常类型 then
    	处理
    end;
    */
    -- 实例:
    declare
      num number := 1;
    begin
      num := num/0 ;
    exception
      when zero_divide then
        dbms_output.put_line('除零异常');
    end;
    
    -- 自定义异常:
    declare
        no_date exception;
    begin 
        raise no_date;
        
    exception
        when no_date then
          dbms_output.put_line('自定义异常');
    end;
    

7. 存储过程

  • 将一个个PLSQL的业务处理过程存储起来复用,这些被存储取来的PLSQL程序称之为存储过程

  • 实例:

    /*
    语法:
      create or replace procedure 存储过程名(参数名称 in 参数类型,返回值名称 in 返回值参数类型) is
      -- 定义变量
      begin
      
      end;
    */
    
    -- 实例一: 无参数无返回值
    create or replace procedure run1 is
    -- 声明变量
    begin
      dbms_output.put_line('run1');
    end;
    -- 调用
    begin
      run1;
    end;
    
    -- 实例二: 有参数无返回值
    create or replace procedure run2(i_sid in student.tid%type) is
    -- 声明变量
      v_sname student.sname%type;
      v_sid student.tid%type;
    begin
      select tid,sname into v_sid,v_sname from student where tid = i_sid;
      dbms_output.put_line(v_sid);
      dbms_output.put_line(v_sname);
    end;
    -- 调用
    begin
      run2(1);
    end;
    
    -- 实例三: 有参数有返回值
    create or replace procedure run3(i_sid in student.tid%type,i_sname out student.sname%type) is
    begin
      select sname into i_sname from student where tid = i_sid;
    end;
    -- 调用
    declare
      v_sname student.sname%type;
    begin
      run3(1,v_sname);
      dbms_output.put_line(v_sname);
    end;
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PLSQL 基础语法 的相关文章

  • SQL SELECT 对值求和,不包括重复项

    我在 Oracle SQL 中遇到一个问题 我正在尝试解决这个问题 我将用一个例子来说明 我正在查询三个表 Employees EmployeeID Name 1 John Smith 2 Douglas Hoppalot 3 Harry
  • Oracle DataAccess 相关:“动态程序集中不支持调用的成员。”

    据我了解 此类错误已在 SO 上讨论过多次 有些人认为这是 DLL 文件中的错误 有些人通过更改 DLL 版本来解决 其他人似乎没有任何线索 无论如何 我只是发帖试试运气 在 C GUI 上的网格中选择一行时 我的应用程序崩溃了 stack
  • 在 Oracle 过程中实现多线程

    我正在研究 Oracle 10gR2 这是我的问题 我有一个程序 我们称之为 proc parent 在包内 应该调用另一个过程 让我们调用它 用户创建 我得打电话 用户创建 在一个循环中 它从表中读取一些列 并且这些列值作为参数传递给 用
  • PL/SQL 过程成功完成但没有显示任何内容

    我有以下过程代码 create or replace PROCEDURE Ventas cliente p DNI IN CHAR IS CURSOR c pedidos clientes IS SELECT FROM Pedidos ve
  • 当网站停止时,Oracle 数据提供程序会固定 IIS 工作进程

    我们在 Oracle 11g 第 2 版中遇到了一个严重的问题 其中 w3wp 进程接管了整个处理器核心 并且调试显示 Oracle 数据提供程序无限地抛出 ThreadAbortException 开发人员通过执行以下操作发现了此问题 1
  • Oracle 11g OFFSET FETCH 给出错误

    我正在进行查询并尝试从数据库中获取随机数量的行 但 Oracle 一直告诉我我的命令尚未正确结束 select from random table order by random column name offset 0 rows fetc
  • 使用 createNativeQuery 调用 Oracle 存储过程

    我需要使用 JPA 调用存储过程并找到这篇文章 http www oracle com technology pub articles vasiliev jpql html http www oracle com technology pu
  • Oracle 中的函数与过程

    Oracle 中函数和过程的主要区别是什么 如果我可以用函数完成所有事情 为什么我必须使用过程 如果我无法在sql语句中调用过程 好吧 我会编写一个函数来完成相同的工作 过程不返回值 好的 在任何 dml 操作后我将仅返回 sql rowc
  • 在 jdbc 程序中使用时,通过 SQL 客户端插入表中的记录未显示

    我使用 SQL 客户端和 JDBC 程序将几行插入到我的表 EMP 中 使用 SQL 客户端插入的记录不会显示在 Java 的输出控制台中 我正在使用 Java 8 和 oracle 11g 数据库来插入和读取数据库 除了通过 SQL 客户
  • 如何在TOAD的DataGrid中显示sys_refcursor数据

    请我需要帮助 我搜索了很多并且变得更加困惑 我使用 Toad 9 7 25 并且我做了这个程序 在一个包中 PROCEDURE ReportaCC pfcorte IN DATE lcursor IN OUT SYS REFCURSOR I
  • Oracle存储过程使用数组作为表插入的参数

    我一直在寻找一个明显的例子 但没有运气 抱歉 如果已经回答了 我正在尝试做一些非常简单的事情 一个存储过程 它将获取输入并将它们插入到表中 我希望它获取多行数组并一次全部插入 我认为这很简单 但我还没有找到一个可以展示我的例子 在很多例子中
  • Oracle 中的 SQL 调优 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有任何文章 链接可以让我找到 SQL 调优 Oracle 的示例 如果能用例子来解释那就太好了 我需
  • 分层查询

    我希望我能够解释困扰我的问题 我有以下分层数据集 这只是 34K 记录的子集 PARENT ID CHILD ID EXAM TUDA12802 TUDA12982 N TUDA12982 TUDA12984 J TUDA12984 TUD
  • APEX 安装失败,PLS-00201:必须声明标识符“SYS.DBMS_DB_VERSION”

    尝试在 Oracle XE 18c 数据库上安装 Oracle APEX 20 2 如下官方说明 https docs oracle com en database oracle application express 20 1 htmig
  • Oracle:如何确定“AFTER ALTER”触发器中对象的新名称?

    假设我有一个AFTER ALTER在我的 Oracle 数据库上触发并重命名一些数据库对象 ALTER RENAME TO 在触发器中 我如何确定new数据库对象的名称 看来ORA DICT OBJ OWNER ORA DICT OBJ N
  • Delphi 5 中的 Oracle 数据库连接

    我正在使用 Delphi 5 版本 我想连接到 Oracle 数据库 我有 TDatabase 组件 我不知道如何通过 Delphi 连接到数据库 请提供连接数据库的步骤 谢谢 The TDatabase http docwiki emba
  • SQL 国家字符 (NCHAR) 数据类型的真正用途是什么?

    也CHAR CHARACTER and VARCHAR CHARACTER VARYING SQL 提供了NCHAR NATIONAL CHARACTER and NVARCHAR NATIONAL CHARACTER VARYING 类型
  • 在 Oracle 行的多个列上使用透视

    我在 Oracle 表中有以下示例数据 tab1 我正在尝试将行转换为列 我知道如何在某一列上使用 Oracle 数据透视表 但是否可以将其应用于多个列 样本数据 Type weight height A 50 10 A 60 12 B 4
  • Oracle 中的日期字符串(以毫秒为单位)

    我想将以下字符串转换为日期 2004 09 30 23 53 48 140000000 I tried to date YYYY MM DD HH24 MI SS FF9 But PL SQL http en wikipedia org w
  • 在 Hibernate 中创建 UPDATE RETURNING 查询

    在 Oracle 中 我们可以创建一个更新查询 该查询将使用 RETURNING 子句返回更新的记录 Hibernate中有类似的功能吗 除了数据库生成的值之外 Hibernate 显然不需要返回更新的实例 因为对象传递给Session s

随机推荐

  • Spring 新版本修复远程命令执行漏洞(CVE-2022-22965),墨菲安全开源工具可应急排查

    漏洞简述 3月31日 spring 官方通报了 Spring 相关框架存在远程代码执行漏洞 并在 5 3 18 和 5 2 20 RELEASE 中修复了该漏洞 漏洞评级 严重 影响组件 org springframework spring
  • 测试IP和端口是否被封锁

    操作 将自己IP和端口分别输入以下两个网站的测试栏中 国内测试 http tool chinaz com port 国外测试 https www yougetsignal com tools open ports 判断 如果国内的显示关闭
  • UnityUI炸出金币再收集的特效

    完成的效果 在指定位置生成一定数量的货币ICON 然后扩散出去 等待一定时间后 汇集到指定位置 代码 using System Collections using System Collections Generic using Unity
  • SQL笛卡尔积(×)、连接(∞)、投影(π)、选择(σ)关系符号

    笛卡尔积 连接 投影 选择 由 R 中的每一个元组与 S 中的每一个元组两两相连 把R和S的元组以所有可能的方式组合起来 合并为 R S 的元组 形式化定义如下 笛卡尔积 笛卡尔积 与连接 连接运算是从两个关系的广义笛卡尔积中选取属性间满足
  • 《大型网站技术架构设计》第二篇 架构-性能

    不同视角下的网站性能 1 用户 从用户角度 网站性能就是用户在浏览器上直观感受到的网站响应速度快还是慢 用户感受到的时间 2 开发人员 开发人员关注的主要是应用程序本身及其相关子系统的性能 包括响应延迟 系统吞吐量 并发处理能力 系统稳定性
  • openwrt软路由重置firstboot重启reboot关机poweroff

    重置 恢复出厂设置 先执行firstboot命令 再执行reboot命令 过了几秒钟才会响应 重启设备 执行reboot命令 设备关机 执行poweroff命令
  • 林木的第一篇博客——A New Beginning

    大家好 我是一名就读于TAYLOR S UNIVERSITY 的学生 大学主专业是计算机科学 很高兴认识大家 从今天开始我将开始学习C语言 以及跟计算机有关的一切 并在每周天把心得和知识分享出来 和大家一起学习进步 很荣幸跟大家一起学习 1
  • “千年虫”,计算机的巨大BUG!

    作者 十三侃娱乐 说起来 现在社会科技中 除了真正学过计算机专业的人 大部分人对于 千年虫 这个称号都有些陌生 甚至有些人连听都没听过 不知道的网友听到 虫 这个字可能还会脑补出一大堆不明生物的样子 但其实 千年虫 并不是一种生物 而是一种
  • LitCTF部分题目WP(Virginia,ping,SQL)

    目录 校外 Virginia ping 这是什么 SQL 注一下 校外 Virginia 维吉尼亚 想到维吉尼亚解码但没有key就爆破key Vigenere Solver guballa de key flag 发现解码出来的还有一部分是
  • 六边形地图生成(1)——基础地形

    看了大佬的六边形地图教程 跟着原教程敲了一遍代码 使用的引擎是unity 想把六边形地形的生成思路记录下来 1 基础六边形网格 基础网格很容易绘制 六个边缘点 一个中心点 如何在引擎中绘制动态网格网上一搜一大把 这里就不介绍了 2 边缘扰动
  • maya中adv插件绑定1

    一 导入模型 复制ctrl D 添加名称前缀 创建混合变形 平行选项 二 摆放adv骨骼 最好模型单独创建一个层 导入adv骨骼 1 对齐骨骼 腿部 最好是在正交视图下操作 2 对齐手臂部分 对齐到手腕即可 手指不用对 3 对齐头部 小技巧
  • Qt 实现鼠标拖动控件

    在QT项目中 窗口设置 setWindowFlags Qt FramelessWindowHint 之后 就无法拖动 所以会自定义一个menubar控件 并实现窗口拖动 效果如上图 上代码 include
  • 经典C语言程序之 C/C++:计算两个整数的和

    经典C语言程序之 C C 计算两个整数的和 在C C 编程中 计算两个整数的和是一个经典的问题 本文将介绍如何使用C语言编写一个简单的程序来实现这一功能 首先 我们需要定义两个整数变量来存储用户输入的值 并用scanf函数从用户处获取这些值
  • VSCode如何设置终端工作目录

    文章目录 前言 固定工作目录 Terminal Here 注意 前言 相信大家在使用VSCode的时候 都会有如下难受的感觉 每次打开终端的时候工作目录都是用户目录 如果要执行命令还得cd到当前文件夹 十分麻烦 为了提高工作效率 有必要设置
  • 算法------大整数

    大整数 1 大整数加法 include
  • freebsd 做文件服务器,freebsd文件服务器

    freebsd文件服务器 内容精选 换一换 FTP SFTP连接适用于从线下文件服务器或ECS服务器上迁移文件到OBS或数据库 当前仅支持Linux操作系统的FTP 服务器 连接FTP或SFTP服务器时 他们的连接参数相同 如表1所示 FT
  • <Linux开发>linux开发工具- 之-开发使用linux命令记录

    Linux开发 linux开发工具 之 开发使用linux命令记录 本文章主要记录开发过程中涉及使用的linux命令 1 查看磁盘大小分区情况 命令 df hl 可查看分区的路径 及空间大小使用情况 以及挂在点位置 2 查看指定目录文件的大
  • unity点击按钮,弹出image和Text做的弹出框

    让弹出框开始不显示 点击按钮后显示 在Hierarchy面板上新建Image 下面我命名为win 再在上面放置Image和Text组成弹出框 如下图 建立一个Message脚本 using System Collections using
  • [毕业设计]C++程序类内聚度的计算与存储

    目录 前言 课题背景和意义 实现技术思路 实现效果图样例 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个学校要求的毕设项目越来越难 有不少课题是研究生级别难度
  • PLSQL 基础语法

    01 PLSQL 语法 变量 if loop cursor exception 1 语法 在数据库服务器上保存的打断可执行方法 供其他开发人员调用 可以有效的减少数据库端和服务端的数据交互 提高效率 降低带宽消耗 语法格式 declare