关键词搜索

源码搜索 ×
×

Oracle QL/SQL 的基本语法

发布2020-05-30浏览1488次

详情内容

一、什么是PL/SQL ?

PL/SQL(Procedure Language/SQL)
PL/SQL 是 Oracle 对 sql 语言的过程化扩展,指在 SQL 命令语言中增加了过程处理语句(如分支、循
环等),使 SQL 语言具有过程处理能力。把 SQL 语言的数据操纵能力与过程语言的数据处理能力结合
起来,使得 PLSQL 面向过程但比过程语言简单、高效、灵活和实用。

范例 1: 为职工涨工资,每人涨 10%的工资。update emp set sal=sal*1.1
范例 2:按职工的职称长工资,总裁涨 1000 元,经理涨 800 元,其他人员涨 400 元。
这样的需求我们就无法使用一条 SQL 来实现,需要借助其他程序来帮助完成,也可以使用 pl/sql。

pl/sql 编程语言是对 sql 语言的扩展,使得 sql 语言具有过程化编程的特性。
pl/sql 编程语言比一般的过程化编程语言,更加灵活高效。
pl/sql 编程语言主要用来编写存储过程和存储函数等。

二、pl/sql 程序语法

程序语法:

declare
	说明部分 (变量说明, 游标申明,例外说明 〕
begin
	语句序列 (DML 语句〕 …
exception
	例外处理语句
End;

    1. 常量和变量定义

    在程序的声明阶段可以来定义常量和变量。

    • 变量的基本类型就是 oracle 中的建表时字段的变量如 char, varchar2, date, number,
      boolean, long
      在这里插入图片描述
    • 引用变量
      在这里插入图片描述
    • 记录型变量
      在这里插入图片描述
    ---赋值操作可以使用:=也可以使用into查询语句赋值
    declare
        i number(2) := 10;
        s varchar2(10) := '小明';
        ena emp.ename%type;---引用型变量
        emprow emp%rowtype;---记录型变量
    begin
        dbms_output.put_line(i);
        dbms_output.put_line(s);
        select ename into ena from emp where empno = 7788;
        dbms_output.put_line(ena);
        select * into emprow from emp where empno = 7788;
        dbms_output.put_line(emprow.ename || '的工作为:' || emprow.job);
    end;
    
      8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    2. if 分支

    语法 1:
    	IF 条件 THEN 语句 1;
    		语句 2;
    		END IF;
    
    语法 2:
    	IF 条件 THEN 语句序列 1;
    		ELSE 语句序列 2;
    		END IF;
    		
    语法 3:
    	IF 条件 THEN 语句;
    	ELSIF 语句 THEN 语句;
    		ELSE 语句
    		END IF;
    
      8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 范例 1:如果从控制台输入 1 则输出我是 1
      在这里插入图片描述
    • 范例 2: 如果从控制台输入 1 则输出我是 1 否则输出我不是 1
      在这里插入图片描述
    • 范例 3:判断人的不同年龄段 18 岁以下是未成年人, 18 岁以上 40 以下是成年人, 40 以上是老年人
      在这里插入图片描述
    ---输入小于18的数字,输出未成年
    ---输入大于18小于40的数字,输出中年人
    ---输入大于40的数字,输出老年人
    declare
      i number(3) := ⅈ
    begin
      if i<18 then
        dbms_output.put_line('未成年');
      elsif i<40 then
        dbms_output.put_line('中年人');
      else
        dbms_output.put_line('老年人');
      end if;
    end;
    
      8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    3. LOOP 循环语句

    语法 1:
    	WHILE total <= 25000 LOOP
    	.. .
    	total : = total + salary;
    	END LOOP;
    
    语法 2:
    	Loop
    	EXIT [when 条件];
    	……
    	End loop
    	
    语法 3:
    	FOR I IN 1 . . 3 LOOP
    	语句序列 ;
    	END LOOP ;
    
      8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 范例:使用语法 1 输出 1 到 10 的数字
      在这里插入图片描述
    • 范例:使用语法 2 输出 1 到 10 的数字
      在这里插入图片描述
    • 范例:使用语法 3 输出 1 到 10 的数字
      在这里插入图片描述
    ---用三种方式输出110是个数字
    ---while循环
    declare
      i number(2) := 1;
    begin
      while i<11 loop
         dbms_output.put_line(i);
         i := i+1;
      end loop;  
    end;
    ---exit循环
    declare
      i number(2) := 1;
    begin
      loop
        exit when i>10;
        dbms_output.put_line(i);
        i := i+1;
      end loop;
    end;
    ---for循环
    declare
    
    begin
      for i in 1..10 loop
         dbms_output.put_line(i);  
      end loop;
    end;
    
      8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    4. 游标 Cursor

    在写 java 程序中有集合的概念,那么在 pl/sql 中也会用到多条记录,这时候我们就要用到游标,
    游标可以存储查询返回的多条数据

    在这里插入图片描述

    • 范例 1:使用游标方式输出 emp 表中的员工编号和姓名
      在这里插入图片描述
    • 范例 2:按员工的工种涨工资,总裁 1000 元,经理涨 800 元其,他人员涨 400 元。
    --备份出一张新表为 myemp;create table myemp as select * from emp;
    declare
    	cursor pc is select * from myemp;
    	addsal myemp.sal%type;
    	pemp myemp%rowtype;
    begin
    	open pc;
    	loop 
    		fetch pc into pemp;
    		exit when pc%notfound;
    		if pemp.job = 'PRESIDENT' then addsal := 1000;
    		elsif pemp.job = 'MANAGER' then addsal := 800;
    		else addsal := 400;
    		end if;
    		update myemp t set t.sal = t.sal + addsal where t.empno = pemp.empno;
    	end loop;
    	close pc;
    end;
    
      8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 范例 3:写一段 PL/SQL 程序,为部门号为 10 的员工涨工资
      在这里插入图片描述
    ---游标:可以存放多个对象,多行记录。
    ---输出emp表中所有员工的姓名
    declare
      cursor c1 is select * from emp;
      emprow emp%rowtype;
    begin
      open c1;
         loop
             fetch c1 into emprow;
             exit when c1%notfound;
             dbms_output.put_line(emprow.ename);
         end loop;
      close c1;
    end;
    
    -----给指定部门员工涨工资
    declare
      cursor c2(eno emp.deptno%type) 
      is select empno from emp where deptno = eno;
      en emp.empno%type;
    begin
      open c2(10);
         loop
            fetch c2 into en;
            exit when c2%notfound;
            update emp set sal=sal+100 where empno=en;
            commit;
         end loop;  
      close c2;
    end;
    ----查询10号部门员工信息
    select * from emp where deptno = 10;
    
      8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    相关技术文章

    点击QQ咨询
    开通会员
    返回顶部
    ×
    微信扫码支付
    微信扫码支付
    确定支付下载
    请使用微信描二维码支付
    ×

    提示信息

    ×

    选择支付方式

    • 微信支付
    • 支付宝付款
    确定支付下载