接触 PL/SQL 第一天

接触 PL/SQL 第一天


PL/SQL是什么呢?
书上说PL/SQL是建立在标准SQL语言之上的过程性拓展
那么PL/SQL有什么好处呢?
1.提高应用程序的运行性能
2.提供模块化的程序设计功能
3.允许定义标识符
4.具有过程语言控制结构
5.具有良好的兼容性
6.处理运行错误

PL/SQL的基本单元是块(Block),PL/SQL块又由三部分组成

declare  -- 定义部分
-- 这里定义一些变量、常量、游标、复杂数据类型等
begin     --执行部分
-- 这里执行PL/SQL语句和SQL语句
exception  -- 异常部分
-- 在这里处理异常
end;  -- 这是块结束标记

其中 begin、end两部分是必须有的,declare、exception两部分可以不写

下面写两个简单的PL/SQL
只包含 begin、end两部分的PL/SQL:

set serveroutput on -- 开启控制台输出功能
begin    -- 执行模块
   dbms_output.put_line('hello,everybody');  -- 输出 hello,everybody
end;  -- 结果标记

包含四个部分的PL/SQL:

declare  -- 定义部分
   v_ename varchar2(10);
begin   -- 执行部分
   select ename into v_ename from emp where empno=&no; //输入员工号,查询该员工姓名
   dbms_output.put_line('员工名字:'||v_ename);
exception   -- 异常部分
   when NO_DATA_FOUND then
   dbms_output.put_line('员工号不存在');
end;  -- 结束标记
PL/SQL又可以分为四大类:
1.匿名块
如上面例子,没有名字的块
2.命名块
在匿名块之前加 <<name>> 就是命名块了,块与块之间是可以多层嵌套的,有了名字就好区分了
3.子程序
子程序又可以分为 过程、函数、包 三个对象
创建过程:

create or replace procedure insert_dept(no number,name varchar2)
is
begin
   insert into dept (deptno,dname) values(no,name);
end;
call insert_dept('5','财务部'); -- 调用过程
创建函数:

create or replace function select_sal_year(no number)
return number is
   sal_year(8,2);
begin
   select sal*12 into sal_year from emp where empno=no;
   return sal_year;
exception
   when NO_DATA_FOUND then
   dbms_output.put_line('员工号不存在');
end;
var sal number; -- 声明变量sal
execute :sal:=select_sal_year(3); -- 用变量接收返回值
print sal; -- 查看员工年薪
包:

create package emp_pkg
is
procedure insert_dept(no number,name varchar2);
function select_sal_year(no number) return number;
end emp_pkg;
实现包体:

create or replace package body emp_pkg 
is
  procedure update_sal(na varchar2,newsal number)
  is
  begin
    update emps set sal=newsal where ename=na;
  end;
  function sal_year(name varchar)
  return number is
    sal_year number(9,2);
  begin
    select sal*12+nvl(comm,0) into sal_year from emps
    where ename=name;
    return sal_year;
  end;
end emp_pkg;
4.触发器:
不知为何我的触发器并不能创建成功
代码贴出来

create or replace trigger update_emp
  after update of deptno on depts
  for each row
begin
  update emps set deptno=:new.deptno
  where deptno=:old.deptno;
end;
错误报告:

ORA-04089: cannot create triggers on objects owned by SYS
04089. 00000 -  "cannot create triggers on objects owned by SYS"
*Cause:    An attempt was made to create a trigger on an object owned by SYS.
*Action:   Do not create triggers on objects owned by SYS.
总结: 总体上感觉PL/SQL跟Java中的方法有点像,包又与接口有点类似

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值