開發子過程

          ?1? 開發過程
          ?1) 建立過程:不帶參數
          ? create or replace procedure out_time
          ? is
          ? begin
          ??? dbms_output.put_line(systimestamp);
          ? end;
          ? a 使用execute 命令調用過程
          ?? set? serveroutput on
          ?? exec out_time;
          ? b 使用call 命令調用過程
          ?? set serveroutput on
          ?? call out_time();
          ?2) 建立過程:帶有in參數 默認為輸入參數,另外也可以使用in 關鍵子顯示的定義
          ?? 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,'雇員號不能重復');
          ????? when e_integrity then
          ??????? raise_application_error(-20001,'部門號不存在');
          ???
          調用
          ?? exec add_employee(111,'clark',200,'manager',10);
          ?? 3 建立過程,帶有out 參數
          ??? 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;
          ???
          ??? 調用
          ??? var name varchar2(10)
          ??? var salary number
          ??? exec query_employee(7788,:name,:salary);
          ??? print name,salary;
          ??? 4 建立過程,帶有in out 參數
          ??? 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;?
          ???
          ??? 調用
          ??? var n1 number
          ??? var n2 number
          ??? exec :n1:=100;
          ??? exec :n2:=30
          ??? exec compute(:n1,:n2)
          ??? print n1 n2
          ??? 5) 為參數傳遞變量和數據 位置傳遞,名稱傳遞,組合傳遞
          ??? 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) 顯示當前用戶的所有程序及其源代碼
          ???? select text from user_source where name='add_dept';
          ?? 7) 刪除過程
          ???? drop procedure add_dept;
          2 開發函數
          ? 可以在sql語句和其他子過程中執行。
          ? 1 建立函數,不帶任何參數
          ? 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;
          ? --使用變量接收函數返回值
          ?? var v2 varchar2(100)
          ?? exec :v1:=get_user
          ?? print v1;
          ?-- 在sql 語句中直接調用函數
          ?? select get_user from dual;
          ?-- 使用dbms_output 調用函數
          ?? set serveroutput on
          ?? exec dbms_output.put_line('get_user');
          ?2) 建立函數,帶有in 參數
          ?? 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) 建立函數,帶有out 參數
          ?? 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 參數
          ? 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) 函數調用的限制
          ? -- 在sql 語句中只能調用存儲函數
          ? -- 在sql 語句中只能調用帶有輸入參數in ,而不能有輸出參數out 和in out 參數的函數
          ? -- 在sql 語句中調用的函數的參數必須是標準的sql 數據類型,不能是pl/sql 所特有的數據類型
          ? -- 在sql 語句中調用的函數不能包含insert,update 和delete
          ?6) 查看源代碼
          ? set pagesize 40
          ? select text form user_source where name='result';
          ?7) 刪除函數
          ? drop function result;
          ?3 管理子程序
          ? 1) 列出當前用戶的子程序
          ?? 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
          ??? --使用數據字典user_errors? 確定錯誤原因和位置
          ???? select line||'/'||position as "line/col",text error
          ???? from user_errors where name='raise_salary';
          ?? 4) 列出對象的依賴關系
          ??? -- 使用 user_dependenciess 確定直接依賴關系
          ??? select name,type from user_dependencies
          ??? where referenced_name='emp'
          ??? -- 使用 deptree 和 ideptree 確定依賴和見解依賴關系
          ??? select nested_level,name,type from deptree;
          ?? 5) 重新編譯子程序
          ???? 當被應用對象的結構被修改以后,就會將相關依賴對象轉變為無效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 康文 閱讀(295) 評論(0)  編輯  收藏 所屬分類: 數據庫

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

          導航

          統計

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 登封市| 达州市| 大田县| 长沙市| 马龙县| 呼图壁县| 贺州市| 如东县| 江油市| 永清县| 闸北区| 伊春市| 平潭县| 措美县| 清涧县| 隆子县| 乐业县| 神农架林区| 陆良县| 易门县| 垦利县| 克东县| 屏边| 治多县| 洱源县| 松滋市| 胶南市| 印江| 荣昌县| 佳木斯市| 三江| 金门县| 淳化县| 溧水县| 福鼎市| 松潘县| 中卫市| 新和县| 拉孜县| 清涧县| 昭通市|