開發(fā)子過程

          ?1? 開發(fā)過程
          ?1) 建立過程:不帶參數(shù)
          ? create or replace procedure out_time
          ? is
          ? begin
          ??? dbms_output.put_line(systimestamp);
          ? end;
          ? a 使用execute 命令調(diào)用過程
          ?? set? serveroutput on
          ?? exec out_time;
          ? b 使用call 命令調(diào)用過程
          ?? set serveroutput on
          ?? call out_time();
          ?2) 建立過程:帶有in參數(shù) 默認(rèn)為輸入?yún)?shù),另外也可以使用in 關(guān)鍵子顯示的定義
          ?? create or replace procedure add_employee
          ?? (eno number,name varchar2,sal number,
          ??? job varchar default 'clerk',dno number)
          ?? is
          ?? e_integrity exception;
          ?? pragma exception_init(e_intgegrity,-2291);
          ?? begin
          ??? insert into emp(empno,ename,sal,job.deptno)
          ????? values(eno.name,sal,job,dno);
          ??? exception
          ????? when dup_val_on_index then
          ??????? raise_application_error(-20000,'雇員號不能重復(fù)');
          ????? when e_integrity then
          ??????? raise_application_error(-20001,'部門號不存在');
          ???
          調(diào)用
          ?? exec add_employee(111,'clark',200,'manager',10);
          ?? 3 建立過程,帶有out 參數(shù)
          ??? create or replcace procedure query_employee
          ??? (eno number,name out varchar2,salary out number)
          ??? is
          ??? begin
          ????? select ename,sal,into name,salary from emp where empno=eno;
          ??? exception
          ????? when no_data_found then
          ??????? raise_application_error(-20000,'G該雇員不存在');
          ??? end;
          ???
          ??? 調(diào)用
          ??? var name varchar2(10)
          ??? var salary number
          ??? exec query_employee(7788,:name,:salary);
          ??? print name,salary;
          ??? 4 建立過程,帶有in out 參數(shù)
          ??? create or replace procedure compute
          ??? (num1,in out number,num2 in out number)
          ??? is
          ?????? v1 number;
          ?????? v2 number;
          ??? begin
          ????? v1:=num1/num2;
          ????? v2:=mod(num1,num2);
          ????? num1:=v1;
          ????? num2:=v2;
          ??? end;?
          ???
          ??? 調(diào)用
          ??? var n1 number
          ??? var n2 number
          ??? exec :n1:=100;
          ??? exec :n2:=30
          ??? exec compute(:n1,:n2)
          ??? print n1 n2
          ??? 5) 為參數(shù)傳遞變量和數(shù)據(jù) 位置傳遞,名稱傳遞,組合傳遞
          ??? create or replace procedure add_dept
          ??? (dno number,dname varchar2 default null,loc varchar default null)
          ??? is
          ??? begin
          ????? insert into dept values(dno.dname,loc);
          ??? end;
          ??? -- 位置傳遞
          ???? exec add_dept(50,'sales','new york');
          ???? exec add_dept(60);
          ???? exec add_dept(70,'admin');
          ??? -- 名稱傳遞
          ???? exec add_dept(50,loc=>'new york');
          ???? exec add_dept(60,dname=>'sales',loc=>'new york');
          ?? 6) 顯示當(dāng)前用戶的所有程序及其源代碼
          ???? select text from user_source where name='add_dept';
          ?? 7) 刪除過程
          ???? drop procedure add_dept;
          2 開發(fā)函數(shù)
          ? 可以在sql語句和其他子過程中執(zhí)行。
          ? 1 建立函數(shù),不帶任何參數(shù)
          ? create or replace function get_user
          ? return varchar2
          ? is
          ??? v_user varchar2(100);
          ? begin
          ??? select username into v_user from user_users;
          ??? return v_user;
          ??? end;
          ? --使用變量接收函數(shù)返回值
          ?? var v2 varchar2(100)
          ?? exec :v1:=get_user
          ?? print v1;
          ?-- 在sql 語句中直接調(diào)用函數(shù)
          ?? select get_user from dual;
          ?-- 使用dbms_output 調(diào)用函數(shù)
          ?? set serveroutput on
          ?? exec dbms_output.put_line('get_user');
          ?2) 建立函數(shù),帶有in 參數(shù)
          ?? create or replace function get_sal(name in varchar2)
          ?? reutnr number
          ?? as
          ?? v_sal emp.sal%type;
          ?? begin
          ???? select sal into v_sal from emp where upper(ename)=upper(name);
          ???? return v_sal;
          ?? exception
          ???? when no_data_found then
          ?????? raise_application_error(-20000,'employee does not exist');
          ?? end;
          ?3) 建立函數(shù),帶有out 參數(shù)
          ?? create or replace function get_info
          ?? (name varchar2,title out varchar2)
          ?? return varchar2
          ?? as
          ???? deptname dept.dname%type;
          ?? begin
          ???? select a,job,b,dname into title,deptname from emp a,dept b
          ???? where a.deptno=b.deptno
          ???? and upper(a.ename)=uppder(name);
          ???? return deptname;
          ?? end;
          ?? var job varchar2(20)
          ?? var dname varchar2(20)
          ?? exec :dname:=get_info('scott',job);
          ?? print dname job

          ?4) 帶有 in out 參數(shù)
          ? create or replace function result
          ? (num1,number,num2 in out nu8mber)
          ? return number
          ? as
          ??? v_result number(6);
          ??? v_remainder number;
          ? begin
          ??? v_result:=num1/num2;
          ??? v_remainder:=mod(num1,num2);
          ??? num2:=v_remainder;
          ??? retrun v_result;
          ? exception
          ??? when zero_divide then
          ?????? raise_application_error(-20000,'zero divied');
          ? end;
          ?5) 函數(shù)調(diào)用的限制
          ? -- 在sql 語句中只能調(diào)用存儲函數(shù)
          ? -- 在sql 語句中只能調(diào)用帶有輸入?yún)?shù)in ,而不能有輸出參數(shù)out 和in out 參數(shù)的函數(shù)
          ? -- 在sql 語句中調(diào)用的函數(shù)的參數(shù)必須是標(biāo)準(zhǔn)的sql 數(shù)據(jù)類型,不能是pl/sql 所特有的數(shù)據(jù)類型
          ? -- 在sql 語句中調(diào)用的函數(shù)不能包含insert,update 和delete
          ?6) 查看源代碼
          ? set pagesize 40
          ? select text form user_source where name='result';
          ?7) 刪除函數(shù)
          ? drop function result;
          ?3 管理子程序
          ? 1) 列出當(dāng)前用戶的子程序
          ?? select object_name,created,status form user_objects
          ?? where object_type in ('procedure','function');
          ? 2)列出子程序源代碼
          ?? select text from user_sorce where name='raise_salary'
          ? 3)類出子程序編譯錯誤
          ??? -- show errors
          ??? --使用數(shù)據(jù)字典user_errors? 確定錯誤原因和位置
          ???? select line||'/'||position as "line/col",text error
          ???? from user_errors where name='raise_salary';
          ?? 4) 列出對象的依賴關(guān)系
          ??? -- 使用 user_dependenciess 確定直接依賴關(guān)系
          ??? select name,type from user_dependencies
          ??? where referenced_name='emp'
          ??? -- 使用 deptree 和 ideptree 確定依賴和見解依賴關(guān)系
          ??? select nested_level,name,type from deptree;
          ?? 5) 重新編譯子程序
          ???? 當(dāng)被應(yīng)用對象的結(jié)構(gòu)被修改以后,就會將相關(guān)依賴對象轉(zhuǎn)變?yōu)闊o效invalid ,需要重新編譯
          ???? 1
          ???? alter table emp add remark varchar2(100);
          ???? 2
          ???? select object_name,object_type from user_objects
          ???? where status='invalid'
          ???? 3
          ???? alter procedure add_employee compile;
          ???? alter view dept10 compile;
          ???? alter function get_info compile;
          ?????
          ??

          posted on 2006-10-11 14:51 康文 閱讀(297) 評論(0)  編輯  收藏 所屬分類: 數(shù)據(jù)庫

          <2006年10月>
          24252627282930
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          導(dǎo)航

          統(tǒng)計

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 湖口县| 泰和县| 西华县| 中卫市| 蕲春县| 都匀市| 房山区| 沾益县| 聂荣县| 竹北市| 赤城县| 桐城市| 安庆市| 普兰店市| 乾安县| 灵寿县| 出国| 陇川县| 栾川县| 克东县| 睢宁县| 亚东县| 武夷山市| 文成县| 米泉市| 洪雅县| 晋江市| 德昌县| 交城县| 武汉市| 板桥市| 东光县| 长岭县| 汝阳县| 南乐县| 宝丰县| 石城县| 兖州市| 南阳市| 鄄城县| 宁德市|