ORACLE創建表空間_第1頁
ORACLE創建表空間_第2頁
ORACLE創建表空間_第3頁
ORACLE創建表空間_第4頁
ORACLE創建表空間_第5頁
已閱讀5頁,還剩34頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、ORACLE中,表空間是數據管理的基本方法,所有用戶的對象要存放在表空間中,也就是用戶有空間的使用權,才能創建用戶對象否則是不充許創建對象,因為就是想創建對象,如表,索引等,也沒有地方存放,Oracle會提示:沒有存儲配額因此,在創建對象之前,首先要分配存儲空間分配存儲,就要創建表空間:創建表空間示例如下:CREATE TABLESPACE "SAMPLE"     LOGGING     DATAFILE 'D:ORACLEORADATAORA92LUNTAN.ora' SIZE 5M EXTEN

2、T    MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO  上面的語句分以下幾部分:第一: CREATE TABLESPACE "SAMPLE" 創建一個名為 "SAMPLE" 的表空間.    對表空間的命名,遵守Oracle 的命名規范就可了.   ORACLE可以創建的表空間有三種類型:(1)TEMPORARY: 臨時表空間,用于臨時數據的存放;創建臨時表空間的語法如下:CREATE TEMPORARY

3、TABLESPACE "SAMPLE".   (2)UNDO : 還原表空間. 用于存入重做日志文件. 創建還原表空間的語法如下:CREATE UNDO TABLESPACE "SAMPLE".(3)用戶表空間: 最重要,也是用于存放用戶數據表空間    可以直接寫成: CREATE TABLESPACE "SAMPLE"TEMPORARY 和 UNDO 表空間是ORACLE 管理的特殊的表空間.只用于存放系統相關數據.第二:   LOGGING 有 NOLOGGI

4、NG 和 LOGGING 兩個選項,      NOLOGGING: 創建表空間時,不創建重做日志.     LOGGING 和NOLOGGING正好相反, 就是在創建表空間時生成重做日志.用NOLOGGING時,好處在于創建時不用生成日志,這樣表空間的創建較快,但是沒能日志,數據丟失后,不能恢復,但是一般我們在創建表空間時,是沒有數據的,按通常的做法,是建完表空間,并導入數據后,是要對數據做備份的,所以通常不需要表空間的創建日志,因此,在創建表空間時,選擇 NOLOGGING,以加快表空間的創建速度.第

5、三: DATAFILE 用于指定數據文件的具體位置和大小.如: DATAFILE 'D:ORACLEORADATAORA92LUNTAN.ora' SIZE 5M 說明文件的存放位置是 'D:ORACLEORADATAORA92LUNTAN.ora' , 文件的大小為5M.如果有多個文件,可以用逗號隔開:DATAFILE 'D:ORACLEORADATAORA92LUNTAN.ora' SIZE 5M,     'D:ORACLEORADATAORA92dd.ora' SIZE 5M 但是每個文件都需

6、要指明大小.單位以指定的單位為準如 5M 或 500K.對具體的文件,可以根據不同的需要,存放大不同的介質上,如磁盤陣列,以減少IO竟爭.指定文件名時,必須為絕對地址,不能使用相對地址.第四: EXTENT MANAGEMENT LOCAL 存儲區管理方法在Oracle 8i以前,可以有兩種選擇,一種是在字典中管理(DICTIONARY),另一種是本地管理(LOCAL ),從9I開始,只能是本地管理方式.因為LOCAL 管理方式有很多優點.在字典中管理(DICTIONARY): 將數據文件中的每一個存儲單元做為一條記錄,所以在做DM操作時,就會產生大量的對這個管理表的Delete和Update

7、操作.做大量數據管理時,將會產生很多的DM操作,嚴得的影響性能,同時,長時間對表數據的操作,會產生很多的磁盤碎片,這就是為什么要做磁盤整理的原因.本地管理(LOCAL): 用二進制的方式管理磁盤,有很高的效率,同進能最大限度的使用磁盤. 同時能夠自動跟蹤記錄臨近空閑空間的情況,避免進行空閑區的合并操作。第五: SEGMENT SPACE MANAGEMENT   磁盤擴展管理方法:SEGMENT SPACE MANAGEMENT: 使用該選項時區大小由系統自動確定。由于 Oracle 可確定各區的最佳大小,所以區大小是可變的。UNIFORM SEGMENT SPACE MA

