首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > 其他数据库 >

Oracle系列之6-Procedure-Package-Purity

2012-07-20 
Oracle系列之六----Procedure--Package--PurityOracle系列之一----Datatype And Subprogram:http://oversh

Oracle系列之六----Procedure--Package--Purity

Oracle系列之一----Datatype And Subprogram:http://overshit.iteye.com/admin/blogs/932585;
Oracle系列之二----Exception And Expression:http://overshit.iteye.com/admin/blogs/932605;
Oracle系列之三----Implicit Cursor:http://overshit.iteye.com/admin/blogs/932609;
Oracle系列之四----Dynamic Cursor:http://overshit.iteye.com/admin/blogs/932610;
Oracle系列之五----Cursor And Variable:http://overshit.iteye.com/admin/blogs/932612;
Oracle系列之六----Procedure--Package--Purity:http://overshit.iteye.com/admin/blogs/932615;
Oracle系列之七----Trigger:http://overshit.iteye.com/admin/blogs/932616;

?

?

----procedure:parameter type:in,out,in out;default in,we do not need appoint parameter datatype of procedure;----parameter:indrop table tb;select * from tb;create table tb(  tbname varchar2(50))create or replace procedure in_pro_one(columnname in varchar2)isv_tname customer.custname%type;begin  select custname into v_tname from customer where custid = columnname;  dbms_output.put_line(v_tname);  exception  when no_data_found then    raise_application_error(-20001,'no data!');end;call in_pro_one('96');drop table temp;create table temp(  tid varchar2(10),  tname varchar2(20))select * from temp;create or replace procedure sp_insert(p_tid varchar2,p_tname varchar2)isbegin  insert into temp values(p_tid,p_tname);  commit;end;call sp_insert('5','Five');----parameter:outcreate or replace procedure pro_out(p_tid in number,p_errMsg out varchar2)asv_tname customer.custname%type;----v_tname varchar(10);begin  select custname into v_tname from customer where custage = p_tid;  dbms_output.put('   ' || v_tname);  exception    when no_data_found then      p_errMsg := 'no customer:' || v_tname;    when too_many_rows then      p_errMsg := v_tname || '  mapping too many rows!';    when others then      p_errMsg := 'unknown exception!';end;----call procedure:update customer set custage = 100 where custid = 96declarev_err varchar2(200);begin  dbms_output.put('Shut  ' || v_err);  pro_out(100,v_err);  dbms_output.put_line('   Up   ' || v_err);end;----parameter in outcreate or replace procedure pro_in_out(pro_msg in out varchar2)isv_msg varchar2(200);begin  select custname into v_msg from customer where custid = pro_msg;  pro_msg := v_msg;  exception    when no_data_found then      pro_msg := 'no customer';    when too_many_rows then      pro_msg := 'mapping too many rows!';    when others then      pro_msg := 'unknown exception!';end;declarev_error varchar2(200) := '96';begin  dbms_output.put('Shut  ');  pro_in_out(v_error);  dbms_output.put_line('   Up   ' || v_error);end;----look up and delete procedureselect * from user_source where lower(name) = 'pro_in_out';delete procedure pro_in_out;----create functiondrop table temp;create table temp(  tid varchar2(10),  tname varchar2(20))insert into temp values ('1','meilin');insert into temp values ('2','bing');insert into temp values ('3','qing');select * from temp;create or replace function func_temp(v_tid number)return varchar2isv_tname varchar2(10);begin  select tname into v_tname from temp where tid = v_tid;  return v_tname;end;----call:pl/sql and command line----call function by pl/sql way:declarev_tname varchar2(10);begin  ----v_tname := func_temp(v_tid >= 1);  select func_temp(1) into v_tname from dual;  dbms_output.put_line(v_tname);end;----call function by command line way:----define variablevar v_tname varchar2;----execute := v_tnameexec :v_tname :=func_temp(1);create or replace function func_row(v_tid number)return temp%rowtypeisrowdata temp%rowtype;begin  select * into rowdata from temp where tid = v_tid;  return rowdata;  exception    when others then      dbms_output.put_line('error:' || sqlerrm);end;----call func_row by pl/sql way:declare  v_rowdata temp%rowtype;begin  v_rowdata := func_row(3);  dbms_output.put_line(v_rowdata.tid || '---' || v_rowdata.tname);end;----package:package head(such as interface) and package body(such as implementation),name should be the same;----package head:create or replace package pack_tempis  procedure sp_insert(p_tid varchar2,p_tname varchar2);  function func_temp(v_tid number)return varchar2;  function func_row(v_tid number)return temp%rowtype;end pack_temp;----package body:create or replace package body pack_tempis  procedure sp_insert(p_tid varchar2,p_tname varchar2)    is    begin      insert into temp values(p_tid,p_tname);      ----commit;      rollback;    end sp_insert;      function func_temp(v_tid number)return varchar2    is      v_tname varchar2(10);    begin      select tname into v_tname from temp where tid = v_tid;      return v_tname;    end func_temp;  function func_row(v_tid number)return temp%rowtype    is      rowdata temp%rowtype;    begin      select * into rowdata from temp where tid = v_tid;      return rowdata;      exception        when others then          dbms_output.put_line('error:' || sqlerrm);    end;end pack_temp;---call procedure/function in package:pl/sql way and command way:----call by pl/sql way:declarev_tname varchar2(10);begin  ----v_tname := func_temp(v_tid >= 1);  select pack_temp.func_temp(1) into v_tname from dual;  dbms_output.put_line(v_tname);end;----call by command way:----define variablevar v_tname varchar2;----execute := v_tnameexec :v_tname :=pack_temp.func_temp(1);----package and cursor:drop table temp;create table temp(  tid varchar2(10),  tname varchar2(20))insert into temp values ('1','meilin');insert into temp values ('2','bing');insert into temp values ('3','qing');create or replace package pack_cur is  ----weak cursor type  type pack_cur_type is ref cursor;  ----strong cursor type  cursor mycur return temp%rowtype;  procedure pro_getInfo(v_psql varchar2,v_pcur in out pack_cur_type);end pack_cur;create or replace package body pack_cur is  cursor mycur return temp%rowtype is select * from temp;  procedure pro_getInfo(v_psql varchar2,v_pcur in out pack_cur_type)  as  begin    open v_pcur for v_psql;    end pro_getInfo;  end pack_cur;  declare  v_pack_cur pack_cur.pack_cur_type;  rowdata temp%rowtype;begin  --v_pack_cur := pack_cur.mycur;  open pack_cur.mycur;  loop    fetch pack_cur.mycur into rowdata;    exit when pack_cur.mycur%notfound;    dbms_output.put_line(rowdata.tid || '---' || rowdata.tname);  end loop;  close pack_cur.mycur;end;----declare a cursor type in programme package standardcreate or replace package types  as    type cursorType is ref cursor;  end;----return resultset by using cursor:(temp as tbname)create or replace function func_ListTemp(temp varchar2)  return types.cursorType  as  v_cursor types.cursorType;  begin    ----temp as tbname;    open v_cursor for 'select * from ' || temp;    return v_cursor;  end;----return resultset by using procedure:create or replace procedure pro_ListTemp(v_tid varchar2,pro_cur in out types.cursorType)  as  begin    open pro_cur for 'select * from temp where tid = ' || v_tid;  end;/*oracle package purity level:    pragma restrict_references():程序辅助检验码,检查子程序纯度(purity),帮助检查子程序是否有违反规则,    一般用在函数上,但当函数调用存储过程时,也要做相应设置检查,这是为了避免在DML语句调用函数时正常执行而不至于产生错误;  grammar:pragmar restrict_references(function_name | default,) RNDS,WNDS,RNPS,WNPS) | ,TRUST);    RNDS,WNDS,RNPS,WNPS可同时指定,但当TRUST指定时,其它的被忽略,default指作用在该程序包上的所有子程序,函数;      RNDS(read no database state):规定子程序不能读取任何数据库状态信息(即不会查询数据库任何表,包括dual虚表);  RNPS(read no package state):规定子程序不能读取任何包状态信息,如变量等;  WNDS(write no database state):规定子程序不能向数据库写入任何信息(即不能修改数据库表);  WNPS(write no package state):规定子程序不能向程序包写入任何信息(即不能修改程序包变量值);    WNDS do not write table;RNDS do not read table;  WNPS do not write package variable;RNPS do not read package variable;  TRUST:指出子程序是可以相信的,不会违反一个或多个规则,该选项是需要的,当用Java或C写的函数通过PL/SQL调用时,因PL/SQL在运行时对他们不能检查*/create or replace package DefaultPragma as  function funcOne return number;  ----package restrict ?instructions  pragma restrict_references(funcOne,RNDS,RNPS);  pragma restrict_references(default,WNDS,WNPS,RNDS,RNPS);  function funcTwo return number;  function funcThree return number;end DefaultPragma;/create or replace package body DefaultPragma as  function funcOne return number is  begin    insert into temp(tid,tname) values ('one','funcOne');    return 1;  end funcOne;    function funcTwo return number is  begin    return 2;  end funcTwo;    ----this function against(violates) the default pragma  function funcThree return number is  begin    insert into temp(tid,tname) values ('three','funcThree');    return 3;  end funcThree;end DefaultPragma;/

?

Oracle系列SQL及数据库下载:http://download.csdn.net/source/3046868

?

?

?

?

?

?

?

?

?

?

?

?

热点排行