您所在的位置 : IT客 » 數據庫 » Oracle

oracle學習大全_3

[第七章 SQL*Plus 報表功能]

/**********************  插入內容:數據字典的一些說明 *****************************
(1) user_XXX:用戶,例如:user_tables
(2) dba_XXX: DBA專用
(3) all_XXX: 本用戶建的,或者其它用戶創建本用戶可以查詢的(需要其它用戶的授權)
(4) v$XXX: 動態數據字典,如:v$database, v$instance, v$session,這些數據字典在oracle不啓動時也能查詢
***********************************************************************************/
一、定義表頭與表尾
SQL> ttitle ''表頭''

SQL> btitile ''表尾''

失效:SQL> ttitle off
 SQL> btittle off

二、定義列名
語法:SQL> column 列名 heading 別名   // 別名不區分大小寫

三、定義列格式:
SQL> column 列名 Format 格式
常用列格式:An :  A爲字符,n爲最大字符寬度。

$99.9999.99
9.99eeee

例:SQL> Column sal format $99.9999.99
SQL> Column comm like Sal

四、分組命令:
語法:SQL> break on 列名 skip n
例:SQL> break on deptno skip 2
SQL> select * from emp order by deptno;

五、統計計算:
語法:SQL> compute 函數 of 統計列 on skip n  //可以使用的函數有:sum, max, min, avg,count, var(斜方差), std(標準差)
例:SQL> compute sum of sal on deptno
清除命令:SQL> clear compute
  SQL> clear break
  SQL> clear column

增加報表級統計:
SQL> break on deptno on REPORT
SQL> compute sum of sal on report
// 整個報表出一個結果,上面兩行都要運行,那麼整個報表會根據你的設置出一個sum of sal的總計結果。

[第八章 函數]

一、日期格式轉換函數:to_char(日期變量,''格式'')  // 格式要用單引號括起來

(1) 日期格式構成方法:

  年   月   日   時    分  秒
  yy    mm   dd   hh(12小時制)  mi  ss
  yyyy   mon   dy(星期)  hh24(24小時制)
     month  day  
 
A. yy.mm.dd, yy/mm/dd, yy-mm-dd, yyyy.mm.dd, ... 加中文也可以,中文要用又引號括起來

SQL>select to_char(sysdate, ''yyyy-mm-dd hh24:mi:ss'') from dual;  // dual是一個虛擬表,任何用戶都可以使用。

二、聚組函數:從一組中返回彙總信息
聚組函數有:Sum, count, count distinct, max, min, avg, stddev(標準差)

例:SQL>select min(sal), max(sal), avg(sal), sum(sal) form emp;
SQL> select ename, job, sal from emp where sal=(slect max(sal) from emp);
SQL> select count(*) from emp;
.....[請參考PowerPiont教程:SQL講稿.ppt]

[第九章 複雜查詢]

一、連接查詢:
問:Smith在哪裏工作?
答:SQL> select loc from dept, emp where ename = ''SMITH'' and emp.deptno = dept.deptno;

二、集合查詢[請參考PowerPiont教程:SQL講稿.ppt P29,30,31]
集合操作是將多個基表的查詢結果作UNION運算。
交操作: Intersect
差操作:MINUS

三、子查詢(Subqueries):
子查詢是在where子句中包含的查詢語句,是由系列簡單構成的複雜查詢。

問:誰與smith在同一部門工作?
答:SQL> select deptno from emp where ename = ''SMITH'';
SQL> select ename from emp where deptno = 20;

將兩個語句合起來:Select ename from emp where deptno = ( select deptno from emp where ename = ''SMITH'');

[第十章 Oracle 權限設置]

一、權限分類:
系統權限:系統規定用戶使用數據庫的權限。(系統權限是對用戶而言)。

實體權限:某種權限用戶對其它用戶的表或視圖的存取權限。(是針對錶或視圖而言的)。

二、系統權限管理:
1、系統權限分類:
DBA: 擁有全部特權,是系統最高權限,只有DBA纔可以創建數據庫結構。

