Oracle QL/SQL 的基本语法

一、什么是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;

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;
  • 范例 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;

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 ;
  • 范例:使用语法 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;

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;
  • 范例 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;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章