Oracle 存储过程 PROCEDURE

存储过程  

    一组用于完成特定数据库功能的SQL语句集,该SQL语句集经过编译后存储在数据库系统中。在使用时候,用户通过指定已经定义的存储过程名字并给出相应的存储过程参数来调用并执行它,从而完成一个或一系列的数据库操作。

    包含三部分:过程声明,执行过程部分,存储过程异常(可选)。

示例

create or replace procedure sp_
(  p_sResult   out integer,--返回值
   p_ID       in   number --ID
) 
as
      v_id       number(16);
      cursor  v_chac_cr  is
                select t.money from T001 t   where t.sid=p_ID;--游标
begin
   open v_chac_cr();
   loop
        fetch v_chac_cr into v_id; 
        exit when v_chac_cr%notfound;
        insert into F002(cnt)  values (v_id);
   end loop;
   close v_chac_cr;
   commit;
   p_sResult:=1;
exception--例外处理
   when others then
   p_sResult:=0;
   rollback;
end sp_;  

 项目运用

  1.获取表下一个ID值

CREATE OR REPLACE PROCEDURE PNEXTID
(
 tablename   IN   VARCHAR2 ,
 idno     OUT   NUMBER
)
IS
 sqlstring   VARCHAR2 ( 500 );
BEGIN
 sqlstring := 'SELECT nvl(max(id),0)+1 FROM ' ||tablename;
  execute immediate sqlstring into idno;               -- 动态执行
  merge into tSequence a using ( select idno as ID, tablename as Name from dual) b   --组合成表   merge into 确定表
  on (upper(a.Name)=upper(b.Name))                       --表名大写化
  when matched then update set a.ID= case when b.ID>a.ID then b.ID else a.ID+ 1 end   -- update;  case when   then  else  end;
  when not matched then insert (ID, Name ) values (b.ID,b.Name);                           --insert;
  select ID into idno from tSEQUENCE WHERE upper( name ) = upper(tablename);
EXCEPTION
  WHEN OTHERS THEN
   idno := - 1 ;
END pNextID;

 2.返回列表数据(游标)

CREATE OR REPLACE PROCEDURE SP_CONTENT (
      o_result out types.cursorType, --结果集
      ip_pwf  in varchar2) --关联流程     
as
   /*  --类型声明是游标变量
    create or replace package TestPackage is type outlist is ref cursor;
 */
  v_sql varchar2(1000);
  vn_count  numeric(12,0);
  vn_num    numeric(12,0);
  vn_id     numeric(12,0);
  vs_table  varchar2(30);
  vn_inst numeric(12,0);
begin
   vn_count:=length(ip_pwf);
   vn_num:=instr(ip_pwf,'.');
   vn_id:=to_number(substr(ip_pwf,1,vn_num-1));
   vs_table:=substr(ip_pwf,vn_num+1,vn_count-vn_num);
 begin
 v_sql:='select nvl(max(job_code),0)  from '||vs_table||' where company = '||vn_id||'';
 execute immediate v_sql into vn_inst;
 exception
   when others then
   vn_inst:=0;
 end;
 open o_result for
 select caller,enddate,content from tuser t where class_code < vn_inst;
end SP_CONTENT;

  

 

 

posted @ 2018-07-28 16:08  彩虹消失了  阅读(562)  评论(0编辑  收藏  举报