PL/SQL详述

这篇具有很好参考价值的文章主要介绍了PL/SQL详述。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.PL/SQL简介

PL/SQL语言(Procedural Language/SQL,过程化SQL语言)是Oracle推出的过程化的SQL编程语言,使用PL/SQL可以为SQL语言引入结构化的程序处理能力,例如可以在PL/SQL中定义常量、变量、游标、存储过程等,可以使用条件、循环等流程控制语句。

PL/SQL的这种特性使得开发人员可以在数据库中添加业务逻辑,并且由于业务逻辑与数据均位于数据库服务器端,比客户端编写的业务逻辑能提供更好的性能。

PL/SQL是一种块结构的语言,它将一组语句放在一个块中,一次性发送给服务器,PL/SQL引擎分析收到的PL/SQL语句块中的内容,把其中的过程控制语句由PL/SQL引擎自身去执行,把PL/SQL块中的SQL语句交给服务器的SQL语句执行器执行。

PL/SQL块发送给服务器后,先被编译然后执行,对于有名称的PL/SQL块(如存储过程、函数、触发器、程序包)可以单独编译,永久的存储在数据库中,随时准备执行。

两个注意点:

1.在 END; 结束符的下一行开头加“/”作为结束标志。

2.运行    SET SERVEROUTPUT ON;   语句。激活dbms_output包。 

2.PL/SQL程序结构:(仅展示代码部分)

PL/SQL程序结构_月应是绝色306的博客-CSDN博客https://blog.csdn.net/qq_62687015/article/details/128119296?spm=1001.2014.3001.5501

--变量的定义和初始化。
SET SERVEROUTPUT ON;
DECLARE  --声明部分标识
	v_job VARCHAR2(9);
	v_count BINARY_INTEGER DEFAULT 0;
	v_total_sal NUMBER(9,2):=0;
	v_date DATE:=SYSDATE;
	c_tax_rate CONSTANT NUMBER(3,2):=8.25;
	v_valid BOOLEAN NOT NULL:=TRUE;
	BEGIN
		v_job:='MANAGER';    --在程序中赋值
		DBMS_OUTPUT.PUT_LINE(v_job);    --输出变量v_job的值
		DBMS_OUTPUT.PUT_LINE(v_count);  --输出变量v_count的值
		DBMS_OUTPUT.PUT_LINE(v_date);   --输出变量v_date的值
		DBMS_OUTPUT.PUT_LINE(c_tax_rate);  --输出变量c_tax_rate的值
	END;


--使用SELECT INTO语句赋值变量
SET SERVEROUTPUT ON;
DECLARE  --声明部分标识
	v_job VARCHAR2(9);
	v_count BINARY_INTEGER DEFAULT 0;
	v_total_sal NUMBER(9,2):=0;
	v_date DATE:=SYSDATE;
	c_tax_rate CONSTANT NUMBER(3,2):=8.25;
	v_valid BOOLEAN NOT NULL:=TRUE;

	BEGIN
		SELECT 'MANAGER' INTO v_job FROM dual;
		DBMS_OUTPUT.PUT_LINE(v_job);    --输出变量v_job的值
	END;


--根据职员表emp计算7788号职员的奖金。奖金的计算方法是:职员的工资(sal) *15%。
DECLARE 
  bonus_rate  CONSTANT NUMBER(2,2) :=0.15;
  bonus        NUMBER(7,2);
  emp_id       NUMBER(4)  := 7788; 
BEGIN
  SELECT sal * bonus_rate INTO bonus FROM  emp
    WHERE empno= emp_id;
    DBMS_OUTPUT.PUT_LINE ( 'Employee: ' || TO_CHAR(emp_id)|| ' Bonus: ' || TO_CHAR(bonus) || ' Bonus Rate: ' || TO_CHAR(bonus_rate)); 
END;
--程序输出结果为:
--Employee: 7788 Bonus: 450 Bonus Rate: .15
--根据表中字段定义变量。
DECLARE
	v_ename emp.ename%TYPE;--根据字段定义变量
BEGIN
	SELECT ename INTO v_ename FROM emp 
    WHERE empno=7788;
	DBMS_OUTPUT.PUT_LINE(v_ename);   --输出变量的值
END;

3. PL/SQL控制结构

oracle选择结构和循环结构_月应是绝色306的博客-CSDN博客https://blog.csdn.net/qq_62687015/article/details/128120847?spm=1001.2014.3001.5501

--判断emp表中记录是否超过20条,10-20之间,或者10条以下。
DECLARE
  --声明变量接受emp表中的记录数
  V_COUNT NUMBER;