RESOURCE:擁有Resource權限的用戶只可以創建實體,不可以創建數據庫結構。

CONNECT:擁有Connect權限的用戶只可以登錄Oracle,不可以創建實體,不可以創建數據庫結構。

對於普通用戶:授予connect, resource權限。
對於DBA管理用戶:授予connect,resource, dba權限。

2、系統權限授權命令:
[系統權限只能由DBA用戶授出:sys, system(最開始只能是這兩個用戶)]
授權命令:SQL> grant connect, resource, dba to 用戶名1 [,用戶名2]...;

[普通用戶通過授權可以具有與system相同的用戶權限,但永遠不能達到與sys用戶相同的權限,system用戶的權限也可以被回收。]

例:
SQL> connect system/manager
SQL> Create user user50 identified by user50;
SQL> grant connect, resource to user50;

查詢用戶擁有哪裏權限:
SQL> select * from dba_role_privs;
SQL> select * from dba_sys_privs;
SQL> select * from role_sys_privs;

刪除用戶:SQL> drop user 用戶名 cascade;  //加上cascade則將用戶連同其創建的東西全部刪除

3、系統權限傳遞:
增加WITH ADMIN OPTION選項,則得到的權限可以傳遞。

SQL> grant connect, resorce to user50 with admin option;  //可以傳遞所獲權限。

4、系統權限回收:系統權限只能由DBA用戶回收
命令:SQL> Revoke connect, resource from user50;

系統權限無級聯,即A授予B權限,B授予C權限,如果A收回B的權限,C的權限不受影響;系統權限可以跨用戶回收,即A可以直接收回C用戶的權限。

三、實體權限管理
1、實體權限分類:select, update, insert, alter, index, delete, all  //all包括所有權限
execute  //執行存儲過程權限

user01:
SQL> grant select, update, insert on product to user02;
SQL> grant all on product to user02;

user02:
SQL> select * from user01.product;

// 此時user02查user_tables,不包括user01.product這個表,但如果查all_tables則可以查到,因爲他可以訪問。

3. 將表的操作權限授予全體用戶:
SQL> grant all on product to public;  // public表示是所有的用戶,這裏的all權限不包括drop。

[實體權限數據字典]:
SQL> select owner, table_name from all_tables; // 用戶可以查詢的表
SQL> select table_name from user_tables;  // 用戶創建的表
SQL> select grantor, table_schema, table_name, privilege from all_tab_privs; // 獲權可以存取的表(被授權的)
SQL> select grantee, owner, table_name, privilege from user_tab_privs;   // 授出權限的表(授出的權限)

4. DBA用戶可以操作全體用戶的任意基表(無需授權,包括刪除):
DBA用戶:
SQL> Create table stud02.product(
 id number(10),
 name varchar2(20));
SQL> drop table stud02.emp;

SQL> create table stud02.employee
 as
 select * from scott.emp;
 
5. 實體權限傳遞(with grant option):
user01:

SQL> grant select, update on product to user02 with grant option; // user02得到權限,並可以傳遞。

6. 實體權限回收:
user01:
SQL>Revoke select, update on product from user02;  //傳遞的權限將全部丟失。

四、同義詞(Synonym):

1、創建私有同義詞:
語法:SQL> create synonym 同義詞名 for 代替項;

user01:
SQL> grant select, upate on product to user02;

user02:
SQL> Create synonym product for user01.product;

SQL> select * from product;  // 這裏的product即user01.product。

同義詞數據字典:
SQL> select synonym_name, owner, table_name from all_synonyms;
SQL> select synonym_name, table_name from user_synonyms;

2、DBA可以創建公共同義詞(Public Synonym):公共同義詞全體用戶可以存取
語法:SQL> create public synonym 公共同義詞名 for 代替項;

SCOTT:
SQL> grant select on payment to public;

SYSTEM:
SQL> create public synonym payment for scott.payment;

3. 刪除同義詞:
User:SQL> drop synonym 私有同義詞名;

