`
hugang357
  • 浏览: 182666 次
  • 性别: Icon_minigender_2
  • 来自: 深圳
社区版块
存档分类
最新评论

PL/SQL程序设计

阅读更多
一、PL/SQL概述
PL/SQL块结构:
Declare
-- 变量定义部分
Begin
-- 可执行语句
Exception
  -- 例外处理:对于程序运行中的错误信息、警告信息的说明
End;
.  // 以.号结束程序编写
二、PL/SQL语言的特点(参考PowerPoint教程)
1. PL/SQL中可以定义变量,变量有其作用范围。
2. PL/SQL是以块的方式设计,块中可以嵌套子块,子块可以位于块中任何部分。
3.
x. PL/SQL是以块为单位,SQL语句以语句为单位。
7. 减少对Oracle核心的访问,降低网络负载。
三、PL/SQL与SQL语言(参考PowerPoint教程)
1. PL/SQL语句不能使用DDL语句。
可以使用的SQL语句:Insert, Update, Delete, [select into], commit, rollback, savepoint
...
四、PL/SQL基础
1. 变量的使用
2. 单行注释:--
  多行注释:/*   */
3. 数据类型:
(1)布尔型: Boolean(TRUE, FALSE, NULL)
(2)数字型:NUMBER
INT = INTEGER
(3) 字符型,基本上没有变化
(4) 日期型
(5) 二进制数据:raw, blob
4. 数据定义:
变量名 数据类型
变量名 数据类型:=初始值
5. 变量赋值:变量 := 值;
  • %TYPE:数据类型匹配
  • s1 char(20);
    s2 s1%TYPE; // 定义s2变量,其类型与s1完全匹配。
    v_sal emp.sal%type;  // v_sal变量的类型与emp表中的sal字段的数据类型完全匹配,%TYPE最经常使用的方法
  • %ROWTYPE: 行类型,用于存储数据库基表的一条记录。
  • 定义方法:变量 基表名%rowtype;
    例:
    SQL> set serveroutput on  // 使能屏幕打印函数的输出
    Declare // 如果PL/SQL程序中没有定义变量,那么Declare可以省略
    v_empno emp.empno%type := &empno;
    r emp%rowtype;
    Begin
    select * into r from emp where empno = v_empno;
    dbms_output.put_line('姓名'|| r.ename||'工资'||r.sal||'日期'||r.hiredate);
    // r.字段名:表示某一列的值;dbms_output.putline()是一个屏幕打印函数
    End;
  • 记录类型Record:
  • record:
    Declare
    v_empno emp.empno%type := &empno;
    // 定义record类型
    type r_emp is record(
      v1 emp.ename%type,
      v2 emp.job%type,
      v3 emp.hiredate%type);

    r r_emp;   -- 定义变量r为record类型r_emp
    Begin
    select ename, job, hiredate into r from emp where empno = v_empno;
    dbms_output.put_line('姓名:'|| r.v1||'职务:'||r.v2||'工作时间:'||r.v3);
    End;
  • Table类型:类似于C语言中的结构类型数组:
  • 定义方法:TYPE [table_emp] is Table of [emp.ename%type] index by binary_integer;  // []内为用户可以修改的部分
    使用:mytable = table_emp;
    mytable(0) := 'SCOTT';
    ...
    例:
    Declare
    v_empno emp.empno%type := &empno;
    type t_emp is table of emp.ename%type index by binary_integer;

    t t_emp;
    Begin
    select ename into t(10) from emp where empno = v_empno;
    dbms_output.put_line('编码为'||v_empno||'的员工是'||t(10));
    End;
    五、条件控制语句:条件判断语句
    1. IF-THEN语句:
    IF 条件成立 THEN
    可执行语句; 
    END IF;
    Declare
           v_empno emp.empno%type :=&empno;
           v_ename emp.ename%type;
           v_sal emp.sal%type;
        Begin
          select sal,ename into v_sal,v_ename from emp
          where empno=v_empno;
          if v_sal<2000 then Begin
                      update emp set sal=sal+100
                      where empno=v_empno;
           dbms_output.put_line('员工'||v_ename||'工资已经修改!');
                                           End;
          End if;
        End;
      
    2. IF-THEN-ELSE语句
    IF 条件成立 THEN
    执行语句1;
    ELSE
    执行语句2;
    END IF;
    Declare
           v_empno emp.empno%type :=&empno;
           v_ename emp.ename%type;
           v_sal emp.sal%type;
    Begin
          select sal,ename into v_sal,v_ename from emp
          where empno=v_empno;
          if v_sal<2000 then Begin
                      update emp set sal=sal+100
                      where empno=v_empno;
           dbms_output.put_line('员工'||v_ename||'工资已经修改!');
                                           End;
          Else dbms_output.put_line('员工'||v_ename||'的工资已经超过规定值,不予更新!');
          End if;
    End;

    3. IF-THEN-ELSIF语句
         IF       条件1成立  THEN  执行语句1;
         ELSIF 条件2成立  THEN   执行语句2;
         ELSIF 条件3成立  THEN   执行语句3;
         ...
         END  IF;
       
    Declare
           v_empno emp.empno%type :=&empno;
           v_ename emp.ename%type;
           v_sal emp.sal%type;
        Begin
          select sal,ename into v_sal,v_ename from emp
          where empno=v_empno;
           if v_sal<2000 then Begin
                      update emp set sal=sal+100
                      where empno=v_empno;
            dbms_output.put_line('员工'||v_ename||'工资已经修改!');
                                           End;
            elsif v_sal<2500 then Begin
                      update emp set sal=sal+50
                      where empno=v_empno;
            dbms_output.put_line('员工'||v_ename||'工资已经修改!');
                                           End;
            elsif v_sal<3000 then Begin
                      update emp set sal=sal+10
                      where empno=v_empno;
            dbms_output.put_line('员工'||v_ename||'工资已经修改!');
                                           End;
            else dbms_output.put_line('员工'||v_ename||'的工资已经超过规定值,不予更新!');
            End if;
        End;

    六、循环语句:
    1. 基本循环:
    LOOP
           执行语句;
    EXIT WHEN 条件成立;
    END LOOP;
    例:
    Declare
             v_deptno emp.deptno%type:=&deptno;
             i number(2):=0;
         Begin
             loop
               i := i +1;
               insert into emp(empno,hiredate,deptno)
               values(i+7200,sysdate,v_deptno);
               dbms_output.put_line('i的当前值为:'||i);
              exit when i=10;
              end loop;
        End;
    2. WHILE循环:
    WHILE 条件成立
    LOOP 执行语句;
    END LOOP;
    Declare
             v_deptno emp.deptno%type:=&deptno;
             i number(2):=0;
         Begin
             while i  < 10   loop
               i := i +1;
               insert into emp(empno,hiredate,deptno)
               values(i+7200,sysdate,v_deptno);
               dbms_output.put_line('i的当前值为:'||i);
           --   exit when i=10;
              end loop;
        End;
      
    3. FOR循环:
    FOR 计数器 IN 低界..高界
    LOOP 执行语句;
    END LOOP;
    例:
    Declare
             v_deptno emp.deptno%type:=&deptno;
             i number(2):=0;
         Begin
             while i  < 10   loop
               i := i +1;
               insert into emp(empno,hiredate,deptno)
               values(i+7200,sysdate,v_deptno);
               dbms_output.put_line('i的当前值为:'||i);
           --   exit when i=10;
              end loop;
        End;

    七、光标设计(Cursor):
    1、什么是光标?在PL/SQL中,当查询语句执行结果超过一行时,为处理每一行,必须定义一个cursor,叫光标。

    2、光标使用方法:
    (1) 定义光标:
    语法:光标名 is select 语句;
    (2) 打开光标:
    语法:open 光标名;
    (3) 取数据:
    语法:Fetch 光标名 into 变量;
    (4) 光标下移:使用loop循环
    (5) 关闭光标:close 光标名;
    例:
    Declare
            v1 emp.empno%type;
            v2 emp.ename%type;
            v3 emp.sal%type;
            cursor c is select empno,ename,sal from emp;
         Begin
             open c;
             loop
             fetch  c into v1,v2,v3;
             if v3<3000 then Begin
                               update emp set sal=sal+100
                               where empno=v1;
                        dbms_output.put_line('员工'||v2||'工资已经更新!');
                                        End;
             end if;
             exit when c%NOTFOUND;
             end loop;
             close c;
         End;
    /

    -- //要求从emp表中取出按用户输入要求的前几位工资最高的人员及其工资放入topsalary表中:
    -- // 我的方法:
    SQL>create table topsalary (
    name varchar2(20),
    sal number(7,2));

    SQL>Declare
      vcount number(7) := &n;
      i number(7) :=0;
            vname emp.ename%type;
            vsal emp.sal%type;
            cursor c is select ename,sal from emp order by nvl(sal,0) desc; --// 使用nvl函数防止工资出现空值的情况,老师补充
         Begin
          delete topsalary;  -- // 先清空topsalary表
             open c;
           
             for i in 1 .. vcount loop
             fetch  c into vname, vsal;
           
             insert into topsalary values(vname,vsal);
           
             end loop;
             close c;
         End;

    --//教师的方法
    Declare
        i number(3) :=&i;
        j number(3) :=0;
       cursor c is select ename,sal from emp order by nvl(sal,0) desc;
       v1 emp.ename%type;
       v2 emp.sal%type;
    Begin
       open c;
       loop
       j := j+1;
       fetch c into v1,v2;
       insert into topsalary  values(v1,v2);
       exit when j=i;
       end loop;
       close c;
    End;
    3. 光标属性:  每一个光标有四种属性
    %FOUND         查询语句(FETCH语句)返回记录
    %NOTFOUND      查询语句(FETCH语句)无返回记录,用于循环退出条件
    %ROWCOUNT     FETCH已获取的记录数
    %ISOPEN        光标已打开标记
    例:
    Declare
            v1 emp.empno%type;
            v2 emp.ename%type;
            v3 emp.sal%type;
            cursor c is select empno,ename,sal from emp;
         Begin
             open c;
             loop
             fetch  c into v1,v2,v3;
             if v3<3000 then Begin
                               update emp set sal=sal+100
                               where empno=v1;
                        dbms_output.put_line('员工'||v2||'工资已经更新!');
                                        End;
             end if;
             exit when c%NOTFOUND;
             end loop;
             dbms_output.put_line('光标处理的行数:'||C%ROWCOUNT);
             close c;
         End;
       
    4. 隐式光标处理: 隐式光标是指在处理SQL时,不需定义光标,所使用的SQL语句包括:INSERT ,UPDATE,DELETE子句。
    隐式光标属性:       SQL%FOUND        SQL%NOTFOUND              SQL%ROWCOUNT
    隐式光标的使用:
    Declare
    v_empno emp.empno%type:=&empno;
    Begin
    delete from emp where empno=v_empno;
    if SQL%NOTFOUND then
      dbms_output.put_line('你的删除失败,数据库无此人:'||v_empno);
    end if;
    End;

    [例外处理Exception]
    Declare
           v_empno emp.empno%type :=&empno;
           v_ename emp.ename%type;
           v_sal emp.sal%type;
    Begin
          select sal,ename into v_sal,v_ename from emp
          where empno=v_empno;
           if v_sal<2000 then Begin
                      update emp set sal=sal+100
                      where empno=v_empno;
            dbms_output.put_line('员工'||v_ename||'工资已经修改!');
                                           End;
            elsif v_sal<2500 then Begin
                      update emp set sal=sal+50
                      where empno=v_empno;
            dbms_output.put_line('员工'||v_ename||'工资已经修改!');
                                           End;
            elsif v_sal<3000 then Begin
                      update emp set sal=sal+10
                      where empno=v_empno;
            dbms_output.put_line('员工'||v_ename||'工资已经修改!');
                                           End;
            else dbms_output.put_line('员工'||v_ename||'的工资已经超过规定值,不予更新!');
            End if;
    Exception   -- // 例外处理
    when NO_DATA_FOUND then dbms_output.put_line('数据库中没有编码为'||v_empno||'的员工。');
    when TOO_MANY_ROWS then
      dbms_output.put_line('你的查询语句返回结果出现多行,请定义光标后重试!');
    when OTHERS then
      dbms_output.put_line('你的程序是错误的,请仔细检查后重试!');
    End;
    [用户定义的例外]
    (1)在Declare段定义
    (2)在Begin段中用Raise引起。
    (3)在Exception段中使用。
    Declare
           v_empno emp.empno%type :=&empno;
           no_result exception;
    Begin
    delete from emp where empno = v_empno;
    if SQL%NOTFOUND then raise no_result;
    end if;

    Exception   -- // 例外处理
    when NO_DATA_FOUND then dbms_output.put_line('数据库中没有编码为'||v_empno||'的员工。');
    when NO_RESULT then dbms_output.put_line('数据库中没有编码为'||v_empno||'的员工。');
    when TOO_MANY_ROWS then
      dbms_output.put_line('你的查询语句返回结果出现多行,请定义光标后重试!');
    when OTHERS then
      dbms_output.put_line('你的程序是错误的,请仔细检查后重试!');
    End;
    [存储过程(Storage Procedure)与函数(Function)设计]
    一、什么是存储过程?
    存储过程(函数)是把一个PL/SQL块存储到数据库中,作为一个数据库实体,可以在其它存储过程、函数、应用程序中调用。
    1、存储过程的调用方法:
    (1) 在SQL*Plus中调用方法:SQL> Execute 存储过程名称; // execute 可以简写为Exec。
    (2) 在其它存储过程、函数、应用程序中调用方法:存储过程名称;
    2、存储过程的设计方法:
    编写程序->在SQL*PLUS中编译->修改错误->调用执行。
    二、创建存储过程的语法:[参考PowerPoint教程:存储过程1.ppt(P3)]
    说明:
    IN: 调用者向过程传递参数
    OUT: 过程向调用者传递参数
    IN OUT: 双向传递参数
    无Declare
    [例1:]IN: 删除数据
    Create or Replace procedure DelEmp(v_empno in emp.empno%type) is
    Begin
    delete from emp where empno=v_empno;
    dbms_output.put_line('编码为'||v_empno||'的员工已被除名!');
    End DelEmp;
    调用方法:
    SQL> Exec DelEmp(7788);
    SQL> Exec DelEmp(7934);

    [例2:]IN: 插入数据
    Create or Replace procedure InsertEmp( v_empno in emp.empno%type,
            v_ename in emp.ename%type,
            v_deptno in emp.deptno%type) is
    Begin
    insert into emp(empno, ename, hiredate,deptno)
      values(v_empno, v_ename, sysdate, v_deptno);
    dbms_output.put_line('新员工“'||v_ename||'”录入成功!');
    End InsertEmp;
    [例3:]IN、OUT:数据查询
    Create or Replace procedure QueryEmp(v_empno in emp.empno%type,
                                         v_ename out emp.ename%type,
                                         v_job out emp.job%type) is
    Begin
      select ename,job into v_ename,v_job from emp
      where empno=v_empno;
    End QueryEmp;
    调用方法:
    Declare
      v1 emp.ename%type;
      v2 emp.job%type;
       v  emp.empno%type:=&empno;
    Begin
        QueryEmp(v,v1,v2);
       dbms_output.put_line('编码为'||v||'的员工姓名是:'||v1||'职业是:'||v2);
    End;

    [* 查询存储过程源代码:]
    SQL> select text from user_source where name = 'DELEMP';  // 名字要大写

    三、创建函数语法:
    例1:
    Create or replace Function GetSalary( v empno%type) return numbwr is
    v_sal emp.sal%type;
    Begin
    select sal into v_sal from emp
    where empno=v;
    return v_sal;
    End GetSalary;

    [调用方法:]
    (1) SQL> Exec dbms_output.put_line(GetSalary(7788));
    (2) SQL> select GetSalary(7788) from dual;
    (3) 使用PL/SQL的方法:
    Begin
      dbms_output.put_line(GetSalary(7788));
    End;
    [函数例2]
    Create or replace function getmaxsal
    return number
    is
    v_maxsal emp.sal%type;
    begin
       select max(sal) into v_maxsal from emp;
       return v_maxsal;
    end getmaxsal;

      [调用方法:]
    (1) SQL> Exec dbms_output.put_line(GetMaxSal);
    (2) SQL> select GetMaxSal from dual;
    (3) 使用PL/SQL的方法:
    Begin
      dbms_output.put_line(GetMaxSal);
    End;

    [练习题]: 求n!函数(n的阶乘)。
    [我的答案]
    Create or replace function nj(n in number)
    return number
    is
       numtmp number;
    Begin
       if n = 0 then
        numtmp := 1;
       else
        numtmp := n * nj(n - 1);
       end if;
     
       return numtmp;
    End nj;

    [教师的答案]// 高, 实在是高!!!
    Create or replace function fn(n in number)
    return number
    is
    Begin
      if n=0 then return 1;
    else return n*fn(n-1);
    end if;
    End fn;
    四、存储过程及函数管理:
    1、查询存储过程及函数的源代码:
    SQL> select * from user_source;
    SQL> select * from dba_source;
    SQL> select * form all_source;
    2、存储过程及函数的权限管理:
    授权命令:
    SQL> grant execute on 过程(或函数) to 用户名;
    SQL> grant execute on 过程(或函数) to public;  --//授权给全体用户
    权限回收:
    SQL> Revoke execute on 过程(或函数) from 用户名;
    SQL> Revoke execute on 过程(或函数) from public;
    3、查询错误信息:
    SQL> select * from user_errors;
    SQL> show errors;
    4、查询依赖性信息:
    依赖性:实体的结构定义修改时,对创建在这些实体上的存储过程及函数的影响叫依赖性。
    显示依赖性关系:
    SQL> select name,type, referenced_owner, referenced_name, referenced_type from user_dependencies;
    5、删除存储过程及函数:
    SQL> drop procedure 过程名;
    SQL> drop function 函数名;

    [包(Package)的设计与开发]
    一、什么是包?
        把一些相关的存储过程、函数、变量、光标、例外等组合在一起形成的对象叫包。包由包的说明部分及包体两部分组成。定义在包说明部分的是公共元素,定义在包体的部分是私有元素。
    二、使用包的优点:    
       1、规范化程序设计
       2、方便过程及函数的组织
       3、便于管理:包的授权只需一次完成
       4、优化系统性能:整个包作为一个整体一次调入内存。

    三、包的开发步骤:
    1、创建包的说明部分:Create package
    2、创建包体部分:Create package body
    3、在SQL*Plus中运行创建包
    4、在存储过程、其它应用中调用。
    在SQL*Plus中调用方法:SQL> exec 包名.过程名;
    在存储过程、函数、其它应用中调用方法:包名.过程名;
    四、创建包的语法:
    1、创建包(说明部分):请参考PowerPoint教程:存储过程1.ppt[Page10]
    2、创建包体(Create Package Body): 请参考PowerPoint教程:存储过程1.ppt[Page11]
    3、例:请参考PowerPoint教程:存储过程1.ppt[Page12、13、14、15]
    五、包的删除:
    SQL> drop package 包名;
    SQL> drop package body 包名;
    查询包源代码:
    SQL> select text from user_source where name = '包名';  // 包名大写。

    [数据库触发器(Triggers)设计与开发]
    一、 什么是触发器?
    数据库触发器是一个存储的PL/SQL程序块,它与一个基表联系,当在表上执行特定的数据库维护(插入、删除、更新这三种操作)时,隐含地执行一个PL/SQL程序块。
    二、触发器的作用:
    。防止非法的数据库操纵、维护数据库安全
    。对数据库的操作进行审计,存储历史数据
    。完成数据库初始化处理
    。控制数据库的数据完整性
    。进行相关数据的修改
    。完成数据复制
    。自动完成数据库统计计算
    。限制数据库操作的时间、权限等,控制实体的安全性

    三、触发器的组成:
    1、触发时间:触发器事件的时间次序(before, afer)[2]
    2、触发事件:什么SQL语句会引起触发器触发(Insert, delete, update)[3]
    3、触发子体:触发器触发时要执行的操作(一个完整的PL/SQL程序)
    4、触发类型:触发器被执行的次数(语句级、行级)[2] //语句级只执行一次,行级会执行多次。
  • 一个表上最多可以创建12个不同类型的触发器:3*2*2 = 12
  • 四、创建触发器注意事项:
    1、在触发器中可以调用存储过程、包;在存储过程中不得调用触发器。
    2、在触发器中不得使用commit, rollback, savepoint语句。
    3、在触发器中不得间接调用含有commit, rollback, savepoint的语句的存储过程及函数。
    五、创建语句级触发器:
    语句级触发器: 请参考PowerPoint教程:存储过程1.ppt[Page19] 该触发器在数据库操作时只执行一次。
    说明:
    。update中的of是可选项,用于指定语句要修改的列
    。要创建的触发器已经存在时,使用replace选项
    //例1:before型触发器:
    Create or replace trigger DelEmp
      before delete on emp
      Begin
       if (To_Char(sysdate,'dy') in ('星期六','星期日') or
            To_number(To_Char(sysdate,'hh24'))  not between  8   and 18)
       then dbms_output.put_line('现在是非工作时间,请退出!!!');
       end if;
      End;
    [触发器数据字典]
    SQL> select table_owner, table_name,trigger_body from user_triggers where trigger_name='DELEMP';
    //例2:After型触发器:
    Create or replace trigger InsertEmp
    after insert on emp     // 如果是before,就会比after的结果少一名。
    Declare
    v_empcount number(7);
    Begin
    select count(*) into v_empcount from emp;
    dbms_output.put_line('目前员工总数已达到:'|| v_empcount|| '名。');
    End;

    //例3:多个触发条件
    Create or replace trigger ChangeEmp
    before delete or insert or update on emp
    Begin
       if (To_Char(sysdate,'dy') in ('星期六','星期日') or
            To_number(To_Char(sysdate,'hh24'))  not between 8 and 18)
       then dbms_output.put_line('现在是非工作时间,请不要修改数据!!!');
       end if;
    End;
    // 更完善的写法:
    Create or replace trigger ChangeEmp
      before delete or insert or update  on emp
      Begin
       if (DELETING and (To_Char(sysdate,'dy') in ('星期六','星期日') or
            To_number(To_Char(sysdate,'hh24'))  not between  8   and 18))
       then dbms_output.put_line('现在是非工作时间,不要删除数据!');
       elsif (UPDATING and (To_Char(sysdate,'dy') in ('星期六','星期日') or
            To_number(To_Char(sysdate,'hh24'))  not between  8 and 18))
       then dbms_output.put_line('现在是非工作时间,不要更新数据!');
       elsif (INSERTING and (To_Char(sysdate,'dy') in ('星期六','星期日') or
            To_number(To_Char(sysdate,'hh24'))  not between  8   and 18))
       then dbms_output.put_line('现在是非工作时间,不要插入数据!');
       end if;
      End;
    六、创建行级触发器:
    等级触发器:增加选项for each row, 使触发器在每一行上触发。
    1、创建行级触发器注意事项:
    (1) 在行级触发器中,在列名前增加old表示该列修改前值,增加new表示该列修改后值。
    (2) 在PL/SQL中引用时,前边增加冒号。

    [例4: 行级触发器] //必须是对所有的行进行操作才行。
    Create or Replace trigger UpdateEmp
    Before update on emp
    for each row
    Begin
    dbms_output.put_line(:old.sal||'--------->'||:new.sal);
    End;
    [例5:保存历史数据,这种使用方法很重要,用来保存关键表的历史数据]
    CReate or Replace trigger ChangeEmp
    Before update or delete on emp
    for each row
    Begin
    Insert into oldemp(empno, ename,job,hiredate,sal)
    values(:old.empno,:old.ename,:old.job,sysdate,:old.sal);
    End;
    SQL> create table oldemp
    as select empno, ename,job,hiredate,sal from emp where 1>2;
    [例6:修改外键]
    Create or Replace trigger UpdateDept
    after update on dept
    for each row
    Begin
    update emp
      set emp.deptno = :new.deptno
      where emp.deptno =(冒号和字母o)ld.deptno;
    End;
    [例7:删除外键、删除相关数据]
    Create or Replace trigger DeleteDept
    before delete on dept
    for each row
    Begin
    delete from emp where deptno =(冒号和字母o)ld.empno;
    End;
    七、触发器管理
    1、使触发器失效:
    SQL> alter trigger 触发器名称 disable;  // 失效
    SQL> Alter Trigger 触发器名称 enable;  // 生效
    SQL> Alter table 表名 DISABLE all triggers; // 一个表上的所有触发器失效
    SQL> Alter table 表名 ENABLE all triggers; // 使一个表上的所有触发器生效
    SQL> Drop Trigger 触发器名;  // 删除触发器;
    分享到:
    评论

    相关推荐

      Oracle PL/SQL程序设计(第5版)(套装上下册)

      《Oracle PL/SQL程序设计(第5版)(套装上下册)》基于Oracle数据库11g,从PL/SQL编程、PL/SQL程序结构、PL/SQL程序数据、PL/SQL中的SQL、PL/SQL应用构建、高级PL/SQL主题这6个方面详细系统地讨论了PL/SQL以及如何...

      oracle 9i pl/sql程序设计笔记

      oracle 9i pl/sql程序设计笔记。

      pl/sql程序设计

      pl/sql程序设计 为了宇宙和平,20字!

      PL/SQL 程序设计

      PL/SQL 程序设计 本章主要重点:  PL/SQL概述  PL/SQL块结构  PL/SQL流程  运算符和表达式  游标  异常处理  数据库存储过程和函数  包  触发器

      Pl/Sql程序设计

      1、PL/SQL简介 2、PL/SQL基础 3、记录和表 4、在PL/SQL中使用SQL 5、内置SQL函数 6、游标 7、过程和函数 ...

      Oracle PL/SQL程序设计(第5版)(下册)第二部分

      《Oracle PL/SQL程序设计(第5版)》基于Oracle数据库11g,从PL/SQL编程、PL/SQL程序结构、PL/SQL程序数据、PL/SQL中的SQL、PL/SQL应用构建、高级PL/SQL主题这6个方面详细系统地讨论了PL/SQL以及如何有效地使用它。...

      Oracle数据库实用教程第三章 PL/SQL程序设计.pptx

      本章节主要介绍了 PL/SQL 程序设计的基础知识,包括 PL/SQL 的优点、运行 PL/SQL 程序、PL/SQL 块结构、PL/SQL 基本语法、PL/SQL 处理流程、异常处理、游标、存储过程和函数、触发器等。 PL/SQL 的优点包括: * ...

      Oracle PL/SQL程序设计(第5版)

      《Oracle PL/SQL程序设计(第5版)》基于Oracle数据库11g,从PL/SQL编程、PL/SQL程序结构、PL/SQL程序数据、PL/SQL中的SQL、PL/SQL应用构建、高级PL/SQL主题这6个方面详细系统地讨论了PL/SQL以及如何有效地使用它。...

      Oracle PL SQL程序设计 上 第五版(代码示例)

      《oracle pl/sql程序设计(第5版)》基于oracle数据库11g,从pl/sql编程、pl/sql程序结构、pl/sql程序数据、pl/sql中的sql、pl/sql应用构建、高级pl/sql主题6个方面详细系统地讨论了pl/sql以及如何有效地使用它。...

      Oracle PL/SQL程序设计

      Oracle PL/SQL程序设计,经典书籍,既可以当教材学习,也可以当手册查询。

      Oracle PL/SQL程序设计(第5版)(上下册)

      Oracle PL/SQL程序设计(第5版)(上下册),《Oracle PL/SQL程序设计(第5版)》基于 Oracle数据库11g,从PL/SQL编程、PL/SQL程序结构、PL/SQL程序数据、 PL/SQL中的SQL、PL/SQL应用构建、高级PL/SQL主题这6个方面详细...

      【2分】【详细书签】【高清】Oracle Database 11g PL/SQL程序设计 part2

      Oracle Database 11g PL/SQL程序设计 ★第二部分(part2)★ ——※ 注意:该电子书99.4M,分为2个压缩包, 需要将全部2个压缩包下载才能解压缩,单个部分无法解压。 此为第2个包,另外1个包以及源代码包可通过本人...

      【2分】【详细书签】【高清】Oracle Database 11g PL/SQL程序设计 part1

      Oracle Database 11g PL/SQL程序设计 ★第一部分(part1)★ ——※ 注意:该电子书99.4M,分为2个压缩包, 需要将全部2个压缩包下载才能解压缩,单个部分无法解压。 此为第1个包,另外1个包以及源代码包可通过本人...

      Oracle PL/SQL程序设计(第5版)示例代码

      O'reilly的《oracle pl/sql 程序设计(第5版)》书里的示例代码

      Oracle9i PL/SQL程序设计

      权威PL/SQL语言参考书

      Oracle PL SQL 程序设计第五版(chapters27and28+源码)

      《Oracle PL/SQL程序设计(第5版)》基于Oracle数据库11g,从PL/SQL编程、PL/SQL程序结构、PL/SQL程序数据、PL/SQL中的SQL、PL/SQL应用构建、高级PL/SQL主题这6个方面详细系统地讨论了PL/SQL以及如何有效地使用它。...

      Oracle PL SQL程序设计 中文第五版 上册

      《oracle pl/sql程序设计(第5版)(上下册)》基于oracle数据库11g,从pl/sql编程、pl/sql程序结构、pl/sql程序数据、pl/sql中的sql、pl/sql应用构建、高级pl/sql主题这6个方面详细系统地讨论了pl/sql以及如何有效地...

      Oracle PL/SQL程序设计(第5版)(下册) 第一部分

      近15年来,成千上万的PL/SQL程序员──无论是初学者还是经验丰富的开发者──都同样需要依赖《Oracle PL/SQL程序设计》来帮助他们充分掌握和应用这门功能强大的语言。 第5版是基于Oracle数据库11g的R1、R2两个版本的...

    Global site tag (gtag.js) - Google Analytics