BEGIN
  --查询emp表中的记录数赋值给变量
  SELECT COUNT(*) INTO V_COUNT FROM EMP;
  --判断打印
  IF V_COUNT > 20 THEN
    DBMS_OUTPUT.PUT_LINE('EMP表中的记录数超过了20条为:' || V_COUNT || '条。');
  ELSIF V_COUNT >= 10 THEN
    DBMS_OUTPUT.PUT_LINE('EMP表中的记录数在10~20条之间为:' || V_COUNT || '条。');
  ELSE
    DBMS_OUTPUT.PUT_LINE('EMP表中的记录数在10条以下为:' || V_COUNT || '条。');
  END IF;
END;

pl/sql,oracle数据库(含sql语句),sql,数据库,oracle

pl/sql,oracle数据库(含sql语句),sql,数据库,oracle 

 

pl/sql,oracle数据库(含sql语句),sql,数据库,oracle 

pl/sql,oracle数据库(含sql语句),sql,数据库,oracle

4.游标 

游标:是系统开设的一个数据缓冲区,存放SQL语句的执行结果。  

作用:用户可通过游标获取记录,并赋给变量。

当对数据库的查询操作返回一组结果集时,存入游标,以后通过对游标的操作来获取结果集中的数据信息。

游标分:显式游标和隐式游标。当查询语句返回多条记录时,必须显式地定义游标以处理每一行。其他的SQL语句(更新操作或查询操作只返回一条记录)都使用隐式游标。

 pl/sql,oracle数据库(含sql语句),sql,数据库,oracle

游标是用于临时存储一个查询返回的多行数据,通过遍历游标,可以逐行访问处理该结果集的数据。 

游标的使用方式:声明--->打开--->读取--->关闭

pl/sql,oracle数据库(含sql语句),sql,数据库,oracle 

游标的定义:
--CURSOR <游标名> IS <SQL语句>;
--例:
CURSOR c_emp IS SELECT * FROM emp WHERE dno=3; 

--当需要操作结果集时,须完成:打开游标、使用FETCH语句将游标里的数据取出以及关闭游标操作。
--游标声明:
	CURSOR  游标名 IS 查询语句;
--游标的打开:
	OPEN 游标名;
--游标的取值:
	FETCH 游标名 INTO 变量列表;
--游标的关闭:
	CLOSE 游标名;
--使用游标查询emp表中所有员工的姓名和工资,并将其依次打印出来。:
DECLARE
  CURSOR c_emp IS 	--声明游标
  SELECT ename, sal FROM emp;	 --声明变量用来接受游标中的元素
  v_ename emp.ename%TYPE;
  v_sal emp.sal%TYPE;
  BEGIN
  OPEN c_emp;	 --打开游标
  LOOP	--遍历游标中的值
  FETCH c_emp into v_ename, v_sal ; 	 --通过FETCH语句获取游标中的值并赋值                      EXIT WHEN c_emp%NOTFOUND; 	--判断是否有值,有值打印,没有则退出循环
  DBMS_OUTPUT.PUT_LINE('姓名:' || v_ename || ',薪水:' || v_sal)
  END LOOP;
  CLOSE c_emp;	 --关闭游标
  END;

--使用游标查询并打印某部门的员工的姓名和薪资,部门编号为运行时手动输入。
DECLARE
  CURSOR c_emp(v_empno emp.empno%TYPE) IS
    SELECT ename, sal FROM emp WHERE empno = v_empno;
  v_ename emp.ename%TYPE;
  v_sal emp.sal%TYPE;
  BEGIN
  OPEN c_emp(10);	 --打开游标
  LOOP	--遍历游标中的值
  FETCH c_emp INTO v_ename, v_sal ; 	 --通过FETCH语句获取游标中的值并赋值            
  EXIT  WHEN c_emp%NOTFOUND; 	--判断是否有值,有值打印,没有则退出循环
  DBMS_OUTPUT.PUT_LINE('姓名:' || v_ename || ',薪水:' || v_sal)
  END LOOP;
  CLOSE c_emp;	 --关闭游标
  END;

带锁游标: PL/SQL提供了一种加锁后删除或更新游标中刚取出那条记录的方法。

要想操纵数据库中的数据,在定义游标的查询语句时,必须加上FOR UPDATE子句,表示要先对表加锁;然后在UPDATE或DELETE语句中加上WHERE CURRENT OF子句,指定从游标工作区中取出的当前行需要被更新或删除。当会话打开一个带FOR UPDATE子句的游标时,在游标区中的所有行拥有一个行级排他锁,其他对话只能查询,不能更新或删除。