DBA: SQL> drop public synonym 公共同義詞名;

[PL/SQL程序設計]

一、PL/SQL概述
PL/SQL塊結構:
Declare
 -- 變量定義部分
Begin
 -- 可執行語句
Exception
  -- 例外處理:對於程序運行中的錯誤信息、警告信息的說明
End;
.  // 以.號結束程序編寫

二、PL/SQL語言的特點(參考PowerPoint教程)
1. PL/SQL中可以定義變量,變量有其作用範圍。
2. PL/SQL是以塊的方式設計,塊中可以嵌套子塊,子塊可以位於塊中任何部分。
3.

x. PL/SQL是以塊爲單位,SQL語句以語句爲單位。

7. 減少對Oracle核心的訪問,降低網絡負載。

三、PL/SQL與SQL語言(參考PowerPoint教程)
1. PL/SQL語句不能使用DDL語句。
可以使用的SQL語句:Insert, Update, Delete, [select into], commit, rollback, savepoint

四、PL/SQL基礎
1. 變量的使用
2. 單行註釋:--
  多行註釋:/*   */

3. 數據類型:
(1)布爾型: Boolean(TRUE, FALSE, NULL)
(2)數字型:NUMBER
INT = INTEGER

(3) 字符型,基本上沒有變化
(4) 日期型
(5) 二進制數據:raw, blob

4. 數據定義:
 變量名 數據類型
 變量名 數據類型:=初始值

5. 變量賦值:變量 := 值;

[*]%TYPE:數據類型匹配

s1 char(20);
s2 s1%TYPE; // 定義s2變量,其類型與s1完全匹配。

v_sal emp.sal%type;  // v_sal變量的類型與emp表中的sal字段的數據類型完全匹配,%TYPE最經常使用的方法

[*] %ROWTYPE: 行類型,用於存儲數據庫基表的一條記錄。
定義方法:變量 基表名%rowtype;

例:
SQL> set serveroutput on  // 使能屏幕打印函數的輸出

Declare // 如果PL/SQL程序中沒有定義變量,那麼Declare可以省略
 v_empno emp.empno%type := &empno;
 r emp%rowtype;
Begin
 select * into r from emp where empno = v_empno;
 dbms_output.put_line(''姓名''|| r.ename||''工資''||r.sal||''日期''||r.hiredate); 
 // r.字段名:表示某一列的值;dbms_output.putline()是一個屏幕打印函數
End;

[*] 記錄類型Record:
 record:
Declare
 v_empno emp.empno%type := &empno;
 // 定義record類型
 type r_emp is record(
  v1 emp.ename%type,
  v2 emp.job%type,
  v3 emp.hiredate%type);
 
 r r_emp;   -- 定義變量r爲record類型r_emp
Begin
 select ename, job, hiredate into r from emp where empno = v_empno;
 dbms_output.put_line(''姓名:''|| r.v1||''職務:''||r.v2||''工作時間:''||r.v3);
End;

[*] Table類型:類似於C語言中的結構類型數組:
定義方法:TYPE [table_emp] is Table of [emp.ename%type] index by binary_integer;  // []內爲用戶可以修改的部分

使用:mytable = table_emp;
 mytable(0) := ''SCOTT'';
 ...
例:
Declare
 v_empno emp.empno%type := &empno;
 type t_emp is table of emp.ename%type index by binary_integer;
 
 t t_emp;
Begin
 select ename into t(10) from emp where empno = v_empno;
 dbms_output.put_line(''編碼爲''||v_empno||''的員工是''||t(10));
End;

五、條件控制語句:條件判斷語句
1. IF-THEN語句:
IF 條件成立 THEN
 可執行語句; 
END IF;

Declare
       v_empno emp.empno%type :=&empno;
       v_ename emp.ename%type;
       v_sal emp.sal%type;
    Begin
      select sal,ename into v_sal,v_ename from emp
      where empno=v_empno;
      if v_sal<2000 then Begin
                  update emp set sal=sal+100
                  where empno=v_empno;
       dbms_output.put_line(''員工''||v_ename||''工資已經修改!'');
                                       End;
      End if;
    End;
   