8、NAGEMENT:指定區大小,也可使用默認值 (1 MB)。第六: 段空間的管理方式: AUTO: 只能使用在本地管理的表空間中. 使用LOCAL管理表空間時,數據塊中的空閑空間增加或減少后,其新狀態都會在位圖中反映出來。位圖使 Oracle 管理空閑空間的行為更加自動化,并為管理空閑空間提供了更好的性,但對含有LOB字段的表不能自動管理.MANUAL: 目前已不用,主要是為向后兼容.第七: 指定塊大小. 可以具體指定表空間數據塊的大小.創建例子如下:1 CREATE TABLESPACE "SAMPLE"2      LO

9、GGING3      DATAFILE 'D:ORACLEORADATAORA92SAMPLE.ora' SIZE 5M,4      'D:ORACLEORADATAORA92dd.ora' SIZE 5M5      EXTENT MANAGEMENT LOCAL6      UNIFORM SEGMENT SPACE MANAGEMENT7* &#

10、160;   AUTOSQL> /表空間已創建。要刪除表空間進,可以SQL> DROP TABLESPACE SAMPLE;表空間已丟棄。oracle調整表空間文件大小1、調整表空間文件大小alter database datafile '/u01/app/oracle/oradata/rmanrep/users01.dbf' resize 15m;2、調整表空間文件自動擴展 alter database datafile '/u01/app/oracle/oradata/rmanrep/users01.dbf' autoexte

11、nd on next 20m maxsize 1g;3、新增磁盤 alter database datafile '/u01/app/oracle/oradata/rmanrep/users01.dbf' autoextend on next 20m maxsize 1g; alter tablespace users add datafile '/u03/oradata/users02.dbf' size 50m autoextend on next 10m maxsize 200mOracle創建用戶/密碼并授權 移除權限oracle 2011-01-21

12、16:45:38 閱讀86 評論0 字號:大中小 訂閱 Oracle創建用戶/密碼并授權(1) 創建用戶Create user 用戶名 identified by 密碼;(如果是數字則要加雙引號”111111”,如果是字母就不用)(2) 授權給某個用戶Grant connect,resource to 用戶名;(只有用戶有了connect 和 resource后才能操作其他表)(3) 授DBA 權限Grant dba to 用戶名;(4) 給用戶創建會話的權限:grant create session to DB_USER (3) 授DBA 權限Grant dba to 用戶名;(4) 撤權:

13、 revoke 權限. from 用戶名;(5)刪除用戶:drop user username cascade (cascade 保證徹底刪除)首先用管理員的帳戶登錄(要有修改用戶的權限)systemalter user sys identified by 123; (sys是用戶名,123是密碼)如果用sys登錄:connect sys/oralce as sysdba;用system登錄:connect system/oracle;oracle用戶權限2008-03-18 10:04Oracle系統中用戶權限的賦予,查看和管理.在Oracle數據庫中,用戶的權限分為兩種(在這里我們不討論d

14、ba或oper的權限,只考慮普通用戶的權限),分別是System Privilege系統權限 和User Table Privilege用戶數據表權限.1.首先,創建用戶,以下幾條命令可以創建一個用戶,前提是必須以DBA的身份登錄(如果你不是DBA,不要看下去了):create user DB_USER identified by DB_USER_PW '創建用戶DB_USER,密碼為DB_USER_PWgrant create session to DB_USER '給用戶創建會話的權限grant resource to DB_USER2.當用戶建立后,會自動在Oracle數