实例:为emp表的员工增加10%的工资,总额限制在90万元以内。

pl/sql,oracle数据库(含sql语句),sql,数据库,oracle

5.存储过程与存储函数: 

PLSQL编程——存储过程_月应是绝色306的博客-CSDN博客https://blog.csdn.net/qq_62687015/article/details/128124551?spm=1001.2014.3001.5501Oracle 函数_月应是绝色306的博客-CSDN博客https://blog.csdn.net/qq_62687015/article/details/128154882?spm=1001.2014.3001.5501

查询并打印某个员工的姓名和薪水(有参)
--创建存储过程
CREATE OR REPLACE PROCEDURE P_QUERYNAMEANDSAL(i_empno IN 	emp.empno%TYPE) IS 		 --声明变量接受查询结果
 	 v_ename emp.ename%TYPE;
 	 v_sal   emp.sal%TYPE;
BEGIN
	SELECT ename, sal INTO v_ename, v_sal from emp WHERE empno = i_empno;   		--根据用户传递的员工号查询姓名和薪水
	DBMS_OUTPUT.PUT_LINE('姓名:' || v_ename || ',薪水:' || v_sal); 	 --打印结果
END;

--调用存储过程
call P_QUERYNAMEANDSAL(7839)


--输入员工号查询某个员工信息,将薪水作为返回值输出,给调用的程序使用(带有输出参数)
--创建存储过程
CREATE OR REPLACE PROCEDURE P_QUERYSAL_OUT(i_empno IN 	emp.empno%TYPE,o_sal OUT emp.sal%TYPE) IS
	BEGIN
  	SELECT sal INTO o_sal FROM emp WHERE empno = i_empno;
	END;

--调用存储过程
DECLARE
  	v_sal emp.sal%TYPE;	 --声明一个变量接受存储过程的输出参数
BEGIN
  	P_QUERYSAL_OUT(7839, v_sal); 	--注意参数的顺序
  	DBMS_OUTPUT.PUT_LINE(v_sal);
END;

pl/sql,oracle数据库(含sql语句),sql,数据库,oracle 

6.触发器

--在 emp表上创建一个触发器,该触发器是一个行级触发器。
--当对 emp表的某职员sal工资列修改后,会引发该触发器并在审计表e_audit中写一条记录。
--(1) 首先创建存放审计记录的表e_audit。
CREATE TABLE e_audit
(audit_id NUMBER(4),up_date DATE,new_sal NUMBER(7,2),
old_sal NUMBER(7,2) );
--(2) 再创建触发器audit_sal。
CREATE OR REPLACE TRIGGER audit_sal
AFTER UPDATE OF sal ON  emp 
FOR EACH ROW
BEGIN
  INSERT INTO e_audit VALUES( :OLD.empno, SYSDATE,:NEW.sal,:OLD.sal); 
  -- 在行触发器中,被修改记录的每列都有两个相关名称,对应旧值和新值。:OLD.<属性名>和:NEW<属性名>
END;

pl/sql,oracle数据库(含sql语句),sql,数据库,oracle 

--操作相关表,使得某部门职工的薪水增加15%。
--给指定部门的员工加薪,首先要把该部门的员工选出来,再对这些员工的薪水进行改动。
--这里用存储过程表示,将要加薪的部门作为参数:
CREATE OR REPLACE PROCEDURE add_sal (deptname varchar2)
AS   
BEGIN
        UPDATE emp
        SET emp.salary=emp.salary*1.15 
        WHERE emp.eno IN
        (SELECT eno 
        FROM dept 
        WHERE dname= deptname);
END ; 

--利用触发器建立追踪
--通过对emp表的salary属性创建一个触发器,来监视其更新并进行记录,以追踪薪水变动情况:
CREATE OR REPLACE TRIGGER salary_change  
BEFORE DELETE OR INSERT OR UPDATE ON emp       --触发事件
FOR EACH ROW                -- 每更新一行都需要调用此触发器
DECLARE     --只有触发器的声明需要DECLARE,过程和函数都不要
      salary1 NUMBER;
BEGIN                        --:new与:old分别代表该行在修改前、改后的记录                  
      salary1=:new.salary - old.salary;
      DBMS_OUTPUT.PUT_LINE('old salary is:'|| :old.salary);
      DBMS_OUTPUT.PUT_LINE('new salary is:'|| :new.salary);       
      DBMS_OUTPUT.PUT_LINE('add is:'||to_char(salary1)); 
END ; 

 文章来源地址https://www.toymoban.com/news/detail-632514.html

