oracle存储过程、匿名块、函数、包

使用过程与函数的原则:

1、如果需要返回多个值和不返回值,就使用过程;如果只需要返回一个值,就使用函数。

2、过程一般用于执行一个指定的动作,函数一般用于计算和返回一个值。

3、可以SQL语句内部(如表达式)调用函数来完成复杂的计算问题,但不能调用过程。所以这是函数的特色。

一、存储过程

1、存储过程初步

--存储过程:实现搬历史表
create or replace procedure movetohistory_1 (
                                          
                                           o_count out number ,
                                           error out VARCHAR2) IS
V_COU-NT number;
V_SUBSCRIBE_ID TI_C_IOM_BUSIFORM.SUBSCRIBE_ID% TYPE;
v_time date  := to_date( '2015/3/20 16:24:23','yyyy-mm-dd hh24:mi:ss' );
CURSOR C_MOVE2HIS IS
 SELECT SUBSCRIBE_ID FROM TI_C_IOM_BUSIFORM where accept_date <= v_time;
 
BEGIN
  o_count :=0;
  OPEN C_MOVE2HIS;
  LOOP
    FETCH C_MOVE2HIS INTO V_SUBSCRIBE_ID;
    EXIT WHEN C_MOVE2HIS%NOTFOUND;
    BEGIN
       SELECT COUNT (*) INTO V_COUNT from  TI_C_IOM_BUSIFORM where accept_date <= v_time;
       IF(V_COUNT > 0 ) THEN
            INSERT INTO TI_CH_IOM_BUSIFORM
            (BUSIFORM_ID,DAY,TRADE_ID,TRADEGROUP_ID,TRADEGROUP_NUM,TRADEGROUP_INDEX,BUSIFORM_TYPE,SUBSCRIBE_ID,BUSIFORM_OPER_TYPE,BUSINESS_TYPE,STATUS,NET_TYPE_CODE,ADDRESS_CODE_A,ADDRESS_CODE_Z,FLOW_TEMPLET_ID,IN_MODE_CODE,DBSRC,BPM_MAIN_ID,ORDER_ID,PRIORITY,SUGGEST_TIME,CONFIRM_RES_NO,PROD_SPEC_ID,RES_TEMPLET_ID,ACCEPT_DATE,EXEC_TIME,EXEC_MONTH,LATEST_FINISH_TIME,PLAN_FINISH_TIME,FINISH_TIME,SRC_TYPE,BUSIFORM_EXTEND,USER_ID,TRADE_STAFF_ID,TRADE_EPARCHY_CODE,TRADE_CITY_CODE,TRADE_DEPART_ID,AREA_CODE,SERIAL_NUMBER,BUSIFORM_CUST_TYPE,TERM_IP,CUST_CLASS_ID,CUST_ID,CUST_NAME,CUST_LINK_NAME,CUST_LINK_PHONE,PRODUCT_ID,PRODUCT_NAME,ERROR_TYPE, ERROR_CODE,ERROR_DESC,CLOSE_SATISFY_DEGREE,CLOSE_DESC,RSRV_STR1,RSRV_STR2,RSRV_STR3,RSRV_DATE1,RSRV_DATE2, REMARK)
            ( select BUSIFORM_ID,DAY,TRADE_ID,TRADEGROUP_ID,TRADEGROUP_NUM,TRADEGROUP_INDEX,BUSIFORM_TYPE,SUBSCRIBE_ID,BUSIFORM_OPER_TYPE,BUSINESS_TYPE,STATUS,NET_TYPE_CODE,ADDRESS_CODE_A,ADDRESS_CODE_Z,FLOW_TEMPLET_ID,IN_MODE_CODE,DBSRC,BPM_MAIN_ID,ORDER_ID,PRIORITY,SUGGEST_TIME,CONFIRM_RES_NO,PROD_SPEC_ID,RES_TEMPLET_ID,ACCEPT_DATE,EXEC_TIME,EXEC_MONTH,LATEST_FINISH_TIME,PLAN_FINISH_TIME,FINISH_TIME,SRC_TYPE,BUSIFORM_EXTEND,USER_ID,TRADE_STAFF_ID,TRADE_EPARCHY_CODE,TRADE_CITY_CODE,TRADE_DEPART_ID,AREA_CODE,SERIAL_NUMBER,BUSIFORM_CUST_TYPE,TERM_IP,CUST_CLASS_ID,CUST_ID,CUST_NAME,CUST_LINK_NAME,CUST_LINK_PHONE,PRODUCT_ID,PRODUCT_NAME,ERROR_TYPE, ERROR_CODE,ERROR_DESC,CLOSE_SATISFY_DEGREE,CLOSE_DESC,RSRV_STR1,RSRV_STR2,RSRV_STR3,RSRV_DATE1,RSRV_DATE2, REMARK
             from  TI_C_IOM_BUSIFORM
             where SUBSCRIBE_ID =  V_SUBSCRIBE_ID
               and accept_date <= v_time);
             delete FROM TI_C_IOM_BUSIFORM
             where SUBSCRIBE_ID =  V_SUBSCRIBE_ID
             and accept_date <= v_time;
            o_count := o_count + 1;
        END IF ;
      commit;  
    EXCEPTION
        WHEN OTHERS THEN
           rollback;
           delete from TI_CH_IOM_BUSIFORM
            where SUBSCRIBE_ID =  V_SUBSCRIBE_ID;
            commit;
    END;
  END LOOP;
  close C_MOVE2HIS;