15、據庫系統中生成屬于該用戶的Scheme (可以理解為所有屬于該用戶的表,視圖.等對象的集合).該用戶可以將對這些對象的訪問權限賦予其它的系統用戶.3.該用戶用sqlplus登錄后,以下命令可以看到該用戶的權限(該部分取自于CNOUG網站):本用戶讀取其他用戶對象的權限:select * from user_tab_privs;本用戶所擁有的系統權限:select * from user_sys_privs;ORACLE數據庫用戶與權限管理ORACLE是多用戶系統,它允許許多用戶共享系統資源。為了保證數據庫系統的安全,數據庫管理系統配置了良好的安全機制。2. 1 ORACLE數據庫安全策略建立系

16、統級的安全保證系統級特權是通過授予用戶系統級的權利來實現,系統級的權利(系統特權)包括:建立表空間、建立用戶、修改用戶的權利、刪除用戶等。系統特權可授予用戶,也可以隨時回收。ORACLE系統特權有80多種。建立對象級的安全保證對象級特權通過授予用戶對數據庫中特定的表、視圖、序列等進行操作(查詢、增、刪改)的權利來實現。建立用戶級的安全保證用戶級安全保障通過用戶口令和角色機制(一組權利)來實現。引入角色機制的目的是簡化對用戶的授權與管理。做法是把用戶按照其功能分組,為每個用戶建立角色,然后把角色分配給用戶,具有同樣角色的用戶有相同的特權。2.2 用戶管理ORACLE用戶管理的內容主要包括用戶的建

17、立、修改和刪除用戶的建立SQL>CREATE USER jxzy>IDENTIFIED BY jxzy_password>DEFAULT TABLESPACE system>QUATA 5M ON system; /供用戶使用的最大空間限額用戶的修改SQL>CREATE USER jxzy>IDENTIFIED BY jxzy_pw>QUATA 10M ON system;刪除用戶及其所建對象SQL>DROP USER jxzy CASCADE; /同時刪除其建立的實體2.3系統特權管理與控制ORACLE 提供了80多種系統特權,其中每一個系統特

18、權允許用戶執行一個或一類數據庫操作。授予系統特權SQL>GRANT CREATE USER,ALTER USER,DROP USER>TO jxzy_new>WITH ADMIN OPTION;回收系統特權SQL>REVOKE CREATE USER,ALTER USER,DROP USER>FROM jxzy_new/但沒有級聯回收功能顯示已被授予的系統特權(某用戶的系統級特權)SQL>SELECT*FROM sys.dba_sys_privs2.4 對象特權管理與控制ORACLE對象特權指用戶在指定的表上進行特殊操作的權利。這些特殊操作包括增、刪、改、查

19、看、執行(存儲過程)、引用(其它表字段作為外鍵)、索引等。授予對象特權SQL>GRANT SELECT,INSERT(office_num,office_name),>UPDATE(desc)ON office_organization>TO new_adminidtrator>WITH GRANT OPTION;/級聯授權SQL>GRANT ALL ON office_organization>TO new_administrator回收對象特權SQL>REVOKE UPDATE ON office_orgaization>FROM new_a

20、dministrator/有級聯回收功能SQL>REVOKE ALL ON office_organization>FROM new_administrator顯示已被授予的全部對象特權SQL>SELECT*FROM sys.dba_tab_privs2.5 角色的管理ORACLE的角色是命名的相關特權組(包括系統特權與對象特權),ORACLE用它來簡化特權管理,可把它授予用戶或其它角色。ORACLE數據庫系統預先定義了CONNECT 、RESOURCE、 DBA、 EXP_FULL_DATABASE、 IMP_FULL_DATABASE五個角色。CONNECT具有創建表、視

21、圖、序列等特權;RESOURCE具有創建過程、觸發器、表、序列等特權、DBA具有全部系統特權;EXP_FULL_DATABASE、 IMP_FULL_DATABASE具有卸出與裝入數據庫的特權。通過查詢sys.dba_sys_privs可以了解每種角色擁有的權利。授予用戶角色SQL>GRANT DBA TO new_administractor>WITH GRANT OPTION;=Oracle 的用戶根據所被授予的權限分為系統權限和對象權限。其中最高的權限是sysdba。 Sysdba具有控制Oracle一切行為的特權,諸如創建、啟動、關閉、恢復數據庫,使數據庫歸檔/非歸檔,備份

