当前位置:Gxlcms > 数据库问题 > oracle pl/sql 程序设计 历史笔记整理

oracle pl/sql 程序设计 历史笔记整理

时间:2021-07-01 10:21:17 帮助过:12人阅读

  • 在java中调用存储过程:
  •  

     


    create or replace procedure t_p(l_in in out number) is

    begin

    l_in := 5;

    end;

     

     

     

    @Test

        public void test() throws SQLException

        {

            DataSource ds = DataSourceGen.getDataSourceFromXML();

            Connection conn = ds.getConnection();

            int inValue = 0;

            CallableStatement cs = conn.prepareCall("{call t_p(?)}");//注意有大括号

            cs.setInt(1, inValue);//设置传入的值 下标从1开始

            cs.registerOutParameter(1, Types.INTEGER);//注册传出的值

            cs.executeUpdate();//执行

            int outValue = cs.getInt(1);//获取输出

            System.out.println(inValue);//输出0

            System.out.println(outValue);//输出5

            conn.close();

        }

     

    • 在java中调用fucntion

     


    create or replace function t_f(l_in in out number) return number is

    l_c number;

    begin

    l_in := 5;

    l_c := 2;

    return l_c;

    end;

     

    @Test

        public void test() throws SQLException

        {

            DataSource ds = DataSourceGen.getDataSourceFromXML();

            Connection conn = ds.getConnection();

            int inValue = 0;

            CallableStatement cs = conn.prepareCall("{? = call t_f(?)}");

            cs.setInt(2, inValue);//设置传入的值

            cs.registerOutParameter(1, Types.INTEGER);//注册传出的值-通过return返回值

            cs.registerOutParameter(2, Types.INTEGER);//注册传出的值-通过参数返回值

            cs.executeUpdate();

            int outValue1 = cs.getInt(1);

            int outValue2 = cs.getInt(2);

            System.out.println(inValue);//输出0

            System.out.println(outValue1);//输出2

            System.out.println(outValue2);//输出5

            conn.close();

        }

     

    也可以通过select t_f(1) from dual;调用,但是具有out参数的函数不可以通过sql调用。

    oracle pl/sql 程序设计 第3章 语言基础

    • 在plsql中调用存储过程:
      begin t_p(); end;
      调用函数:
      declare a number;begin a := t_f();end;
    • 变量,异常,模块的作用范围都是在声明他们的块内。
      create or replace package scope_demo is

    g_globle number;

    procedure set_globle(number_in in number);

    end scope_demo;

     

    create or replace package body scope_demo is

    技术分享

    procedure set_globle(number_in in number) is

    l_count pls_integer;

    l_name varchar2(10) := ‘北京‘;

    begin

    <<localscope>>--标签 为匿名块命名

    declare

    l_use char(1) := ‘1‘;

    begin

    select count(1)

    into set_globle.l_count

    from pub_organ o

    where o.organ_name like set_globle.l_name || ‘%‘

    and o.in_use = localscope.l_use;

    dbms_output.put_line(set_globle.l_count);

    end localscope;

    scope_demo.g_globle := set_globle.number_in;

    end set_globle;

    end scope_demo;

    技术分享

    begin

    scope_demo.set_globle(2);

    dbms_output.put_line(scope_demo.g_globle);

    end;

    • 嵌套程序,完全在生命单元内声明的局部程序。
      declare

    procedure local_precedure is

    begin

    dbms_output.put_line(‘dd‘);

    end local_precedure;

    begin

    for i in 1..10

    loop

    local_precedure();

    end loop;

    end;

     

    • 在sql中,空字符串和null是一样的,不管是对varchar还是char。但是在plsql中,空字符串在varchar中是和null一样的,但是在char中不是。如:
      declare

    l_c char(1);

    begin

    l_c := ‘‘;

    if (l_c is null) then

    dbms_output.put_line(1);

    elsif (l_c = ‘ ‘) then

    dbms_output.put_line(2);--输出2 因为自动填满了 而在sql中不会自动填满

    end if;

    end;

    oracle pl/sql 程序设计 第4章 条件和顺序控制

    • plsql对and的多个条件之间采用短路控制,后面的条件可能不会被执行。所以不应该将逻辑放在and中处理。
    • 规律:if elsif when后面肯定要跟上then。
    • case语句以end结束将作为一个表达式存在,以end case结束将作为一条语句存在。
    • case语句中的每个when条件如果满足,那么之后的when将不会再被执行。相当于加了个break。
    • if中使用in和like
      declare

    l_n number := ‘10‘;

    begin

     

    if(l_n in (‘10‘,‘20‘))

    then dbms_output.put_line(‘in‘);

    end if;

     

    if(l_n like ‘10%‘)

    then dbms_output.put_line(‘like‘);

    end if;

    end;

    20131018 周五

     

    oracle pl/sql 程序设计 第5章 用循环进行迭代处理

    • 简单循环
      declare

    l_c pls_integer;

    begin

    l_c := 0;

    loop

    --exit when l_c > 10;

    if (l_c > 10) then

    exit;

    end if;

    dbms_output.put_line(l_c);

    l_c := l_c + 1;

    end loop;

    end;

     

    • while循环

        declare

    l_c pls_integer;

    begin

    l_c := 0;

    while l_c <= 10 loop while的条件可以加括号 也可以不加

    dbms_output.put_line(l_c);

    l_c := l_c + 1;

    end loop;

    end;

    • for循环

     

    只有数值型for循环和游标型(可以是游标,也可以直接是sql查询)for循环,这两种循环都要有in字句。遍历的变量不用声明,系统会自动生成。

     

    begin

    for l_c in 0 .. 10 loop 不能加括号

    dbms_output.put_line(l_c);

    end loop;

    end;

     

     

     

    begin

    for l_organ in (select * from pub_organ o where o.organ_name like ‘北京%‘) loop 查询必须用括号括起来

    dbms_output.put_line(l_organ.organ_name);

    end loop;

    end ;

     

     

    • 嵌套循环 以及从内层直接跳出
      declare

    i pls_integer := 0;

    j pls_integer := 0;

    begin

    <<outerloop>>

    loop

    dbms_output.put_line(i);

    exit when i > 10;

    j := 0;

    <<innerloop>>

    loop

    dbms_output.put_line(‘ ‘ || j);

    exit when j > 10;

    exit outerloop when(j = 5 and i = 5);

    j := j + 1;

    end loop innerloop;

    i := i + 1;

    end loop outerloop;

    end;

     

    • oracle11g开始才支持continue。

    oracle pl/sql 程序设计 第6章 异常处理

    • 异常出现后,如果没有被捕捉,将会自动抛出到上层。
    • 遇到未处理的异常(一直到顶层都没有被捕捉),系统会自动加上rollback。
      使用下面的处理 将会忽略异常 不会滚也不会报错 继续执行下面的语句
      exception

    when others then

    null;


    3、

    create or replace procedure t_pp as

    l_n number;

    begin

    update pub_organ o set o.organ_name = ‘dddd444ddd‘ where o.organ_id = ‘O50649821‘;

    l_n := ‘ddd‘;--此处出错 本层未捕捉 自动抛出异常到上层

    end;

    begin

    t_pp();--此处会捕捉到下层抛出的异常

    exception

    when others then

    rollback;--回滚

    commit;

    end;

    1. 什么时候抛出异常 什么时候捕捉?
      如果存储过程是为了其他程序来调用的,并非直接面向前台按钮触发的操作。那么可以将异常抛出到上层来处理。如果是直接面向前台按钮触发的操作,那么需要将异常限制在本层处理掉,不要抛出到应用层去。可以返回成功失败信息,失败原因等错误信息。
    2. 未绑定异常号的异常:
      这种异常根据变量来定位异常,定义的两个异常变量将是两个异常。
      declare

    l_ex1 exception;

    l_ex2 exception;

    begin

    begin

    raise l_ex1;

    end;

    exception

    when l_ex2

    then dbms_output.put_line(‘l_ex1‘);

    end;

    技术分享

     

    1. 绑定异常号的异常,将根据异常号来捕捉异常。

      declare

    l_ex1 exception;

    l_ex2 exception;

    pragma exception_init(l_ex1,-20111);

    pragma exception_init(l_ex2,-20111);

    begin

    begin

    raise l_ex1;

    end;

    exception

    when l_ex2

    then dbms_output.put_line(‘l_ex1‘);--此处将成功打印

    end;

     

    1. no_data_found
      no_data_found的异常号是-1403,但是作为一个特殊情况,将一个自定义的异常关联到-1403不能捕捉到no_data_found,必须关联到100.

      declare

    l_organ_id varchar2(32);

    l_organ_name varchar2(500);

    begin

    l_organ_id := ‘222‘;

    select o.organ_name into l_organ_name from pub_organ o where o.organ_id = l_organ_id;

    end;

     

    技术分享

     

     

     

    declare

    l_organ_id varchar2(32);

    l_organ_name varchar2(500);

    err_no_organ_1403 exception;

    pragma exception_init(err_no_organ_1403, -1403);

    begin

    l_organ_id := ‘222‘;

    select o.organ_name

    into l_organ_name

    from pub_organ o

    where o.organ_id = l_organ_id

    人气教程排行