end movetohistory_1;

2、存储过程,加自定义exception,并改进,由外部传参数

--存储过程
create or replace
procedure movetohistory ( o_time in date,
                          o_count out number ) IS
V_COUNT number;
V_SUBSCRIBE_ID TI_C_IOM_BUSIFORM.SUBSCRIBE_ID% TYPE;
v_time date := o_time;
v_error exception; --自定义异常
CURSOR C_MOVE2HIS IS
 SELECT SUBSCRIBE_ID FROM TI_C_IOM_BUSIFORM where accept_date <= v_time;
BEGIN
  o_count :=0;
  SELECT COUNT (*) INTO V_COUNT from  TI_C_IOM_BUSIFORM where accept_date <= v_time;
  if(V_COUNT <= 0 ) then
   raise v_error;
  end if;
  OPEN C_MOVE2HIS;
  LOOP
    FETCH C_MOVE2HIS INTO V_SUBSCRIBE_ID;
    EXIT WHEN C_MOVE2HIS%NOTFOUND;
    BEGIN
    SELECT COUNT (*) INTO V_COUNT from  TI_C_IOM_BUSIFORM where accept_date <= v_time;
    IF(V_COUNT > 0 ) THEN
         INSERT INTO TI_CH_IOM_BUSIFORM
        (BUSIFORM_ID,DAY,TRADE_ID,TRADEGROUP_ID,TRADEGROUP_NUM,TRADEGROUP_INDEX,BUSIFORM_TYPE,SUBSCRIBE_ID,BUSIFORM_OPER_TYPE,BUSINESS_TYPE,STATUS,NET_TYPE_CODE,ADDRESS_CODE_A,ADDRESS_CODE_Z,FLOW_TEMPLET_ID,IN_MODE_CODE,DBSRC,BPM_MAIN_ID,ORDER_ID,PRIORITY,SUGGEST_TIME,CONFIRM_RES_NO,PROD_SPEC_ID,RES_TEMPLET_ID,ACCEPT_DATE,EXEC_TIME,EXEC_MONTH,LATEST_FINISH_TIME,PLAN_FINISH_TIME,FINISH_TIME,SRC_TYPE,BUSIFORM_EXTEND,USER_ID,TRADE_STAFF_ID,TRADE_EPARCHY_CODE,TRADE_CITY_CODE,TRADE_DEPART_ID,AREA_CODE,SERIAL_NUMBER,BUSIFORM_CUST_TYPE,TERM_IP,CUST_CLASS_ID,CUST_ID,CUST_NAME,CUST_LINK_NAME,CUST_LINK_PHONE,PRODUCT_ID,PRODUCT_NAME,ERROR_TYPE, ERROR_CODE,ERROR_DESC,CLOSE_SATISFY_DEGREE,CLOSE_DESC,RSRV_STR1,RSRV_STR2,RSRV_STR3,RSRV_DATE1,RSRV_DATE2, REMARK)
        ( select BUSIFORM_ID,DAY,TRADE_ID,TRADEGROUP_ID,TRADEGROUP_NUM,TRADEGROUP_INDEX,BUSIFORM_TYPE,SUBSCRIBE_ID,BUSIFORM_OPER_TYPE,BUSINESS_TYPE,STATUS,NET_TYPE_CODE,ADDRESS_CODE_A,ADDRESS_CODE_Z,FLOW_TEMPLET_ID,IN_MODE_CODE,DBSRC,BPM_MAIN_ID,ORDER_ID,PRIORITY,SUGGEST_TIME,CONFIRM_RES_NO,PROD_SPEC_ID,RES_TEMPLET_ID,ACCEPT_DATE,EXEC_TIME,EXEC_MONTH,LATEST_FINISH_TIME,PLAN_FINISH_TIME,FINISH_TIME,SRC_TYPE,BUSIFORM_EXTEND,USER_ID,TRADE_STAFF_ID,TRADE_EPARCHY_CODE,TRADE_CITY_CODE,TRADE_DEPART_ID,AREA_CODE,SERIAL_NUMBER,BUSIFORM_CUST_TYPE,TERM_IP,CUST_CLASS_ID,CUST_ID,CUST_NAME,CUST_LINK_NAME,CUST_LINK_PHONE,PRODUCT_ID,PRODUCT_NAME,ERROR_TYPE, ERROR_CODE,ERROR_DESC,CLOSE_SATISFY_DEGREE,CLOSE_DESC,RSRV_STR1,RSRV_STR2,RSRV_STR3,RSRV_DATE1,RSRV_DATE2, REMARK
         from  TI_C_IOM_BUSIFORM
         where SUBSCRIBE_ID =  V_SUBSCRIBE_ID
         and accept_date <= v_time);
         delete FROM TI_C_IOM_BUSIFORM
         where SUBSCRIBE_ID =  V_SUBSCRIBE_ID
         and accept_date <= v_time;
         o_count := o_count + 1;
    end if ;
    commit; 
    EXCEPTION
        WHEN OTHERS THEN
           rollback;
           delete from TI_CH_IOM_BUSIFORM
            where SUBSCRIBE_ID =  V_SUBSCRIBE_ID;
            commit;
    END;
  END LOOP;
  close C_MOVE2HIS;
  exception
   when v_error then
          RAISE_APPLICATION_ERROR(- 20010, 'data is not exists!' );