22、表空間等關鍵性的動作只能通過具有sysdba權限的用戶來執行。這些任務即使是普通DBA角色也不行。Sysoper是一個與sysdba相似的權限,只不過比sysdba少了SYSOPER privileges WITH ADMIN OPTION,CREATE DATABASE,RECOVER DATABASE UNTIL這幾個權限而已。這兩者的認證方式是相同的辦法,所以下面只介紹sysdba的認證管理。一般對sysdba的管理有兩種方式: * 作系統認證和密碼文件認證。具體選擇那一種認證方式取決于:你是想在Oracle運行的機器上維護數據庫,還是在一臺機器上管理分布于不同機器上的所有的Oracle

23、數據庫。若選擇在本機維護數據庫,則選擇 * 作系統認證可能是一個簡單易行的辦法;若有好多數據庫,想進行集中管理,則可以選擇password文件認證方式。下圖比較直觀的說明了這個選擇權衡過程:使用 * 作系統認證方式的配置過程:1 在 * 作系統中建立一個合法帳戶。具體來說,在NT上,首先建立一個本地用戶組,取名為ORA_DBA,其中SID為該數據庫實例的SID,或者建立一個ORA_DBA地組,該組不對應于任何一個單獨的Oracle實例。這樣當一個NT上有好幾個Oracle實例時,不用分別管理。然后再NT上建立一個用戶,并且把它歸入該組中。但是實際上這兩步在Oracle8I安裝過程中已經自動完成

24、了,一般不用手動進行。第三步:在sqlnet.ora(位于$ORACLE_HOME/NETWORK/ADMIN目錄中)中,把SQLNET.AUTHENTICATION _SERVICES 設置為SQLNET.AUTHENTICATION_SERVICES= (NTS),意思為使用NT認證方式。第四步,在INIT.ORA中,把REMOTE_LOGIN_PASSWORD設置為NONE,意思是不用password認證方式。完成以上步驟后,就可以在登錄到NT后,直接在SQL*Plus 和SERVER MANAGER中CONNECT INTERNAL (CONNECT / AS SYSDBA)來作為超級

25、用戶登錄到Oracle中,執行一些只有超級用戶才能進行的 * 作。在Unix下,情況有些不同。畢竟這是兩個完全不同的 * 作系統。首先,在安裝Oracle之前,建立一個DBA組,這一步不用說了,不然是裝不上Oracle的。一般還建立一個名為Oracle的用戶,并把它加入到DBA組中。第二步, 設置REMOTE_LOGIN_PASSWORD為NONE。在Oracle8.1以后,該參數默認為EXCLUSIVE。一定要記得改過來。第三步, 用該用戶名登錄Unix,運行SQL*Plus 或者SERVER MANAGER,輸入以下命令:CONNECT INTERNAL(CONNECT / AS SYSD

26、BA)來登錄到Oracle中。使用password文件認證的具體步驟:Oracle提供orapwd實用程序來創建password 文件,運用orapwd建立該認證方式的具體步驟如下:1 使用Orapwd實用程序來創建一個PASSWORD文件。語法:orapwd file=文件名 password=internal用戶密碼 entried=entries.詳細解釋:文件名要包含完整的全路徑名,如果不指定,Oracle把它默認放置$ORACLE_HOME/dbs(Unix下)或者$ORACLE_HOME/DATABASE(NT下)下。用戶密碼是用戶internal的密碼。當然后來還可以再向里邊加入

