首页 > 代码库 > Oracle PLSQL:

Oracle PLSQL:

PLSQL:
  符号:
    赋值: :=

  基本示例:

        set serveroutput on   //设置输出打开.
        declare
          --说明部分
          
        begin
          --程序
          dbms_output.put_line(Hello World);
        exception
        
        end;
        /

 


  引用型变量:
    --查询7839的姓名和薪水

        --查询7839的姓名和薪水
        set serveroutput on

        declare
          --定义变量保存姓名和薪水
          --pename varchar2(20);
          --psal   number;
          pename emp.ename%type;      //引用型变量
          psal   emp.sal%type;      
        begin
          --得到姓名和薪水
          select ename,sal into pename,psal from emp where empno=7839;

          dbms_output.put_line(pename||的薪水是||psal);
        end;
        /

 


  记录型变量(代表了一行,多个列,类似数组)
    --查询7839的姓名和薪水

        set serveroutput on

        declare
          --定义记录型变量:代表一行
          emp_rec emp%rowtype;
        begin
          select * into emp_rec from emp where empno=7839;
          dbms_output.put_line(emp_rec.ename||的薪水是||emp_rec.sal);
        end;
        /

 


  IF语句
    --判断用户从键盘输入的数字

        set serveroutput on

        --接收键盘输入
        --num: 地址值,在该地址上 保存了输入的值
        accept num prompt 请输入一个数字;  //accept 命令

        declare
          --定义变量保存输入的数字
          pnum number := #            //从地址上取出数字 使用 &
        begin
          if pnum = 0 then dbms_output.put_line(您输入的是0);
            elsif pnum = 1 then dbms_output.put_line(您输入的是1);
            elsif pnum = 2 then dbms_output.put_line(您输入的是2);
            else dbms_output.put_line(其他数字);
          end if;
        end;
        /

 

  循环语句(共有三种方式,此处举例一种):
    --打印1~10

        set serveroutput on

        declare
          pnum number := 1;
        begin
          loop
            --退出条件
            exit when pnum > 10;
            
            dbms_output.put_line(pnum);
            --加一
            pnum := pnum + 1;
          end loop;
        end;
        /

 

  Cursor:光标(相当一个resultset, 结果集):
    1. 光标的属性:
      %isopen      %rowcount (影响的行数)
      %found        %notfound
    2. 默认,一个会话中只能打开300个光标
                show parameter cursor //查看参数 --->后面两个都是这里查来的
      修改: alter system/session set open_cursors=400;

    3. cursor_sharing ---> 性能优化
      EXACT(默认),   FORCE(提性能),   SIMILAR

    例子:
      --查询并打印员工的姓名和薪水(不带参数)

            set serveroutput on

            declare
              --定义光标
              cursor cemp is select ename,sal from emp; //定义一个光标
              pename emp.ename%type;
              psal   emp.sal%type;
            begin
              --打开光标
              open cemp;                            //打开一个光标

              loop
                --取一条记录
                fetch cemp into pename,psal;        //取出一个记录
                --退出条件
                --exit when 没有取到记录;
                exit when cemp%notfound;

                dbms_output.put_line(pename||的薪水是||psal);

              end loop;
              
              --关闭光标
              close cemp;                            //关闭光标
            end;
            /

 

    例二(带参数):
      --查询某个部门的员工姓名

            set serveroutput on

            declare
              cursor cemp(dno number) is select ename from emp where deptno=dno;
              pename emp.ename%type;
            begin
              open cemp(20);     //传参
              loop
                fetch cemp into pename;
                exit when cemp%notfound;
                
                dbms_output.put_line(pename);

              end loop;
              close cemp;
            end;
            /

 

exception(例外)
  系统例外:
    No_data_found (没有找到数据)
    Too_many_rows (select into 语句匹配多个行)
    Zero_Divide (被 0 除)
    Value_error (算数或者转换异常)
    Timeout_on_resource (等待资源超时)

    --被0除
    

                set serveroutput on

                declare
                  pnum number;
                begin
                  pnum := 1/0;
                  
                exception
                  when zero_divide then dbms_output.put_line(1:0不能做分母);
                                         dbms_output.put_line(2:0不能做分母);
                  when value_error then dbms_output.put_line(算术或者转换错误);
                  when others then dbms_output.put_line(其他例外);
                end;
                /

 

  自定义例外:
    --查询50号部门的员工姓名

                set serveroutput on

                declare
                  cursor cemp is select ename from emp where deptno=50;
                  pename emp.ename%type;
                  
                  --自定义例外
                  no_emp_found exception;   //定义一个 例外 类型的变量
                begin
                  open cemp;

                  --取第一条记录
                  fetch cemp into pename;
                  
                  if cemp%notfound then
                    --抛出例外
                    raise no_emp_found;    //抛出例外
                  end if;

                  --pmon: process monitor
                  close cemp;
                  
                exception      //一般处理是保存到一个表中
                  when no_emp_found then dbms_output.put_line(没有找到员工);
                  when others then dbms_output.put_line(其他例外); 
                end;
                /

 

Oracle PLSQL: