PL/SQL语言、PL/SQL中的程序控制、PL/SQL存储过程

文章目录

  • PL/SQL语言
  • PL/SQL中的程序控制
  • PL/SQL存储过程

PL/SQL语言

PL/SQL的基本概念

PL/SQL也是一种程序语言,叫做过程化SQL语言。PL/SQL是Oracle数据库对SQL语句的扩展。在普通SQL语句的使用上增加了编程语言的特点,所以PL/SQL把数据库和查询语句组织在PL/SQL代码的过程性单元中,通过逻辑判断、循环等操作实现复杂的功能或者计算。PL/SQL只有Oracle数据库有。

DEMO:第一个pl/sql程序

BEGIN --表示开始过程
  NULL;---过程代码
END;--过程结束
/

运行结果如下:
PL/SQL语言、PL/SQL中的程序控制、PL/SQL存储过程_第1张图片
DEMO:输出hello world

SET SERVEROUTPUT ON;//开启打印功能
BEGIN
   DBMS_OUTPUT.put_line('hello world');
END;
/

定义变量
DECLARE 
    v_num NUMBER;
BEGIN
    DBMS_OUTPUT.put_line('变量的值是:'||v_num);
END;
/

运行结果如下:
PL/SQL语言、PL/SQL中的程序控制、PL/SQL存储过程_第2张图片
PL/SQL语言、PL/SQL中的程序控制、PL/SQL存储过程_第3张图片
DEMO:为变量赋值

DECLARE
   v_num NUMBER;
BEGIN 
    v_num:=30;
    DBMS_OUTPUT.put_line('变量的值是:'||v_num);
END;
/

运行结果如下:
PL/SQL语言、PL/SQL中的程序控制、PL/SQL存储过程_第4张图片
DEMO:还可以给变量设置默认值

DECLARE 
    v_num NUMBER:=100;
BEGIN
    DBMS_OUTPUT.put_line('变量的值是:'||v_num);
END;
/

运行结果如下:
PL/SQL语言、PL/SQL中的程序控制、PL/SQL存储过程_第5张图片
DEMO:根据雇员的编号查询出雇员的名字(而且要求编号从键盘输入)

DECLARE 
    v_empno NUMBER;
    v_ename VARCHAR2(10);
BEGIN
    DBMS_OUTPUT.put_line('请输入雇员的编号!');
    v_empno:=&empno;
    SELECT ename INTO v_ename
      FROM emp
        WHERE empno=v_empno;
    DBMS_OUTPUT.put_line('编号是:'||v_empno||',雇员的名字是:'||v_ename);
END;
/

运行结果如下:
PL/SQL语言、PL/SQL中的程序控制、PL/SQL存储过程_第6张图片

PL/SQL中的程序控制

DEMO:为变量设置默认值

DECLARE 
  v_empno NUMBER NOT NULL:='7788';
BEGIN 

   DBMS_OUTPUT.put_line('编号是:'||v_empno);
END;
/

DEMO:定义常量

DECLARE
  v_empno CONSTANT NUMBER;
BEGIN
  DBMS_0UTPUT.put_line('编号是:'||v_empno);
END;
/

运行结果如下:
PL/SQL语言、PL/SQL中的程序控制、PL/SQL存储过程_第7张图片

DECLARE
  v_empno CONSTANT NUMBER:=7788;--常量必须有初始值
BEGIN
  DBMS_OUTPUT.put_line('编号是:'||v_empno);
END;
/

运行结果如下:
PL/SQL语言、PL/SQL中的程序控制、PL/SQL存储过程_第8张图片

常量使用CONSTANT修饰,必须有初始化值

DEMO:常量不能改变

DECLARE 
  v_empno CONSTANT NUMBER:=7788;
BEGIN
  v_empno:=7369;
  DBMS_OUTPUT.put_line('编号是:'||v_empno);
END;
/

运行结果如下:
PL/SQL语言、PL/SQL中的程序控制、PL/SQL存储过程_第9张图片

此时表明常量不能重新赋值的。

DEMO:使用%TYPE定义变量的类型

DECLARE
  v_empno  emp.empno%TYPE;
  v_ename  emp.ename%TYPE;
BEGIN
  DBMS_OUTPUT.put_line('请输入编号:');
  v_empno:=&empno;
  SELECT ename INTO v_ename
    FROM emp
      WHERE empno=v_empno;
  DBMS_OUTPUT.put_line('编号是:'||v_empno||',姓名是:'||v_ename);
END;
/

运行结果如下 :
PL/SQL语言、PL/SQL中的程序控制、PL/SQL存储过程_第10张图片

“表名.字段名%TYPE”:让变量的类型为指定的表的字段的类型

DEMO:使用%ROWTYPE声明变量

DECLARE
 v_empno emp.empno%TYPE;--表示该变量的类型是emp数据表中的empno字段的类型(NUMBER)
 v_result emp%ROWTYPE;--表示该变量可以接收查询到的所有字段的数据