27、別的超級用戶。Entries表示最大允許有的超級用戶數目。這個是一個可選的。前兩者是必須指定的。一般會把它設置的比實際需要大一些,以免不夠。2 把INIT.ORA中REMOTE_LOGIN_PASSWORD設置為EXCLUSIVE 或SHARED.使用EXCLUSIVE表示只有當前INSTANCE使用這個password文件。而且允許有別的用戶作為sysdba登錄進系統里邊,而若選擇了SHARED,則表明不止一個實例使用這個密碼文件,伴隨著一個很強的約束:sysdba權限只能授予sys和internal這兩個用戶名。(其實internal不是一個實際用戶,而只是sys作為sysdba登錄時的一

28、個別名。)同時還要記得把sqlnet.ora文件中SQLNET.AUTHENTICATION _SERVICES設置為NONE。一般在Unix下它是默認設置。在NT下,若選擇典型安裝時,會使用OS認證,而自定義時會使用密碼文件認證方式。在安裝過程中會提示輸入INTERNAL密碼。這樣的話,就不用在手工創建密碼文件和設定INTERNAL的密碼了。3 用SQL*Plus 或SERVER MANAGER運行下面命令登錄進系統:CONNECT INTERNAL/密碼。注意點:1在Oracle8.1.6安裝在WIN2000下創建數據庫時,常常會發生憑證檢索失敗的錯誤。這是由于Oracle不能應用OS認證

29、的結果。一般可以通過修改sqlnet.ora中SQLNET.AUTHENTICATION _SERVICES為NONE來解決。這時,Oracle將采用密碼文件認證方式。2.由于Oracle有幾個系統預建的用戶,所以最好在安裝完成以后馬上改變這些用戶的密碼。系統默認得密碼分別為:internal/oracle , sys/change_on_install, system/manager.3.當選擇密碼文件認證方式時,可以再向系統中加入其他超級用戶。比如用以下語句把用戶SCOTT加入超級用戶之中:(由具有sysdba權限的人執行)SQL>GRANT SYSDBA TO SCOTT;這樣SC

30、OTT用戶就具有了sysdba權限。注意,此時SCOTT用戶可以以兩種身份登錄:SCOTT , SYS.當SCOTT在登錄時沒有輸入AS SYSDBA時,SCOTT是作為普通用戶登錄的。而當登錄時輸入了AS SYSDBA時,此時SCOTT登錄進去的用戶實際上為sys。4 當前系統中的具有sysdba權限的用戶名可以從數據字典視圖v$pwfile_user中查詢得到:SELECT * FROM V$PWFILE_USERS; 如上圖所示。5 系統中最大的具有sysdba權限的用戶數由創建密碼文件時的ENTRIES參數決定。當需要創建更多的具有sysdba權限的用戶時,就需要刪除原有的密碼文件,重

31、新創建一個。這需要關閉數據庫,刪除密碼文件,重新創建一個新的密碼文件,在entries中輸入足夠大的數目。再啟動Oracle。這時,所有原來北授權的超級用戶都不再存在,需要重新授權。所以在重新創建密碼文件前,先要查詢該視圖,記下用戶名,再在創建完密碼文件后重新授權。6 Internal用戶密碼忘記的處理方法:有兩種辦法:1 ALTER USER SYS IDENTIFIED BY 新密碼;/這同時也改變了Internal的密碼,在Oracle8I中通過2 重新創建一個新的密碼文件,指定一個新的密碼。Oracle 添加外鍵 -摘抄- 創建外鍵約束時假如使用Oracle默認的創建方式,在刪除被參照