2. IF-THEN-ELSE語句

IF 條件成立 THEN 
 執行語句1;
ELSE
 執行語句2;
END IF;

Declare
       v_empno emp.empno%type :=&empno;
       v_ename emp.ename%type;
       v_sal emp.sal%type;
Begin
      select sal,ename into v_sal,v_ename from emp
      where empno=v_empno;
      if v_sal<2000 then Begin
                  update emp set sal=sal+100
                  where empno=v_empno;
       dbms_output.put_line(''員工''||v_ename||''工資已經修改!'');
                                       End;
      Else dbms_output.put_line(''員工''||v_ename||''的工資已經超過規定值,不予更新!'');
      End if;
End;
 
3. IF-THEN-ELSIF語句
     IF       條件1成立  THEN  執行語句1;
     ELSIF 條件2成立  THEN   執行語句2;
     ELSIF 條件3成立  THEN   執行語句3;
     ...
     END  IF;
    
Declare
       v_empno emp.empno%type :=&empno;
       v_ename emp.ename%type;
       v_sal emp.sal%type;
    Begin
      select sal,ename into v_sal,v_ename from emp
      where empno=v_empno;
       if v_sal<2000 then Begin
                  update emp set sal=sal+100
                  where empno=v_empno;
        dbms_output.put_line(''員工''||v_ename||''工資已經修改!'');
                                       End;
        elsif v_sal<2500 then Begin
                  update emp set sal=sal+50
                  where empno=v_empno;
        dbms_output.put_line(''員工''||v_ename||''工資已經修改!'');
                                       End;
        elsif v_sal<3000 then Begin
                  update emp set sal=sal+10
                  where empno=v_empno;
        dbms_output.put_line(''員工''||v_ename||''工資已經修改!'');
                                       End;
        else dbms_output.put_line(''員工''||v_ename||''的工資已經超過規定值,不予更新!'');
        End if;
    End;
 
六、循環語句:
1. 基本循環:
LOOP
       執行語句;
EXIT WHEN 條件成立;
END LOOP;

例:
Declare
         v_deptno emp.deptno%type:=&deptno;
         i number(2):=0;
     Begin
         loop
           i := i +1;
           insert into emp(empno,hiredate,deptno)
           values(i+7200,sysdate,v_deptno);
           dbms_output.put_line(''i的當前值爲:''||i);
          exit when i=10;
          end loop;
    End;

2. WHILE循環:

WHILE 條件成立
LOOP 執行語句;
END LOOP;

Declare
         v_deptno emp.deptno%type:=&deptno;
         i number(2):=0;
     Begin
         while i  < 10   loop
           i := i +1;
           insert into emp(empno,hiredate,deptno)
           values(i+7200,sysdate,v_deptno);
           dbms_output.put_line(''i的當前值爲:''||i);
       --   exit when i=10;
          end loop;
    End;
   
3. FOR循環:
FOR 計數器 IN 低界..高界
LOOP 執行語句;
END LOOP;

例:
Declare
         v_deptno emp.deptno%type:=&deptno;
         i number(2):=0;
     Begin
         while i  < 10   loop
           i := i +1;
           insert into emp(empno,hiredate,deptno)
           values(i+7200,sysdate,v_deptno);
           dbms_output.put_line(''i的當前值爲:''||i);
       --   exit when i=10;
          end loop;
    End;

七、光標設計(Cursor):

1、什麼是光標?在PL/SQL中,當查詢語句執行結果超過一行時,爲處理每一行,必須定義一個cursor,叫光標。

2、光標使用方法:
(1) 定義光標:
語法:光標名 is select 語句;

(2) 打開光標:
語法:open 光標名;

(3) 取數據:
語法:Fetch 光標名 into 變量;

(4) 光標下移:使用loop循環

(5) 關閉光標:close 光標名;