到了这里,关于PL/SQL详述的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 教你如何通过内网穿透轻松实现PL/SQL远程连接Oracle数据库【内网穿透】

    转发自CSDN远程穿透的文章:公网远程连接Oracle数据库【内网穿透】 Oracle,是甲骨文公司的一款关系数据库管理系统,它在数据库领域一直处于领先地位。可以说Oracle数据库系统是世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、

    2024年02月03日
    浏览(56)
  • 异地访问Oracle数据库的解决方案:利用内网穿透实现PL/SQL远程连接的建议与步骤

    ​ 小月糖糖主页 在强者的眼中,没有最好,只有更好。 移动开发领域优质创作者,阿里云专家博主 Oracle,是甲骨文公司的一款关系数据库管理系统,它在数据库领域一直处于领先地位。可以说Oracle数据库系统是世界上流行的关系数据库管理系统,系统可移植性好、使用方便

    2024年02月11日
    浏览(48)
  • PL/SQL详述

    PL/SQL语言(Procedural Language/SQL,过程化SQL语言)是Oracle推出的过程化的SQL编程语言,使用PL/SQL可以为SQL语言引入结构化的程序处理能力,例如可以在PL/SQL中定义常量、变量、游标、存储过程等,可以使用条件、循环等流程控制语句。 PL/SQL的这种特性使得开发人员可以在数据库

    2024年02月14日
    浏览(29)
  • 【Oracle 数据库 SQL 语句 】积累1

    : grouping sets ((分组字段1,分组字段2),()) : coalesce合并多个字段,显示第一个不为null的值

    2024年02月13日
    浏览(58)
  • 用SQL语句操作Oracle数据库——数据更新

    数据库中的数据更新操作有3种:1)向表中添加若干行数据(增);2)删除表中的若干行数据(删);3)修改表中的数据(改)。对于这3种操作,SQL语言中有3种相应的语句与之对应。接下来让我们逐一详细地了解一下。 本文我们依然使用以下三个表来进行数据更新操作:

    2024年01月19日
    浏览(64)
  • Oracle系列十一:PL/SQL

    PL( Procedural Language)/SQL是一种程序设计语言,用于编写Oracle数据库的存储过程、触发器、函数等对象,还还支持面向对象编程(OOP)和动态SQL,可提高开发效率和应用程序的可维护性。 PL/SQL结合了SQL语句和通用程序设计语言的特性,可实现复杂的数据操作和业务逻辑。与

    2024年02月02日
    浏览(48)
  • Oracle之 第三篇 PL/SQL基础

    目录 Oracle之  第三篇  PL/SQL基础 PL/SQL程序块  PL/SQL语言 PL/SQL的基本结构   PL/SQL块分类    一、PL/SQL语言 二、PL/SQL 常量 、变量    合法字符 数据类型 LOB  数据类型  属性类型   运算符 常量    PL/SQL常量 1 、变量的声明        2、属性类型 % type 变量赋值 %type和%rowtype区

    2024年02月02日
    浏览(56)
  • Oracle-PL/SQL中条件顺序判断

    目录 一、IF语句 1.1IF-THEN 组合 1.2IF-THEN-ELSE 组合 1.3 IF-THEN-ELSIF 组合 1.4区别/注意 1.4.1IF-THEN-ELSIF 和 IF-THEN-ELSE 的区别 1.4.2注意 1.5嵌套 IF 语句 二、 CASE语句 2.1简单的CASE语句 2.2搜索型CASE语句 2.3嵌套的CASE语句 2.4区别 在 Oracle 数据库中,可以使用多种条件和顺序控制语句来实现程

    2024年02月07日
    浏览(49)
  • Oracle/PL/SQL奇技淫巧之ROWNUM伪列

    ROWNUM 是一个伪列,它是根据每次查询的结果动态生成的一列递增编号,表示 Oracle 从表中选择该行的顺序,选择的第一行 ROWNUM 为1,第二行 ROWNUM 为2,以此类推。 ROWNUM 伪列是在 WHERE 子句之前生成的,就是说它并不是在执行了 WHERE 子句过滤之后再对数据编号 比如在执行 WHE

    2024年02月12日
    浏览(41)
  • Oracle/PL/SQL奇技淫巧之Json转表

    在Oracle中,有些时候我们需要在一个json文档中查数据 这个时候我们可以通过 JSON_TABLE 函数来把 json文档 提取成一张可以执行正常查询操作的表 先看 JSON_TABLE 函数的基础用法: 其中: json_data :要从中提取数据的 JSON文档 或 JSON列 $.json_path :JSON路径表达式,该表达式指定要提

    2024年02月12日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包