32、的數據時,將無法被刪除,這一點在Oracle9i中給了我們更多靈活的選擇,我們可是使用on delete cascade和 on delete set null要害字來決定刪除被參照數據時是否要將參照這個數據的那些數據一并刪除,還是將那些參照這條數據的數據的對應值賦空。 例如下面這兩個表中分別存的時員工的基本信息和公司的部門信息。我們為 createtabledept(deptnonumber(10)notnull,deptnamevarchar2(30)notnull,constraintpk_deptprimarykey(deptno);和createtableemp(empnonumbe

33、r(10)notnull,fnamevarchar2(20),lnamevarchar2(20),deptnumber(10),constraintpk_empprimarykey(empno); 然后我們現在分別使用這兩個要害字來增加外鍵試一下,首先我們來試一下on delete cascade altertableempaddconstraintfk_emp_deptforeignkey(dept)referencesdept(deptno)ondeletecascade; 先增加外鍵。然后插入數據。 insertintodeptvalues(1,銷售部);insertintodeptva

34、lues(2,財務部);insertintoempvalues(2,Mary,'Song,1);insertintoempvalues(3,Linda,'Liu,2);insertintoempvalues(4,Linlin,'Zhang,1); 然后現在我要刪除銷售部,會有什么后果呢? deletefromdeptwheredeptno=1; 我們發現除了dept中的一條數據被刪除了,emp中兩條數據也被刪除了,其中emp中的兩條數據是參照了銷售部的這條數據的,這就很輕易理解on delete cascade了。 接下來我們再來看on delete set null,

35、顧名思義了,這種方式建立的外鍵約束,當被參照的數據被刪除是,參照該數據的那些數據的對應值將會變為空值,下面我們還是通過試驗來證實on delete set null作用: 首先恢復剛才的那幾條數據,然后更改約束: altertableempaddconstraintfk_emp_deptforeignkey(dept)referencesdept(deptno)ondeletesetnull; 然后我們在執行刪除操作: deletefromdeptwheredeptno=1; 你也會發現除了dept中的銷售部被刪除以外,emp中參照這條數據的兩條數據的dept的值被自動賦空了,這就是on de

36、lete set null的作用了。 使用on delete set null有一點需要注重的是,被參參照其他表的那一列必須能夠被賦空,不能有not null約束,對于上面的例子來說是emp中dept列一定不能有not null約束,假如已經定義了not null約束,又使用了on delete set null來刪除被參照的數據時,將會發生:ORA-01407: 無法更新 (”DD”.”EMP”.”DEPT”) 為 NULL的錯誤。 總的來講on delete cascade和on delete set null的作用是用來處理級聯刪除問題的,假如你需要刪除的數據被其他數據所參照,那么你應該

37、決定到底希望oracle怎么處理那些參照這些即將要刪除數據的數據的,你可以有三種方式: 禁止刪除。這也是Oracle默認的 將那些參照本值的數據的對應列賦空,這個需要使用on delete set null要害字 將那些參照本值的數據一并刪除,這個需要使用on delete cascade要害字Oracle認證考試:Oracle觸發器的語法詳解 I.#A4 tVAQPBm OAt/Dhr> 4*v< 觸發器是一種特殊的存儲過程,下面是觸發器的詳細說明: : g9w BA z?sUn( ORACLE 觸發器 " 5+kZzy 7=qOqww1 ORACLE產生數據庫觸發器的

38、語法為: kB*_ Pq !#h#n create or replace trigger 觸發器名 觸發時間 觸發事件 cc5S>f#.4P -7ILL"t on 表名 !.cJ*'C5V !HT)( for each row X c<G HwZ + d_V pl/sql 語句 v(N n> |WrAZt 其中: f$vd)I9Bn U&W #7_ 觸發器名:觸發器對象的名稱。由于觸發器是數據庫自動執行 的,因此該名稱只是一個名稱,沒有實質的用途。 M_VaJX nb%+fT|+0 觸發時間:指明觸發器何時執行,該值可取: PnWIK:l GuhPR

39、b*r before-表示在數據庫動作之前觸發器執行; /!A/Am)Nm lbg.9#! after-表示在數據庫動作之后出發器執行。 2c|*Q* *,H2vHgbWL 觸發事件:指明哪些數據庫動作會觸發此觸發器:c5p69n1 M$R=4<vr_u insert:數據庫插入會觸發此觸發器; 4lVNHji VIJ%/y update:數據庫修改會觸發此觸發器; PaMId:W,i y$#$;+5Y delete:數據庫刪除會觸發此觸發器。 y04qy<7u 6)-X2 表 名:數據庫觸發器所在的表。 Bn!yc W$ iPi+K0?W for each row:對表的每一行觸

40、發器執行一次。如果沒有這一選項,則只對整個表執行一次。 yW %A AQbs%ONg 舉例:下面的觸發器在更新表auths之前觸發,目的是不允許在周末修改表: nS A$Vh hjXp%O create trigger auth_secure SM 0$F q"O3l before insert or update or delete file:/對整表更新前觸發 HGc3QY=|m, WH%;$?= on auths M7jv q d5)|? begin 16t5=BT < 5BNtt if(to_char(sysdate,DY)=SUN>Gl&a X"

41、;p5R RAISE_APPLICATION_ERROR(-20600,不能在周末修改表auths); #+>':$ VD_KuM ( RAISE_APPLICATION_ERROR是函數,括弧內的,第一參數范圍在-2000020999之間,第二個 ?VQdq6- ?d7mv3't 參數是字符串,大小在2k,超過的話,系統自動截斷) wZ+ R<$ IK$6 end if; 0qLtQ"l -ygwk|w endoracle存儲過程詳解-游標 實現增、刪、改、查的功能 收藏 游標(CURSOR)是ORACLE系統在內存中開辟的一個工作區,在其中存放SELE

42、CT語句返回的查詢結果. 這個查詢結果既可以是零記錄,單條記錄,也可以是多條記錄.在游標所定義的工作區中,存在著一個指針(POINTER), 在初始狀態它指向查詢結果的首記錄. SQL是用于訪問ORACLE數據庫的語言,PL/SQL擴展和加強了SQL的功能,它同時引入了更強的程序邏輯。 PL/SQL支持DML命令和SQL的事務控制語句。DDL在PL/SQL中不被支持,這就意味作在PL/SQL程序塊中不能創建表或其他任何對象。 較好的PL/SQL程序設計是在PL/SQL塊中使用象DBMS_SQL這樣的內建包或執行EXECUTE IMMEDIATE命令建立動態SQL來執行DDL命令, PL/SQL

43、編譯器保證對象引用以及用戶的權限。 下面我們將討論各種用于訪問ORACLE數據庫的DDL和TCL語句。 查詢 SELECT語句用于從數據庫中查詢數據,當在PL/SQL中使用SELECT語句時,要與INTO子句一起使用,查詢的返回值被賦予INTO子句中的變量 ,變量的聲明是在DELCARE中。SELECT INTO語法如下: SELECT DISTICT|ALL*|column,column,. INTO (variable,variable,. |record) FROM table|(sub-query)alias WHERE. PL/SQL中SELECT語句只返回一行數據。如果超過一行數據

44、,那么就要使用顯式游標(對游標的討論我們將在后面進行), INTO子句中要有與SELECT子句中相同列數量的變量。INTO子句中也可以是記錄變量。 %TYPE屬性 在PL/SQL中可以將變量和常量聲明為內建或用戶定義的數據類型,以引用一個列名,同時繼承他的數據類型和大小。 這種動態賦值方法是非常有用的,比如變量引用的列的數據類型和大小改變了,如果使用了%TYPE,那么用戶就不必修改代碼, 否則就必須修改代碼。 例: v_empno SCOTT.EMP.EMPNO%TYPE; v_salary EMP.SALARY%TYPE; 不但列名可以使用%TYPE,而且變量、游標、記錄,或聲明的常量都可以

45、使用%TYPE。這對于定義相同數據類型的變量非常有用。 DELCARE V_A NUMBER(5):=10; V_B V_A%TYPE:=15; V_C V_A%TYPE; BEGIN DBMS_OUTPUT.PUT_LINE ('V_A='|V_A|'V_B='|V_B|'V_C='|V_C); END SQL>/ V_A=10 V_B=15 V_C= PL/SQL procedure successfully completed. SQL> 其他DML語句 其它操作數據的DML語句是:INSERT、UPDATE、DELETE和LO

46、CK TABLE,這些語句在PL/SQL中的語法與在SQL中的語法相同。 我們在前面已經討論過DML語句的使用這里就不再重復了。在DML語句中可以使用任何在DECLARE部分聲明的變量,如果是嵌套塊, 那么要注意變量的作用范圍。 例: CREATE OR REPLACE PROCEDURE FIRE_EMPLOYEE (pempno in number) AS v_ename EMP.ENAME%TYPE; BEGIN SELECT ename INTO v_ename FROM emp WHERE empno=p_empno; INSERT INTO FORMER_EMP(EMPNO,ENA

47、ME) VALUES (p_empno,v_ename); DELETE FROM emp WHERE empno=p_empno; UPDATE former_emp SET date_deleted=SYSDATE WHERE empno=p_empno; EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('Employee Number Not Found!'); END DML語句的結果 當執行一條DML語句后,DML語句的結果保存在四個游標屬性中,這些屬性用于控制程序流程或者了解程序的狀態。 當運行DML語句

48、時,PL/SQL打開一個內建游標并處理結果,游標是維護查詢結果的內存中的一個區域,游標在運行DML語句時打開,完成后關閉。 隱式游標只使用SQL%FOUND,SQL%NOTFOUND,SQL%ROWCOUNT三個屬性.SQL%FOUND,SQL%NOTFOUND是布爾值,SQL%ROWCOUNT是整數值。 SQL%FOUND和SQL%NOTFOUND 在執行任何DML語句前SQL%FOUND和SQL%NOTFOUND的值都是NULL,在執行DML語句后,SQL%FOUND的屬性值將是: . TRUE :INSERT . TRUE ELETE和UPDATE,至少有一行被DELETE或UPDATE

49、. . TRUE :SELECT INTO至少返回一行 當SQL%FOUND為TRUE時,SQL%NOTFOUND為FALSE。 SQL%ROWCOUNT 在執行任何DML語句之前,SQL%ROWCOUNT的值都是NULL,對于SELECT INTO語句,如果執行成功,SQL%ROWCOUNT的值為1,如果沒有成功, SQL%ROWCOUNT的值為0,同時產生一個異常NO_DATA_FOUND. SQL%ISOPEN df 事務控制語句 事務是一個工作的邏輯單元可以包括一個或多個DML語句,事物控制幫助用戶保證數據的一致性。 如果事務控制邏輯單元中的任何一個DML語句失敗,那么整個事務都將回滾

50、, 在PL/SQL中用戶可以明確地使用COMMIT、ROLLBACK、SAVEPOINT以及SET TRANSACTION語句。 COMMIT語句終止事務,永久保存數據庫的變化,同時釋放所有LOCK,ROLLBACK終止現行事務釋放所有LOCK, 但不保存數據庫的任何變化,SAVEPOINT用于設置中間點,當事務調用過多的數據庫操作時,中間點是非常有用的, SET TRANSACTION用于設置事務屬性,比如read-write和隔離級等。 顯式游標 當查詢返回結果超過一行時,就需要一個顯式游標,此時用戶不能使用select into語句。PL/SQL管理隱式游標, 當查詢開始時隱式游標打開,

51、查詢結束時隱式游標自動關閉。顯式游標在PL/SQL塊的聲明部分聲明, 在執行部分或異常處理部分打開,取數據,關閉。下表顯示了顯式游標和隱式游標的差別: 使用游標 這里要做一個聲明,我們所說的游標通常是指顯式游標,因此從現在起沒有特別指明的情況,我們所說的游標都是指顯式游標。 要在程序中使用游標,必須首先聲明游標。 聲明游標 語法: CURSOR cursor_name IS select_statement; 在PL/SQL中游標名是一個未聲明變量,不能給游標名賦值或用于表達式中。 例: DELCARE CURSOR C_EMP IS SELECT empno,ename,salary FRO

52、M emp WHERE salary>2000 ORDER BY ename; . BEGIN 在游標定義中SELECT語句中不一定非要表可以是視圖,也可以從多個表或視圖中選擇的列,甚至可以使用*來選擇所有的列 。 打開游標 使用游標中的值之前應該首先打開游標,打開游標初始化查詢處理。打開游標的語法是: OPEN cursor_name cursor_name是在聲明部分定義的游標名。 例: OPEN C_EMP; 關閉游標 語法: CLOSE cursor_name 例: CLOSE C_EMP; 從游標提取數據 從游標得到一行數據使用FETCH命令。每一次提取數據后,游標都指向結果集的下一行。語法如下: FETCH cursor_name INTO

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論