end movetohistory;
--存储过程调用
set serveroutput on;
declare
v_date date  := to_date( '2015/3/24 19:19:21','yyyy-mm-dd hh24:mi:ss' );
o_count number;
begin
o_count := 0;
movetohistory(v_date,o_count);
dbms_output.put_line( 'o_count:'||o_count);
end;

exec 存储过程名;

--存储过程赋权限
grant create any table to username;
grant create any procedure to username;
grant execute any procedure to username;

二、匿名块

--匿名块:在控制台实现简单输出(输入暂时没实现)
SET SERVEROUTPUT ON;
declare
v_flow_templet_id TD_M_NODE_TEMPLET.flow_templet_id% type;
v_node_templet_id TD_M_NODE_TEMPLET.node_templet_id% type;
begin
--v_node_templet_id := &请输入节点名;   -- 这块还没有实现,总是报没有声明的错
v_node_templet_id := 'BIZOPPORDER';
SELECT flow_templet_id into v_flow_templet_id FROM TD_M_NODE_TEMPLET a WHERE node_templet_id = v_node_templet_id;
dbms_output.put_line(v_flow_templet_id);
EXCEPTION
--WHEN NO_DATA_FOUND THEN
--dbms_output.put_line('未找到数据');
WHEN OTHERS THEN
dbms_output.put_line( '@SQLCODE IS '||SQLCODE ||' AND @SQLERRM is '||SQLERRM);
end;

三、函数

1、函数简单示例

create or replace function tomorrow
return date --必须有返回
is
  today date; --返回值在声明部分
  nextdate date;
begin
  today := sysdate;
  nextdate := today + 1;
return nextdate; --return
exception
when others then
  return '-1';  --异常部分有return
end;

2、通过给函数传参数调用函数

--函数:有入参
create or replace function find_flow_name(node_temid in varchar2)
return VARCHAR2
is
v_flow_templet_id TD_M_NODE_TEMPLET.flow_templet_id% type;
begin
SELECT flow_templet_id into v_flow_templet_id FROM TD_M_NODE_TEMPLET a WHERE node_templet_id = node_temid;
dbms_output.put_line(v_flow_templet_id);
return v_flow_templet_id;
EXCEPTION
--WHEN NO_DATA_FOUND THEN
--dbms_output.put_line('未找到数据');
WHEN OTHERS THEN
dbms_output.put_line( '@SQLCODE IS '||SQLCODE ||' AND @SQLERRM is '||SQLERRM);
return '-1' ;
end find_flow_name;
--调用函数
set serveroutput on;
declare
v_node_name varchar2( 20):= 'ToOrder_PreOrderFZX1' ;
v_flow_name VARCHAR2( 20);
begin
--v_node_name := 'ToOrder_PreOrderFZX1';
v_flow_name := find_flow_name(v_node_name);
dbms_output.put_line( '流程名:'|| v_flow_name);
exception
when others THEN
dbms_output.put_line( SQLCODE||' AND ' ||SQLERRM);
end;

四、SQLCODE和SQLERRM使用