例:
Declare
        v1 emp.empno%type;
        v2 emp.ename%type;
        v3 emp.sal%type;
        cursor c is select empno,ename,sal from emp;
     Begin
         open c;
         loop
         fetch  c into v1,v2,v3;
         if v3<3000 then Begin
                           update emp set sal=sal+100
                           where empno=v1;
                    dbms_output.put_line(''員工''||v2||''工資已經更新!'');
                                    End;
         end if;
         exit when c%NOTFOUND;
         end loop;
         close c;
     End;
/

-- //要求從emp表中取出按用戶輸入要求的前幾位工資最高的人員及其工資放入topsalary表中:
-- // 我的方法:
SQL>create table topsalary (
 name varchar2(20),
 sal number(7,2));
 
SQL>Declare
  vcount number(7) := &n;
  i number(7) :=0;
        vname emp.ename%type;
        vsal emp.sal%type;
        cursor c is select ename,sal from emp order by nvl(sal,0) desc; --// 使用nvl函數防止工資出現空值的情況,老師補充
     Begin
      delete topsalary;  -- // 先清空topsalary表
         open c;
        
         for i in 1 .. vcount loop
         fetch  c into vname, vsal;
        
         insert into topsalary values(vname,vsal);
        
         end loop;
         close c;
     End;
 
--//教師的方法
Declare
    i number(3) :=&i;
    j number(3) :=0;
   cursor c is select ename,sal from emp order by nvl(sal,0) desc;
   v1 emp.ename%type;
   v2 emp.sal%type;
Begin
   open c;
   loop
   j := j+1;
   fetch c into v1,v2;
   insert into topsalary  values(v1,v2);
   exit when j=i;
   end loop;
   close c;
End;

3. 光標屬性:  每一個光標有四種屬性
%FOUND         查詢語句(FETCH語句)返回記錄
%NOTFOUND      查詢語句(FETCH語句)無返回記錄,用於循環退出條件
%ROWCOUNT     FETCH已獲取的記錄數
%ISOPEN        光標已打開標記

例:
Declare
        v1 emp.empno%type;
        v2 emp.ename%type;
        v3 emp.sal%type;
        cursor c is select empno,ename,sal from emp;
     Begin
         open c;
         loop
         fetch  c into v1,v2,v3;
         if v3<3000 then Begin
                           update emp set sal=sal+100
                           where empno=v1;
                    dbms_output.put_line(''員工''||v2||''工資已經更新!'');
                                    End;
         end if;
         exit when c%NOTFOUND;
         end loop;
         dbms_output.put_line(''光標處理的行數:''||C%ROWCOUNT);
         close c;
     End;
    
4. 隱式光標處理: 隱式光標是指在處理SQL時,不需定義光標,所使用的SQL語句包括:INSERT ,UPDATE,DELETE子句。

隱式光標屬性:       SQL%FOUND        SQL%NOTFOUND              SQL%ROWCOUNT

隱式光標的使用:
Declare
 v_empno emp.empno%type:=&empno;
Begin
 delete from emp where empno=v_empno;
 if SQL%NOTFOUND then
  dbms_output.put_line(''你的刪除失敗,數據庫無此人:''||v_empno);
 end if;
End;

[例外處理Exception]
Declare
       v_empno emp.empno%type :=&empno;
       v_ename emp.ename%type;
       v_sal emp.sal%type;
Begin
      select sal,ename into v_sal,v_ename from emp
      where empno=v_empno;
       if v_sal<2000 then Begin
                  update emp set sal=sal+100
                  where empno=v_empno;
        dbms_output.put_line(''員工''||v_ename||''工資已經修改!'');
                                       End;
        elsif v_sal<2500 then Begin
                  update emp set sal=sal+50
                  where empno=v_empno;
        dbms_output.put_line(''員工''||v_ename||''工資已經修改!'');
                                       End;
        elsif v_sal<3000 then Begin
                  update emp set sal=sal+10
                  where empno=v_empno;
        dbms_output.put_line(''員工''||v_ename||''工資已經修改!'');
                                       End;
        else dbms_output.put_line(''員工''||v_ename||''的工資已經超過規定值,不予更新!'');
        End if;
