zoukankan      html  css  js  c++  java
  • PL/SQL基础

    打印  hi

    set serveroutput on   --打开输出开关

    declare

              --说明部分(变量说明,光标申明或者例外说明)

    begin

              --程序体,语句序列(DML语句)

             dbms_out.put_line(‘hi’);--dbms_out程序包,put_line子程序

    exception  

            --例外处理语句

    end;

    / --/表示执行上一条语句或程序

    desc dbms_out    --查看程序包

    声明部分 

    • 定义基本变量

    类型:char,varchar2,date,number,boolean,long

    举例:

          name      char(15);

          married   boolean  :=true;

          psal        number(7,2);

    example1:

    --使用基本变量类型

    declare

    --定义基本变量类型

    --基本数据类型

    number number(7,2);

    --字符串变量

    name varchar2(20);

    --日期变量

    date  date;

    begin

    number =1;

    dbms_out.put_line(nember);

    name :='zhuzhu';

    dbms_out.put_line(name);

    date := sysdate;

    dbms_out.put_line(date);

    --计算明天的日期

    dbms_out.put_line(date +1);

    end;

    example2:

    --使用基本变量类型

    declare

    --定义基本变量类型

    --基本数据类型

    number number(7,2);

    --字符串变量

    name varchar2(20);

    --日期变量

    date  date;

    begin

    number =1;

    dbms_out.put_line(nember);

    name :='zhuzhu';

    dbms_out.put_line(name);

    date := sysdate;

    dbms_out.put_line(date);

    --计算明天的日期

    dbms_out.put_line(date +1);

    end;

    • 引用型变量

    emp_rec emp.name%type;--引用型变量就是定义一个变量,将一个表的一个字段查询出来赋给它,然后使用它把那个字段的值打印出来(一个值一个字段)

    example:

    --查询并打印员工号为2的姓名和薪资

    set serveroutput on

    declare

    emp_name emp.name%type;

    emp_sal emp.sal%type;

    begin

    select name  , sal into emp_name ,emp_sal from emp where no = 2;

    select sal into emp_sal from emp where no = 2;

    dbms_out.put_line(emp_name||''的工资是''||emp_sal);

    end;

    /

    •  记录型变量

    emp_rec emp%rowtype;--记录行变量就是定义一个数组,将一个表的某些字段赋给它,此时它是一个数组,那么就可以使用它将这些字段的值都打印出来(一行值多个字段)

    example:

    --查询并打印员工号为2的姓名和薪资

    set serveroutput on

    declare

    emp_name_sal emp%rowtype

    begin

    select * into emp_name_sal from  emp;

    dbms_out.put_line(emp_name_sal.name||'的工资是'||emp_name_sal.sal)

    end;

    /

    执行部分

    • 判断语句

    • IF  条件  THEN 语句1;-----只有两种情况

               语句2 ;

               END IF;

    • IF  条件  THEN 语句1;-----只有两种情况

              ELSE      语句2 ;

              END IF;

    • IF  条件  THEN 语句1;-----只有三种或三种以上情况

            ELSIIF  语句2 ;

            ELSIF  语句3;

            else    语句4;

              END IF;

    example:

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

    set serveroutput on

    accept num prompt'请输入';

    --num为地址值相当于指针

    declare

    pnum number :=#--取地址为num的值给数据类型为number的变量num

    begin

    IF pnum =1 THEN DBMS_OUT.PUT_LINE('值为1');

    elsif  pnum =2 THEN DBMS_OUT.PUT_LINE('值为2');

    elsif  pnum =3 THEN DBMS_OUT.PUT_LINE('值为3');

    elsse DBMS_OUT.PUT_LINE('其他值');

    end if;

    end;

    /

    • 循环部分

    • WHILE   循环条件  LOOP

            执行语句

            END LOOP;

    • LOOP     EXIT[WHEN 退出条件]

            执行语句

            ENDLOOP;

    • FOR 值  IN 1.。。。n    LOOP

            执行语句

         END LOOP;

    example:

    --打印1-----10

    set serveroutput on

    declare

    pnum number :=1;

    begin

    while pnum<=10 loop                                            loop                                                                   for   pnum in 1...10 loop

    DBMS_OUT.PUT_LINE(pnum);                              exit when pnum > 10                                          DBMS_OUT.PUT_LINE(pnum); 

    pnum := pnum+1;                                                DBMS_OUT.PUT_LINE(pnum);                            pnum := pnum+1;

    end loop;                                                              pnum := pnum+1;                                             end loop;

    end ;                                                                    end loop;

    /

    • 光标:就是一个结果集(列值),它的数据库中打开的数量是有限制的.oracle数据库中只允许在同一个会话中打开300个光标.

    光标属性:%found;%notfound;%isopen (判断光标是否打开);%rowcount(影响的行数);

    语法:cursor   光标名    is select 语法;

    打开光标:open   光标名

    定义光标:cursor c is select name from emp;

    取光标值给变量:fetch  c into pname ;--将当前指针指向的记录返回并且将指针指向下一个记录(需要取值时使用)

    关闭光标是释放资源:close c;

    example:

    --查询并打印姓名,薪资

    set serveroutput on

    declare

    cursor c is select name,sal from emp;

    pname emp.name %type;

    psal emp.sal%type;

    begin

    open c;

    loop fetch c into pname,psal;

    exit when c %notfound

    dbms_out.put_line(pname||的薪资是||psal);

    end loop;

    end;

    /

    example:

    --给不同职位的员工涨工资

    set serveroutput on

    declare

    cursor c is select pro, job from emp;

    pname emp.pro %type;

    psal emp.job %type;

    begin

    open c;

    fetch c into pro,job from emp;

    exit when c %notfound

    if job = '经理'  then update emp set sal := sal+400;

    elsif  job = '职员'  then update emp set sal := sal+300;

    else  update emp set sal := sal+200;

    end loop;

    close c;

    dbms_out.put_line('更新完成');

    end;

    /

    conmmit;

    example:

    --使用光标的%%isopen

    set serveroutput on

    declare

    cursor c is select pro, job from emp;

    pname emp.pro %type;

    psal emp.job %type;

    begin

    open c;

    if c%isopen then                          

    dbms_out.put_line('光标已打开');

    else dbms_out.put_line('光标未打开');

    end if;

    close c;

    end;

    /

    example:

    --使用光标的%rowcount属性

    set serveroutput on

    declare

    cursor c is select pro, job from emp;

    pname emp.pro %type;

    psal emp.job %type;

    begin

    open c;

    loop 

    fetch c into pro,job from emp;

    exit when c%notfound;

    dbms_out.put_line('rowcount'||c%rowcount);

    end loop;

    close c;

    end;

    /

     关于在一个数据库会话中只能打开300个光标

    查看可以打开的光标数量:

    show parameter %cursor%    --查看open _cuisor的数字

    修改光标数量限制:alter system set open_cursor = 400 scope = both/memory/spfile;   --scope可选both(都进行修改)/memory(只修改当前实例,不修改参数文件)/spfile(只修改参数文件不修改当前实例)中的一个

    带参数的光标

    语法:cursor   光标名   【参数名    参数数据类型,。。。】 is select 语法;

    example:

    set serveroutput on

    declare

    cursor c(dno number) is select pro, job from emp where deptno = dno;  -- dno number为形参

    pname emp.pro %type;

    begin

    open c(10);          --10为实参

    loop 

    fetch c into pname;

    exit when c%notfound;

    dbms_out.put_line(pename);

    end loop;

    close c;

    end;

    /

                                                       异常处理部分

    例外:程序设计语言提供的一种功能,用来增强语言的容错性和健壮性,分为系统例外和自定义例外。

    系统例外:no_data_found         没有找到数据

                  too_many_rows        查询语句匹配多行

                  zero_divide               被0除

                  value_error               算数或转换错误如根号下负数或abc转换为123之类的

                  timeout_on_resource 在等待资源是发生超时(如:分布式数据库)

    example:

    no_data_found--查询根本不存在的数据

    set serveroutput on

    declare

    pname emp.name%type;

    begin

    open c(10);          --10为实参

    loop 

    select name  from  emp where no = 123;

    eception 

    when no_data_found then dbms_out.put_line('未找到');

    when others then dbms_out.put_line('其他异常');

    end;

    /

  • 相关阅读:
    APP支付,后台支付宝生成预支付设置超时时间timeout_express无效,使用time_expire代替
    一些学习资料
    自连接
    模型成员
    模型查询
    模板
    管理站点
    视图
    设计模型
    搭建开发环境
  • 原文地址:https://www.cnblogs.com/shanshanliu/p/6220922.html
Copyright © 2011-2022 走看看