set SERVEROUTPUT on;
DECLARE
v_error VARCHAR2( 500);
BEGIN
v_error:=SQLERRM;
dbms_output.put_line( '@SQLCODE IS '||SQLCODE ||' AND @SQLERRM is '||SQLERRM);
END;
时间: 2024-10-30 01:45:51

oracle存储过程、匿名块、函数、包的相关文章

oracle存储过程和存储函数&amp;触发器

oracle存储过程和存储函数 指存储在数据库中供所有用户程序调用的子程序叫存储过程,存储函数 存储过程和存储函数的相同点:完成特定功能的程序 存储过程和存储函数的区别:是否用return语句返回值 =========================创建和使用存储过程============================= 用create procedure命令建立存储过程和存储函数 语法: create [or replace] procedure 过程名(参数列表) as PLSQL子程序

oracle存储过程和自定义函数

create [or replace] PRocedure 过程名(参数列表) AS PLSQL 子程序体; 存储过程写完之后,要调用这个存储过程; 有两种方法: 1.exec 存储过程名(); 2.PL/SQL begin 存储过程名(); end; / 如何调试和运行PL/SQL 语句; 进入debeg 模式 函数(Function)为一命名的存储程序;可带参数,并返回一计算值:用PL/SQL 语句的写的程序; 函数和过程的结构类似,但是必须有一个RETURN 子句,用于返回函数值; cre

【Oracle 存储过程和存储函数】 (3) 存储函数

例子:查询某个员工的年收入 1 --存储函数:查询某个员工的年收入 2 create or replace function queryempincome(eno in number) 3 return number 4 as 5 --定义变量保存员工的薪水和奖金 6 psal emp1.sal%type; 7 pcomm emp1.comm%type; 8 9 begin 10 --得到该员工的月薪和奖金 11 select sal,comm into psal,pcomm from emp1

oracle 存储过程,存储函数,包,

http://heisetoufa.iteye.com/blog/366957 认识存储过程和函数 存储过程和函数也是一种PL/SQL块,是存入数据库的PL/SQL块.但存储过程和函数不同于已经介绍过的PL/SQL程序,我们通常把PL/SQL程序称为无名块,而存储过程和函数是以命名的方式存储于数据库中的.和PL/SQL程序相比,存储过程有很多优点,具体归纳如下: * 存储过程和函数以命名的数据库对象形式存储于数据库当中.存储在数据库中的优点是很明显的,因为代码不保存在本地,用户可以在任何客户机上

oracle 存储过程,函数和包

创建存储过程: 语法:create [or replace] PROCEDURE 过程名(参数列表) AS PLSQL子程序体: 调用 存储过程的方式 两种1.execute(exec)     ------exec  函数名()2.begin          函数名()   end           -------begin  函数名()end 函数(Function)为一命名的存储程序,可带参数,并返回一计算值.函数和过程的结构类似,但必须有一个RETURN子句,用于返回函数值.函数说明

Oracle03——游标、异常、存储过程、存储函数、触发器和Java代码访问Oracle对象

作者: kent鹏 转载请注明出处: http://www.cnblogs.com/xieyupeng/p/7476717.html 1.游标(光标)Cursor 在写java程序中有集合的概念,那么在pl/sql中也会用到多条记录,这时候我们就要用到游标,游标可以存储查询返回的多条数据. 语法: CURSOR  游标名  [ (参数名  数据类型,参数名 数据类型,...)]  IS  SELECT   语句; 例如:cursor c1 is select ename from emp; 游标

Oracle 存储过程定义和优点及与函数区别

定义: 存储过程(Stored Procedure )是一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中.用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它.存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程. 存储过程是由流控制和SQL 语句书写的过程,这个过程经编译和优化后存储在数据库服务器中,应用程序使用时只要调用即可.在ORACLE 中,若干个有联系的过程可以组合在一起构成程序包. 优 点: 1.(预编译)存储过程只在创造

在Java语言中调用存储过程、存储函数、包头、包体

需要拷贝连接Oracle的jar包,路径如下图所示: 连接Oracle数据库的代码: package demo.utils; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class JDBCUtils { private static Stri

oracle学习笔记之存储过程与存储函数

存储过程与存储函数说明:存储函数有返回值!存储过程没有返回值! 指存储在数据库中供所有用户程序调用的子程序叫存储过程.存储函数. 什么时候用存储过程/存储函数 原则:如果只有一个返回值,用存储函数:否则,就用存储过程. 1.创建存储过程 用CREATE PROCEDURE命令建立存储过程.语法如下: create [or replace] PROCEDURE 过程名[(参数列表)] AS     变量声明 PLSQL子程序体: 1)存储过程入门: create or replace proced