Exception   -- // 例外處理
 when NO_DATA_FOUND then dbms_output.put_line(''數據庫中沒有編碼爲''||v_empno||''的員工。'');
 when TOO_MANY_ROWS then
  dbms_output.put_line(''你的查詢語句返回結果出現多行,請定義光標後重試!'');
 when OTHERS then
  dbms_output.put_line(''你的程序是錯誤的,請仔細檢查後重試!'');
End;

[用戶定義的例外]
(1)在Declare段定義
(2)在Begin段中用Raise引起。
(3)在Exception段中使用。

Declare
       v_empno emp.empno%type :=&empno;
       no_result exception;
Begin
 delete from emp where empno = v_empno;
 if SQL%NOTFOUND then raise no_result;
 end if;
 
Exception   -- // 例外處理
 when NO_DATA_FOUND then dbms_output.put_line(''數據庫中沒有編碼爲''||v_empno||''的員工。'');
 when NO_RESULT then dbms_output.put_line(''數據庫中沒有編碼爲''||v_empno||''的員工。'');
 when TOO_MANY_ROWS then
  dbms_output.put_line(''你的查詢語句返回結果出現多行,請定義光標後重試!'');
 when OTHERS then
  dbms_output.put_line(''你的程序是錯誤的,請仔細檢查後重試!'');
End;

[存儲過程(Storage Procedure)與函數(Function)設計]

一、什麼是存儲過程?
 存儲過程(函數)是把一個PL/SQL塊存儲到數據庫中,作爲一個數據庫實體,可以在其它存儲過程、函數、應用程序中調用。
1、存儲過程的調用方法:
(1) 在SQL*Plus中調用方法:SQL> Execute 存儲過程名稱; // execute 可以簡寫爲Exec。
(2) 在其它存儲過程、函數、應用程序中調用方法:存儲過程名稱;

2、存儲過程的設計方法:
編寫程序->在SQL*PLUS中編譯->修改錯誤->調用執行。

二、創建存儲過程的語法:[參考PowerPoint教程:存儲過程1.ppt(P3)]
說明:
 IN: 調用者向過程傳遞參數
 OUT: 過程向調用者傳遞參數
 IN OUT: 雙向傳遞參數
 無Declare

[例1:]IN: 刪除數據
Create or Replace procedure DelEmp(v_empno in emp.empno%type) is
Begin
 delete from emp where empno=v_empno;
 dbms_output.put_line(''編碼爲''||v_empno||''的員工已被除名!'');
End DelEmp;

調用方法:
SQL> Exec DelEmp(7788);
SQL> Exec DelEmp(7934);

[例2:]IN: 插入數據
Create or Replace procedure InsertEmp( v_empno in emp.empno%type,
        v_ename in emp.ename%type,
        v_deptno in emp.deptno%type) is
Begin
 insert into emp(empno, ename, hiredate,deptno)
  values(v_empno, v_ename, sysdate, v_deptno);
 dbms_output.put_line(''新員工“''||v_ename||''”錄入成功!'');
End InsertEmp;

[例3:]IN、OUT:數據查詢
Create or Replace procedure QueryEmp(v_empno in emp.empno%type,
                                     v_ename out emp.ename%type,
                                     v_job out emp.job%type) is
Begin
  select ename,job into v_ename,v_job from emp
  where empno=v_empno;
End QueryEmp;

調用方法:
Declare
  v1 emp.ename%type;
  v2 emp.job%type;
   v  emp.empno%type:=&empno;
Begin
    QueryEmp(v,v1,v2);
   dbms_output.put_line(''編碼爲''||v||''的員工姓名是:''||v1||''職業是:''||v2);
End;

[* 查詢存儲過程源代碼:]
SQL> select text from user_source where name = ''DELEMP'';  // 名字要大寫

