PL/SQL存储过程备忘

 

嗯,好久不写存储过程了,最近有一个业务用数据库的存储过程来实现比较妥当,于是再次接触了一下,下面是一些记录,以便以后翻查;

1、如何定义一个存储过程:

下面是一个简单的存储过程定义,实现了将“hello”打印出来

CREATE OR REPLACE PROCEDURE P_TEST(P_START_TIME TEST.CREATE_TIME%TYPE, P_END_TIME TEST.CREATE_TIME%TYPE) IS

//这里定义所有在正文中会使用到的局部变量

BEGIN

//这里是存储过程正文

    DBMS_OUTPUT.PUT_LINE('HELLO');

 

END P_TEST;

 

说明:P_START_TIME TEST.CREATE_TIME%TYPE 代表该形参类型与TEST表的CREATE_TIME字段一致;

 

2、如何在sql窗口调用一个名为P_TEST的存储过程?

格式如下:

DECLARE

BEGIN

P_TEST(SYSDATE,SYSDATE);

END;

 

3、如何使用循环?

 

LOOP

//这里是循环中的内容

END LOOP;

 

4、如何在循环中continue?

 

LOOP

if 条件满足 then

goto main_loop;

end if;

 

<<main_loop>>

 null;

END LOOP;

 

 

5、如何使用游标?

一般使用游标分这样几个步骤:定义游标、打开游标、获取当前游标数据并让游标指向下一条数据、关闭游标;

定义游标示例:

CURSOR myCur is

        select a, b, c

          from tbl_test;

 

打开游标示例:

    if myCur%isopen = false then

        open myCur;

    end if;

 

获取当前数据并让游标指向下一跳数据:

    loop

        fetch myCur into tmp_a,tmp_b,tmp_c;

        exit when myCur%notfound;

        dbms_output.put_line(tmp_a || ',' || tmp_b || ',' ||

                             tmp_c);

    end loop;

 

关闭游标示例:

close myCur;

 

一个完整的例子:

CREATE OR REPLACE PROCEDURE P_TEST IS

    CURSOR myCur is

        select a, b, c from tbl_test;

 

    tmp_a varchar(32);

    tmp_b varchar(32);

    tmp_c varchar(32);

BEGIN

    if myCur%isopen = false then

        open myCur;

    end if;

 

    loop

        fetch myCur

            into tmp_a, tmp_b, tmp_c;

        exit when myCur%notfound;

        dbms_output.put_line(tmp_a || ',' || tmp_b || ',' || tmp_c);

    end loop;

 

    close myCur;

 

END P_TEST;

 

 

6、使用结构体与游标结合进行使用

在上面的应用中,我们可以把a,b,c三个值放到一个结构体中,以方便使用;

结构体定义示例:

    type SourceData is record(

        a tbl_test.a%type,

        b tbl_test.b%type,

        c tbl_test.c%type);

 

对循环的使用,我们也可以通过使用for-in语句,下面的完整示例:

CREATE OR REPLACE PROCEDURE P_TEST IS

    CURSOR myCur is

        select a, b, c from tbl_test;

 

    type SourceData is record(

        a tbl_test.a%type,

        b tbl_test.b%type,

        c tbl_test.c%type);

 

    srcData SourceData;

BEGIN

    for srcData in myCur loop

        dbms_output.put_line(srcData.a || ',' || srcData.b || ',' ||

                             srcData.c);

    end loop;

 

END P_TEST;

 

7、如何获取当前插入数据的id

insert into tbl_test(id,name) values(seq_test.nextval,'myName');

select seq_test.currval into tmpId from dual;

 

8、在存储过程处理过程中,遇到异常一般如何处理?

下面是一个存储过程正文中的常用格式:

CREATE OR REPLACE PROCEDURE P_TEST(P_START_TIME TEST.CREATE_TIME%TYPE, P_END_TIME TEST.CREATE_TIME%TYPE) IS

BEGIN

//这里做一些数据库操作

      COMMIT;

EXCEPTION

//遇到异常,则回滚

    WHEN OTHERS THEN

   

        ROLLBACK;

        RAISE;

 

END P_TEST;

 

 

9、常用函数

打印:

DBMS_OUTPUT.PUT_LINE('hello' || ' ' || 'world');

字符串转日期:

to_date('2011-01-10 12:13:14','YYYY-MM-DD HH24:MI:SS')

日期转字符串:

to_char(sysdate,'YYYY-MM-DD HH24:MI:SS')

去掉前后空格:

trim(' str ');

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值