BEGIN
  DBMS_OUTPUT.put_line('请输入编号:');
  v_empno:=&empno;
  SELECT * INTO v_result
    FROM emp
      WHERE empno=v_empno;
  DBMS_OUTPUT.put_line('编号是:'||v_empno||',姓名是:'||v_result.ename||',职位:'
||v_result.job||',部门编号:'||v_result.deptno);
END;
/

代码运行结果如下:
PL/SQL语言、PL/SQL中的程序控制、PL/SQL存储过程_第11张图片
DEMO:IF使用

DECLARE 
  v_count NUMBER;
BEGIN
 SELECT COUNT(*) 人数 INTO v_count
  FROM emp;
 IF v_count>10 THEN
    DBMS_OUTPUT.put_line('数据量大于10');
 END IF;--表示if结束
END;--过程结束
/

运行结果如下:
PL/SQL语言、PL/SQL中的程序控制、PL/SQL存储过程_第12张图片
DEMO:if else

DECLARE 
  v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count
  FROM emp
    WHERE job='SALESMAN';
  IF v_count>10 THEN
    DBMS_OUTPUT.put_line('数据量大于10');
  ELSE 
    DBMS_OUTPUT.put_line('数据量小于或等于10');
  END IF;
END;
/

运行结果如下:
PL/SQL语言、PL/SQL中的程序控制、PL/SQL存储过程_第13张图片
DEMO:多if结构

DECLARE
  v_count NUMBER;
BEGIN
  SELECT COUNT(*) INTO v_count
    FROM emp
     WHERE job='SALESMAN';
  IF v_count>10 THEN
    DBMS_OUTPUT.put_line('数据量大于10');
  ELSIF v_count<10 THEN
    DBMS_OUTPUT.put_line('数据量小于10');
  ELSE
    DBMS_OUTPUT.put_line('数据量等于10');
  END IF;
END;
/

运行结果如下:
PL/SQL语言、PL/SQL中的程序控制、PL/SQL存储过程_第14张图片

PL/SQL存储过程

存储过程procedure是一组为了完成特定功能的SQL语句集合,之前的pl/sql只能编写一次执行一次或者多次,但是不能将其保存起来下一次使用,关闭窗口之后pl/sql语句就失效了。通过经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来调用。存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接受参数、输出参数、返回单个或多个结果集以及返回值。

DEMO:创建过程

CREATE OR REPLACE PROCEDURE hello_say
AS
BEGIN
   DBMS_OUTPUT.put_line('hello world');
END;
/

代码执行结果如下:
PL/SQL语言、PL/SQL中的程序控制、PL/SQL存储过程_第15张图片

此时就表示创建了一个过程,之后可以通过过程名称hello_say来调用

DEMO:调用过程(使用pl/sql)

BEGIN 
  hello_say();
END;
/

DEMO:使用命令执行存储过程
EXEC hello_say();

代码调用结果如下:
PL/SQL语言、PL/SQL中的程序控制、PL/SQL存储过程_第16张图片
DEMO:有参数的存储过程

CREATE OR REPLACE PROCEDURE pro_count(
    a NUMBER,
    b NUMBER
)
AS
BEGIN
  DBMS_OUTPUT.put_line('a+b='||(a+b));
END;
/

EXEC pro_count(20,30);

代码运行结果如下:
PL/SQL语言、PL/SQL中的程序控制、PL/SQL存储过程_第17张图片
DEMO:如果不传递参数

BEGIN 
  pro_count();
END;
/

代码运行结果如下:
PL/SQL语言、PL/SQL中的程序控制、PL/SQL存储过程_第18张图片
DEMO:给参数设定默认值

CREATE OR REPLACE PROCEDURE pro_count(
  a NUMBER:=500,
  b NUMBER:=300
)
AS
BEGIN
  DBMS_OUTPUT.put_line('a+b='||(a+b));
END;
/

EXEC pro_count();

代码运行结果如下:
PL/SQL语言、PL/SQL中的程序控制、PL/SQL存储过程_第19张图片
DEMO:存储过程的局部变量

CREATE OR REPLACE PROCEDURE proc_count(
   a NUMBER:=300,
   b NUMBER:=700)
AS
   result NUMBER;
BEGIN
   result:=a+b;
   DBMS_OUTPUT.put_line('a+b='||result);
END;
/

EXEC proc_count(20,30);

代码运行结果如下:
PL/SQL语言、PL/SQL中的程序控制、PL/SQL存储过程_第20张图片
DEMO:存储过程的输出和输入参数

CREATE OR REPLACE PROCEDURE proc_count(
   a IN NUMBER:=30,
   b IN NUMBER:=70,
   c OUT NUMBER
)
AS

BEGIN
   c:=a+b;

END;
/
DECLARE
  r NUMBER;--声明全局变量
BEGIN
  proc_count(20,30,r);
  DBMS_OUTPUT.put_line('r的值是:'||r);
END;
/

代码运行结果如下:
PL/SQL语言、PL/SQL中的程序控制、PL/SQL存储过程_第21张图片

IN修饰则表示该参数需要在调用的时候传递进来,OUT修饰的参数则表示可以被返回,如果不写默认就是IN。

你可能感兴趣的:(原创)