三、創建函數語法:
例1:
Create or replace Function GetSalary( v empno%type) return numbwr is
 v_sal emp.sal%type;
Begin
 select sal into v_sal from emp
 where empno=v;
 return v_sal;
End GetSalary;
 
 [調用方法:]
 (1) SQL> Exec dbms_output.put_line(GetSalary(7788));
 (2) SQL> select GetSalary(7788) from dual;
 (3) 使用PL/SQL的方法:
 Begin
  dbms_output.put_line(GetSalary(7788));
 End;

[函數例2]
Create or replace function getmaxsal
return number
is
 v_maxsal emp.sal%type;
 begin
   select max(sal) into v_maxsal from emp;
   return v_maxsal;
 end getmaxsal;
 
  [調用方法:]
 (1) SQL> Exec dbms_output.put_line(GetMaxSal);
 (2) SQL> select GetMaxSal from dual;
 (3) 使用PL/SQL的方法:
 Begin
  dbms_output.put_line(GetMaxSal);
 End;
 
[練習題]: 求n!函數(n的階乘)。

[我的答案]
Create or replace function nj(n in number)
 return number
 is
   numtmp number;
 Begin
   if n = 0 then
    numtmp := 1;
   else
    numtmp := n * nj(n - 1);
   end if;
  
   return numtmp;
 End nj;
 
 [教師的答案]// 高, 實在是高!!!
Create or replace function fn(n in number)
return number
is
 Begin
  if n=0 then return 1;
 else return n*fn(n-1);
 end if;
End fn;

四、存儲過程及函數管理:
1、查詢存儲過程及函數的源代碼:
SQL> select * from user_source;
SQL> select * from dba_source;
SQL> select * form all_source;

2、存儲過程及函數的權限管理:
授權命令:
SQL> grant execute on 過程(或函數) to 用戶名;
SQL> grant execute on 過程(或函數) to public;  --//授權給全體用戶

權限回收:
SQL> Revoke execute on 過程(或函數) from 用戶名;
SQL> Revoke execute on 過程(或函數) from public;

3、查詢錯誤信息:
SQL> select * from user_errors;
SQL> show errors;

4、查詢依賴性信息:
依賴性:實體的結構定義修改時,對創建在這些實體上的存儲過程及函數的影響叫依賴性。

顯示依賴性關係:
SQL> select name,type, referenced_owner, referenced_name, referenced_type from user_dependencies;

5、刪除存儲過程及函數:
SQL> drop procedure 過程名;
SQL> drop function 函數名;

[包(Package)的設計與開發]

一、什麼是包?
    把一些相關的存儲過程、函數、變量、光標、例外等組合在一起形成的對象叫包。包由包的說明部分及包體兩部分組成。定義在包說明部分的是公共元素,定義在包體的部分是私有元素。

二、使用包的優點:     
   1、規範化程序設計
   2、方便過程及函數的組織
   3、便於管理:包的授權只需一次完成
   4、優化系統性能:整個包作爲一個整體一次調入內存。

三、包的開發步驟:
1、創建包的說明部分:Create package
2、創建包體部分:Create package body
3、在SQL*Plus中運行創建包
4、在存儲過程、其它應用中調用。
在SQL*Plus中調用方法:SQL> exec 包名.過程名;

在存儲過程、函數、其它應用中調用方法:包名.過程名;

四、創建包的語法:
1、創建包(說明部分):請參考PowerPoint教程:存儲過程1.ppt[Page10]

2、創建包體(Create Package Body): 請參考PowerPoint教程:存儲過程1.ppt[Page11]

3、例:請參考PowerPoint教程:存儲過程1.ppt[Page12、13、14、15]

五、包的刪除:
SQL> drop package 包名;
SQL> drop package body 包名;

查詢包源代碼:
SQL> select text from user_source where name = ''包名'';  // 包名大寫。

頂一下
(0)
踩一下
(0)

發表評論:

昵稱: *
內容:
驗證碼:
rss· 投稿· 加入收藏· 手機版