ORACLE使用

1、分析表
  analyze table mzbs.db_code ESTIMATE STATISTICS SAMPLE 20 PERCENT;
  
  2、表空間管理和用戶管理
  
  --查看錶空間和數據文件
  
  select file_name,tablespace_name,autoextensible from dba_data_files;
  
  --數據表空間
  
  CREATE TABLESPACE USER_DATA
  LOGGING
  DATAFILE 'D:/ORACLE/ORADATA/ORCL/test.DBF' SIZE 50m REUSE ,
  'c:/USERS01112.DBF' SIZE 50m REUSE
  AUTOEXTEND
  ON NEXT 1280K MAXSIZE 16383M EXTENT MANAGEMENT LOCAL
  
  --修改表空間數據文件的路徑
  
  ALTER TABLESPACE app_data
  RENAME
  DATAFILE '/DISK4/app_data_01.dbf'
  TO  '/DISK5/app_data_01.dbf';
  
  ALTER DATABASE
  RENAME FILE '/DISK1/system_01.dbf'
  TO '/DISK2/system_01.dbf';
  
  --臨時表空間
  
  CREATE TEMPORARY
  TABLESPACE USER_DATA_TEMP TEMPFILE 'D:/TEMP0111.DBF'
  SIZE 50M REUSE AUTOEXTEND
  ON NEXT 1024K MAXSIZE 16383M EXTENT MANAGEMENT LOCAL UNIFORM
  SIZE 1024K
  
  --增加數據文件
  
  ALTER TABLESPACE USER_DATA
  ADD DATAFILE 'c:/USERS01113.DBF' SIZE 50M;
  
  ALTER TABLESPACE USER_DATA
  ADD DATAFILE 'c:/USERS01114.DBF' SIZE 50M
  AUTOEXTEND ON
  ;
  
  --刪除表空間
  
  DROP TABLESPACE USER_DATA INCLUDING CONTENTS;
  
  --修改表空間的存儲參數
  
  ALTER TABLESPACE tablespacename
  MINIMUM EXTENT 2M;
  
  ALTER TABLESPACE tablespacename
  DEFAULT STORAGE (
  INITIAL 2M
  NEXT 2M
  MAXEXTENTS 999 );
  
  --表空間聯機/脫機/只讀
  
  ALTER TABLESPACE tablespacename OFFLINE/ONLINE/READ ONLY;
  
  --修改數據文件大小
  ALTER DATABASE
  DATAFILE 'c:/USERS01113.DBF' RESIZE 40M;
  
  --創建用戶、賦予權限
  
  CREATE USER USER_DATA PROFILE DEFAULT IDENTIFIED BY USER_DATA
  DEFAULT
  TABLESPACE USER_DATA TEMPORARY
  TABLESPACE USER_DATA ACCOUNT UNLOCK;
  
  GRANT CONNECT TO USER_DATA;
  GRANT RESOURCE TO USER_DATA;
  
  3、表的管理
  
  --創建表
  
  CREAE TABLE TABLENAME
  (COLUMN1 COLUTYPE DEFAULT(VALUE) NOT NULL)
  (COLUMN2 COLUTYPE DEFAULT(VALUE) NOT NULL);
  
  --建表的索引存儲分配
  
  CREATE TABLE summit.employee(id NUMBER(7) CONSTRAINT employee_id_pk PRIMARY KEY DEFERRABLE USING INDEX STORAGE(INITIAL 100K NEXT 100K)
  TABLESPACE indx,
  last_name VARCHAR2(25) CONSTRAINT employee_last_name_nn NOT NULL,
  dept_id NUMBER(7))
  TABLESPACE data;
  
  --修改表的存儲分配
  
  ALTER TABLE tablename
  PCTFREE 30
  PCTUSED 50
  STORAGE(NEXT 500K
  MINEXTENTS 2
  MAXEXTENTS 100);
  
  ALTER TABLE tablename
  ALLOCATE EXTENT(SIZE 500K
  DATAFILE '/DISK3/DATA01.DBF');
  
  --把表移到另一個表空間
  
  ALTER TABLE TABLENAME MOVE TABLESPACE TABLESPACENAME;
  
  --回收空閒的空間(回收到High-water mark)
  全部回收需要TRUNCATE TABLE tablename
  
  ALTER TABLE tablename
  DEALLOCATE UNUSED;
  
  --刪除表(連同所用constraint)
  
  DROP TABLE tablename
  CASCADE CONSTRAINTS;
  
  --給表增加列
  
  ALTER TABLE TABLENAME
  ADD COLUMN COLUTYPE DEFAULT(VALUE) NOT NULL;
  
  --刪除表中的列
  
  ALTER TABLE tablename
  DROP COLUMN columnname;
  
  ALTER TABLE tablename
  DROP COLUMN columnname
  CASCADE CONSTRAINTS CHECKPOINT 1000;
  
  --標記列不可用
  
  ALTER TABLE tablename
  SET UNUSED COLUMN columnname
  CASCADE CONSTRAINTS;
  
  --刪除標記爲不可用的列
  
  ALTER TABLE tablename
  DROP UNUSED COLUMNS CHECKPOINT 1000;
  
  --繼續刪除列選項
  
  ALTER TABLE tablename
  DROP COLUMNS CONTINUE CHECKPOINT 1000;
  
  --把表放到BUFFER_POOL中去
  
  ALTER TABLE tablename
  STORAGE (BUFFER_POOL RECYCLE);
  
  --避免動態分配EXTENT
  
  ALTER TABLE tablename ALLOCATE EXTENT;
  
  --把表放到CACHE中去
  
  ALTER TABLE tablename ALLOCATE CACHE/NOCACHE;
  
  4、索引管理
  
  --創建索引
  
  CREATE INDEX indexname ON TABLENAME(COLUMNNAME);
  
  CREATE INDEX indexname ON TABLENAME(COLUMNNAME) TABLESPACE TABLESPACENAME;
  
  --重新建立索引
  
  ALTER INDEX indexname REBUILD TABLESPACE TABLESPACE;
  
  --索引分配參數
  
  ALTER INDEX indexname
  STORAGE(NEXT 400K
  MAXEXTENTS 100);
  
  --釋放索引空間
  
  ALTER INDEX indexname
  ALLOCATE EXTENT (SIZE 200K
  DATAFILE '/DISK6/indx01.dbf');
  
  ALTER INDEX indexname
  DEALLOCATE UNUSED;
  
  --重新整理索引表空間碎片
  
  ALTER INDEX indexname COALESCE;
  
  --刪除索引
  
  DROP INDEX indexname
  
  --把索引放到BUFFER_POOL中
  
  ALTER INDEX cust_name_idx
  REBUILD
  STORAGE (BUFFER_POOL KEEP);
  
  5、約束管理
  
  --建立主鍵
  
  ALTER TABLE TABLENAME
  ADD CONSTRAINT CONSTRAINTNAME PRIMARY KEY(COLUMN1,COLUMN2)
  
  --使約束無效
  
  ALTER TABLE TABLENAME ENABLE NOVALIDATE CONSTRAINT constraintname;
  
  ALTER TABLE TABLENAME ENABLE VALIDATE CONSTRAINT constraintname;
  
  --刪除約束
  
  ALTER TABLE tablename DROP CONSTRAINT constraintname;
  
  DROP TABLE tablename CASCADE CONSTRAINTS;(刪除表後將所用的外鍵刪除)
  
  --給列增加缺省值
  
  ALTER TABLE TABLENAME
  MODIFY columnname DEFAULT(value) NOT NULL;
  
  --給表增加外鍵
  ALTER TABLE tablename
  ADD CONSTRAINT constraintname
  FOREIGN KEY(column) REFERENCES table1name(column1);
  
  6、安全策略
  
  --加密傳輸
  
  把客戶端環境變量ora_encrypt_login設爲true
  把服務器端參數dblink_encypt_login設爲true
  
  --數據庫管理員安全策略
  
  a、建庫後立即修改SYS/SYSTEM的口令(9.2後必須修改其口令)
  b、只有數據庫管理員才能以SYSDBA登錄系統
  c、建立不同角色的管理員,分配不同的權限
  
  比如:對象創建於維護
  數據庫的調整與維護
  創建用戶分配角色
  啓動關閉
  恢復備份
  
  --應用開發者的安全策略
  
  a、開發者的特權只能在測試開發的數據庫中賦予權限
  b、自由開發者、受控開發者
  自由開發者:create table/index/procedure/package
  受控開發者:沒有以上權限
  
  7、日誌文件管理
  
  --切換日誌文件
  
  ALTER SYSTEM SWITCH LOGFILE;
  
  --增加日誌文件
  
  ALTER DATABASE ADD LOGFILE
  ('/DISK3/log3a.rdo',
  '/DISK4/log3b.rdo') size 1M;
  
  --增加日誌成員
  
  ALTER DATABASE ADD LOGFILE MEMBER
  '/DISK4/log1b.rdo' TO GROUP 1
  '/DISK4/log2b.rdo' TO GROUP 2;
  
  --刪除日誌文件
  
  ALTER DATABASE DROP LOGFILE GROUP 3;
  
  --刪除日誌成員
  
  ALTER DATABASE DROP LOGFILE MEMBER '/DISK4/log2b.dbf';
  
  --清除日誌文件內容
  
  ALTER DATABASE CLEAR LOGFILE '/DISK3/log2a.rdo';

三、LINUX和UNIX下
  轉到操作系統下執行:kill -9 spid (以上語句所查出的)
  
  36、ORACLE中檢查表是否被鎖的語句
  
  SELECT A.OWNER,
  A.OBJECT_NAME,
  B.XIDUSN,
  B.XIDSLOT,
  B.XIDSQN,
  B.SESSION_ID,
  B.ORACLE_USERNAME,
  B.OS_USER_NAME,
  B.PROCESS,
  B.LOCKED_MODE,
  C.MACHINE,
  C.STATUS,
  C.SERVER,
  C.SID,
  C.SERIAL#,
  C.PROGRAM
  FROM ALL_OBJECTS A,
  V$LOCKED_OBJECT B,
  SYS.GV_$SESSION C
  WHERE ( A.OBJECT_ID = B.OBJECT_ID )
  AND (B.PROCESS = C.PROCESS )
  ORDER BY 1,2
  殺掉:alter system kill session 'sid, serial#'
  37、ORACLE的登錄問題,用戶名和密碼。
  
  可以直接輸入:
  internal/oracle@serivce_name
  sys/change_on_install@serivce_name
  system/manager@serivce_name
  scott/tiger@serivce_name
  注意:
  9i中沒有internal/oracle
  如果選擇典型安裝則有 scott用戶
  如果自定義可以不安裝  scott用戶
  如果是本機則可以省略@serivce_name
  
  oem:(ORACLE ENTERPRISE MANAGER)
  sysman/oem_temp
  
  38、修改表的列名
  
  Oracle9i:
  alter table xxx rename column xx to yy;
  
  Oracle8i & lower version
  connect sys/passed;
  update col$ set name=xx where obj#=對象id and name = 字段
  (一般不要這樣用,會造成意想不到的結果)
  注:最好是刪除再建立新的列
  
  39、把用戶模式對象所在的表空間移到新的表空間
  (1). create the new tablesapce
  (2). alter user test default tablespace test_data;
  (3). alter user test quota unlimited on test_data;
  (4). alter table the_table_name move tablespace test_data;
  生成腳本:
  select 'alter table'||tname||' move tablespace test_date;'
  from tab
  where tabtype='TABLE'
  (5). rebuild the indexes;
  
  40、使用OEM備份或者EXP的步驟
  WIN2000下:
  
  (1). 控制面板――>管理工具―― >計算機管理――>本地用戶和組――>用戶――>新建用戶sys和sysman(sys和sysman 的帳號要和登陸數據庫的帳號相同);
  (2).控制面板――>管理工具―― >本地安全策略――>本地策略――>用戶權利指派――>
  作爲批處理作業登陸――>添加sys和sysman兩個帳號。
  (3).使用Enterprise Manager配置輔助工具
  開始→程序→Oracle - OraHome81→Enterprise Manager→Configuration Assistant
  a、使用Configuration Assistant工具來創建一個新的資料檔案庫。
  
  (4).控制面板――>管理工具―― > 服務,查看OracleOraHome81ManagementServer是否啓動,如果沒有啓動,則手動啓動該服務。
  (5).以sysman/oem_temp(default)登陸DBA Studio
  (第二個選項:登陸到Oracle Management Server),立即修改密碼爲你剛纔在NT下建的用戶sysman的密碼。
  (6). 以sysman/ *** (bluesky) 從開始→程序→Oracle - OraHome81→Console 登陸到 控制檯。
  在 系統→首選項→首選身份證明(我的首選身份設置如下:)
  DEFAULT節點:name:sysman
  DEFAULT數據庫:name:sys
  (7). 在搜索/添加結點後,以sysman/ *** 登陸到該結點,以sys/ *** as sysdba登陸數據庫(也就是在首選身份設置的結果)。
  (8). 在工具→備份管理→嚮導→預定義備份策略(自定義備份策略)→提交備份計劃
  (9).從開始→程序→Oracle - OraHome81→Console 登陸到 控制檯,查看活動(歷史記錄)可以看到你的備份是否成功,如果不成功,可以點擊備份看明細。(我第一次也沒成功,後來我修改系統的臨時目錄C:/WINNT/Temp→c:/temp/systmp,重新啓動機器就ok了)
  
  41、如何修改INTERNAL的口令
  
  以下是oracle8的8i你可以仿照來做
  
  (1)、進入DOS下
  
  (2)、默認internal密碼文件在c:/orant/database下,是隱藏屬性,文件名稱與數據庫實例名有關
  
  如默認ORACLE實例名爲ORCL,則internal密碼文件名爲pwdorcl.ora
  
  (3)、建立新的internal密碼文件,起個新名字爲pwdora8.ora
  
  orapwd80 file=pwdora8.ora password=B entries=5     --注:password項一定要用大寫,並且不要用單引號
  
  (4)、拷貝pwdora8.ora文件到c:/orant/database目錄下
  
  (5)、運行regedit,修改口令文件指向
  
  (6)、找到HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE項
  
  定位ORA_ORCL_PWFILE子項,改變其值爲c:/orant/database/pwdora8.ora
  
  (7)、關閉ORACLE數據庫,重新啓動
  
  (8)、進入svrmgr30服務程序,測試internal密碼是否更改成功
  
  42、憑證檢索失敗的決絕方法。
  
  原因: 由於Oracle不能應用OS認證而導致憑證檢索失敗
  
  解決辦法:
  
  (1).打開network/admin下的sqlnet.ora
  修改SQLNET.AUTHENTICATION _SERVICES=(NONE)。
  
  (2).啓動Net8 configuration assistant-->選第三項本地網絡服務名配置
  -->刪除...(刪除原來的本地網絡服務名)
  
  (3).重複第二步
  -->添加.. (新建本地網絡服務名)
  
  (4).restart oracle
  
  注意:NTS是WinNT的認證方式
  
  43、命令行編譯存儲過程
  
  ALTER PROCEDURE procedure_name COMPILE;
  
  44、關於如何建立數據庫鏈接(DBlink)
  
  可以通過建立客戶機數據庫網絡服務名的辦法,將服務器的名字或是IP地址設置爲你需要連接的那個機器就行
  
  如果你要在一個應用中連接它,現在做好上步工作,然後按如下處理
  
  建立數據庫連接
  CREATE DATABASE LINK DBaseLinkName CONNECT TO UserName IDENTIFIED BY Password USING 'NetServiceName';
  DBaseLinkName 是建立的數據連接名稱
  UserName    是可以連接到的用戶名
  Password    是可以連接到的用戶的密碼
  NetServiceName 是可以連接的數據庫網絡服務名或是數據庫名
  
  查詢建立數據連接的表實例
  Select * From TableName@ DBaseLinkName;
  
  注意:如果在CREATE DATABASE LINK DBaseLinkName CONNECT TO UserName IDENTIFIED BY Password USING 'NetServiceName';中NetServiceName 是數據庫名修改init.ora中:global_names = true
  否則global_names = false
  init.ora中:global_names = false
  
  45、Object Browser7.0中文版的破解方法
  
  到OBJECT BROWSER的目錄裏,找到DeIsL1.isu文件,用記事本打開,看到的是亂碼吧?沒關係,將Stirling Technologies ,Inc 這個字符串前面的亂碼去掉(如果有的話),讓後在Stirling之前加一個空格(一定要加的),保存,退出,重新運行一下看看,雖然還有提示輸入驗證信息,但是不用管他,直接確定就行。是不是可以用了呢?保證好使。
  
  46、錯誤號ORA-01536:space quota exceeded for table space 'ALCATEL'的解決辦法
  
  三個解決辦法,任你選擇:
  (1) alter user USERNAME quota 100M on TABLESPACENAME;
  (2) alter user USERNAME quota unlimited on TABLESPACENAME;
  (3) grant unlimited tablespace to USERNAME;
  
  47、如何在Oracle中捕獲到SQL語句的全部操作內容
  
  SELECT osuser, username, sql_text from v$session a, v$sqltext b
  where a.sql_address =b.address order by address, piece;
  
  48、ORACLE中如何實現自增字段:
  
  (1)第一種方法
  ORACLE一般的做法是同時使用序列和觸發器來生成一個自增字段.
  CREATE SEQUENCE SEQname
  INCREMENT BY 1
  START WITH 1
  MAXVALUE 99999999
  /
  CREATE TRIGGER TRGname
  BEFORE INSERT ON table_name
  REFERENCING
  NEW AS :NEW
  FOR EACH ROW
  Begin
  SELECT SEQname.NEXTVAL
  INTO :NEW.FIELDname
  FROM DUAL;
  End;
  
  (2)第二種方法:
  CREATE OR REPLACE TRIGGER TR1
  BEFORE INSERT ON temp_table
  FOR EACH ROW
  declare
  com_num NUMBER;
  BEGIN
  SELECT MAX(ID) INTO COM_NUM FROM TEMP_TABLE;
  :NEW.ID:=COM_NUM+1;
  END TR1;
  
  49、job的使用:
  
  修改initsid.ora參數
  job_queue_processes = 4      8i,9i (允許同時執行的JOB數)
  job_queue_interval = 10      8i
  job_queue_keep_connections=true    8i
  
  DBMS_JOB.SUBMIT(:jobno,//job號
  'your_procedure;',//要執行的過程
  trunc(sysdate)+1/24,//下次執行時間
  'trunc(sysdate)+1/24+1'//每次間隔時間
  );
  刪除job:dbms_job.remove(jobno);
  修改要執行的操作:dbms_job.what(jobno,what);
  修改下次執行時間:dbms_job.next_date(job,next_date);
  修改間隔時間:dbms_job.interval(job,interval);
  停止job:dbms.broken(job,broken,nextdate);
  啓動job:dbms_job.run(jobno);
  
  注意:修改後一定要COMMIT;
  
  例子:
  VARIABLE jobno number;
  begin
  DBMS_JOB.SUBMIT(:jobno,
  'Procdemo;',//Procdemo爲過程名稱
  SYSDATE, 'SYSDATE + 1/720');
  commit;
  end;
  
  50、如何配置mts
  
  修改初始化參數文件
  增加以下內容:
  mts_dispatchers = "(protocol=TCP)(disp=2)(con=1000)"
  mts_max_dispatchers = 50
  mts_servers = 20
  mts_max_servers = 50
  
  51、取出一個表的最後一條記錄
  
  select * from (select rownum id,tname.* from tname) a where a.id=(select count(*) from a);
  
  52、重做日誌(Redolog)被刪掉,通過什麼方法才能恢復!
  
  先mount數據庫,然後再目錄下建同名文件redo01.log、redo02.log、redo03.log
  然後執行alter databse clear logfile group n
  對於current的group,執行alter databse clear unarchived logfile group n
  然後,再open,就ok了
  
  53、Oracle常見服務
  
  幾個主要的:
  
  OracleOraHome81TNSListener   監聽服務
  OracleServiceSID        ORACLE服務
  OracleOraHome81Agent      智能代理服務
  OracleOraHome81CMan      連接管理服務
  OracleOraHome81HTTPServer   APACHE WEB 服務
  OracleOraHome81ManagementServer ORACLE 企業管理器服務
  OracleOraHome81Names      ORACLE命名服務
  
  剩下的也不常用。
  
  54、ORACLE的熱備份
  
  在不關閉數據庫的時候進行ORACLE的備份。
  
  原理停複雜的,你去找本書看看吧。
  
  舉個簡單的例子:備份表空間USERS
  
  ALTER TABLESPACE USERS BEGIN BACKUP
  COPY USERS TABLESPACE 的數據文件到備份目錄
  ALTER TABLESPACE USERS END BACKUP
  
  55、導致索引不起作用的解決辦法
  
  你的問題我剛處理過,是由optimizer_mode參數引起的,該參數的默認值爲choose,即爲如表有statis則查詢走基於cost的方式,否則走基於rule的方式,因些你可以有以下幾個解決方法。
  (1)、簡單的在init.ora中設optimizer_mode=rule,重起數據庫。
  (2)、使用analyze table table_name(索引基表) delete statistics;
  (3)、最後一個萬能辦法,將表和索引drop掉,重建。
  
  56、關於數據庫進程的問題。
  
  (1).查看相關進程在數據庫中的會話
  Select a.sid,a.serial#,a.program, a.status ,
  substr(a.machine,1,20), a.terminal,b.spid
  from v$session a, v$process b
  where a.paddr=b.addr
  and b.spid = &spid;
  
  (2).查看數據庫中被鎖住的對象和相關會話
  select a.sid,a.serial#,a.username,a.program,
  c.owner, c.object_name
  from v$session a, v$locked_object b, all_objects c
  where a.sid=b.session_id and
  c.object_id = b.object_id;
  
  (3).查看相關會話正在執行的SQL
  select sql_text from v$sqlarea where address =
  ( select sql_address from v$session where sid = &sid );
  
  57、查看IP地址
  select SYS_CONTEXT('USERENV','IP_ADDRESS') from dual;
  
  58、運行SQLPLUS時不用輸入用戶名和密碼,進入之後使用CONNECT
  
  SQLPLUS /NOLOG
  SQL>CONNECT SCOTT/TIGER
  
  59、查看當前會話
  
  userenv() 函數
  
  select userenv('language') from dual 字符集
  select userenv('isdba') from dual 是否DBA
  select userenv('sessionid') from dual sessionid
  select userenv('TERMINAL') from dual 客戶端名字
  select userenv('INSTANCE') from dual 實例數
  
  SYS_CONTEXT() 函數
  
  select SYS_CONTEXT('USERENV','CURRENT_SCHEMA') from dual; 當前模式
  select SYS_CONTEXT('USERENV','CURRENT_SCHEMAID') from dual; 當前模式ID
  select SYS_CONTEXT('USERENV','CURRENT_USER') from dual; 當前用戶
  select SYS_CONTEXT('USERENV','DB_NAME') from dual; 數據庫
  select SYS_CONTEXT('USERENV','HOST') from dual; 主機
  ..........
  
  60、刪除重複列的方法
  
  (1) DELETE FROM table_name A WHERE ROWID > (
  SELECT min(rowid) FROM table_name B
  WHERE A.key_values = B.key_values);
  (2) create table table2 as select distinct * from table1;
  drop table1;
  rename table2 to table1;
  (3) Delete from mytable where rowid not in(
  select max(rowid) from mytable
  group by column_name );
  (4) delete from mytable t1
  where exists (select 'x' from my_table t2
  where t2.key_value1 = t1.key_value1
  and t2.key_value2 = t1.key_value2
  ...
  and t2.rowid > t1.rowid);
  
  61、ORA-12571: TNS:packet writer failure(包寫入程序失敗)
  
  (1) 這個錯誤在客戶端遇到過,通常重新連接一下服務器就好了。
  服務器重新啓動的時候,在client也會遇到該錯誤。
  這個錯誤你是在server還是client上遇到的?最常用的辦法就是加上跟蹤,查看一下  跟蹤記錄,分析分析錯誤的原因。
  網絡問題也會出現該錯誤,比如網絡路由沒有配置好。
  (2) 安裝的殺毒軟件導致的
  (3) 服務器端的IP是否被改動
  (4) 最後不行的話,重新創建監聽器
  
  62、ORACLE服務不能自動啓動的解決辦法
  
  把ORACLEHOME/network/ADMIN/sqlnet.ora
  文件中的 sqlnet.authentication_service=(nts)
  註釋掉就可以了
  
  
  63、不完全的時間點恢復
  
  shutdown immediate
  copy 備份文件到需要恢復的目錄下
  startup mount
  recover database until time '2002-12-26 09:00:00'
  
  alter database open resetlogs
  
  自己仔細檢查一下,不會發生這樣的問題的。
  
  64、oracle如何設置查詢超時
  
  select /*+ timeout 30*/  * from veryLargeTable
  
  65、修改字符集
  
  (1)、ALTER DATABAE CHARACTER SET SIMPLIFIED CHINESE_CHINA.ZHS16GBK ;
  
  (2)、update props$ set value$='ZHS16CGB231280'
  where name='NLS_CHARACTERSET';
  update props$ set value$='ZHS16CGB231280'
  where name='NLS_NCHAR_CHARACTERSET';
  
  建議不使用(2)
  
  注意:
  (1)、執行ALTER DATABASE CHARACTER SET必須有SYSDBA權限,並且在STARTUP RESTRICT模式下執行
  (2)、原字符集必須是目標字符集的一個真子集(就是浪子所說的只能從WE8ISO8859P1轉到ZHS16GBK的原因)
  (3)、CLOB字段裝換可能有問題,建議在轉換以前把有CLOB字段的表導出後DROP,轉換以後再導回
  (4)、該轉換不可逆,所以在做這個操作以前建議做數據庫全備份
  
  66、修改數據庫名字
  
  (1)、啓動svrmgrl,以文本方式備份控制文件
  oracle>svrmgrl
  svrmgrl>connect internal
  svrmgrl>alter system backup controlfile to trace
  (2)、編輯產生的跟蹤文件,在udump目錄下
  改CREATE CONTROLFILE REUSE DATABASE "CTC" NORESETLOGS ARCHIVELOG
  中的REUSE爲SET
  然後把create controlfile這段語句拷出
  (3)、正常宕庫,後啓動到nomount下
  svrmgrl>shutdown immediate
  svrmgrl>startup nomount
  (4)、執行create controlfile那段語句
  (5)、打開數據庫
  svrmgrl>alter database open
  如提示用resetlogs選項則使用
  svrmgrl>alter database open resetlogs
  (8)、相應修改初始化參數
  
  67、rownum的用法
  
  select * from (select t.*,rownum id from dept t)
  where id between 1 and 20
  
  68、oracle的內部參數
  
  SELECT a.ksppinm NAME,
  b.ksppstdf default_val,
  a.ksppdesc DESCRIPTION
  FROM x$ksppi a,
  x$ksppcv b
  WHERE a.indx=b.indx
  AND substr(a.ksppinm,1,1)='_'
  ORDER BY a.ksppinm
  
  69、9i安裝時報areasqueries錯誤的解決辦法
  包括IAS 和 IDS
  
  把安裝源文件目錄全部改爲英文字母或數字
  注意:不能是中文的路徑
  
  70、我如何知道一個表空間還有多少可以用
  
  (1)、
  SELECT upper(f.tablespace_name) 表空間名,
  d.Tot_grootte_Mb "表空間大小(M)",
  d.Tot_grootte_Mb - f.total_bytes "已使用空間(M)",
  round((d.Tot_grootte_Mb - f.total_bytes) / d.Tot_grootte_Mb * 100,2) "使用比",
  f.total_bytes "空閒空間(M)",
  f.max_bytes "最大塊(M)"
  FROM
  (SELECT tablespace_name,
  round(SUM(bytes)/(1024*1024),2) total_bytes,
  round(MAX(bytes)/(1024*1024),2) max_bytes
  FROM sys.dba_free_space
  GROUP BY tablespace_name) f,
  (SELECT dd.tablespace_name, round(SUM(dd.bytes)/(1024*1024),2) Tot_grootte_Mb
  FROM  sys.dba_data_files dd
  GROUP BY dd.tablespace_name) d
  WHERE d.tablespace_name = f.tablespace_name
  ORDER BY 4 DESC
  (2)、select tablespace_name,round(sum(bytes)/1024/1024,2) "M" from dba_free_space
  group by tablespace_name
  
  71、creck pl/sql developer 的方法
  
  (1)、安裝pl/sql developer
  (2)、用UltraEdit將程序PLSQLDev.exe打開
  (3)、將UltraEdit設置爲16進制模式
  (4)、查找串:BA 1E 00 00 00 2B D0
  修改:2B D0 爲:4A 90
  (5)、存盤退出
  (6)、運行PLSQLDev.exe,如果提示你還有29天的時間可用,那就恭喜你了!
  
  72、使索引無效
  
  ALTER INDEX idx UNUSABLE;
  ALTER INDEX idx_acctno DISABLE;(only to a function based index)
  
  73、在SQLPLUS中給指定用戶進行 set autotrace on/off
  
  以SCOTT用戶爲例:
  
  SQL>CONNECT scott/tiger
  
  connected.
  
  SQL>@$ORACLE_HOME/RDBMS/ADMIN/UTLXPLAN.SQL
  
  Table created.
  
  SQL>CONNECT / AS SYSDBA
  
  connected.
  
  SQL>@$ORACLE_HOME/SQLPLUS/ADMIN/PLUSTRCE.SQL
  
  drop role plustrace;
  Role dropped.
  create role plustrace;
  Role created.
  .
  grant plustrace to dba with admin option;
  Grant succeeded.
  
  SQL>GRANT PLUSTRACE TO SCOTT;
  
  Grant succeeded.
  
  SQL>CONNECT SCOTT/TIGER
  
  connected.
  
  SQL>set autotrace on
  
  SQL>
  
  74、關於約束的四種狀態
  
  Disabled novalidate:當約束使不能時,約束的規則不能強制在列
  (包含在約束中)的數據之上。但約束的定義保存在數據字典中。
  在執行數據倉庫捲起(rollup)或裝載且要加快裝載過程時該方式
  是有用的。
  Enabled novalidate:是能無效,該狀態的表可以包含非法
  的數據,但不可能加入新的非法數據。
  Enabled validate:使能有效,一個使能的約束是強制的,表的數據檢查
  有效
  
  75、在SQLPLUS中調用存儲過程
  
  SET SERVEROUTPUT ON
  declare
  out_param varchar2(100);
  begin
  your_proc(1,out_param);
  dbms_output.put_line(out_param);
  end;
  /
  SET SERVEROUTPUT OFF
  
  75、生成系統表和存儲過程的三個文件。
  
  cat*.sql
  dbms*.sql
  utl*.sql
  
  76、JOB中日期的使用
  
  每個月1號:
  last_day(sysdate)+1
  每個季度的第一天:
  to_date(decode(to_char(sysdate,'q'),'1',to_char(sysdate,'yyyy')||'0101',
  '2',to_char(sysdate,'yyyy')||'0401','3',to_char(sysdate,'yyyy')||'0701',
  '4',to_char(sysdate,'yyyy')||'1001'),'yyyymmdd')
  每天:
  sysdate+1
  每個星期幾:
  decode(to_char(sysdate,'w'),'1',sysdate+7,
  to_char(sysdate,'w'),'2',sysdate+6,to_char(sysdate,'w'),'3',sysdate+5,
  to_char(sysdate,'w'),'4',sysdate+4,to_char(sysdate,'w'),'5',sysdate+3,
  to_char(sysdate,'w'),'6',sysdate+2,to_char(sysdate,'w'),'7',sysdate+1)
  
  每個星期x下午三點:interval(21, 'next_day(trunc(sysdate),x+1)+15/24');
  
  每個季度的第一個星期x:
  interval(21, 'next_day(trunc(sysdate,''Q''),3),5)');
  
  77、使用execute immediate 的問題
  
  8i以上才支持execute immediate
  8.05只能用dbms_sql
  最好使用execute immediate
  
  78、ORACLE9i中刪除表空間中數據文件的方法
  
  drop tablespace tbsname including contents
  
  79、找出串中的數字
  
  SELECT TRANSLATE('2KRW229',
  '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ','0123456789')
  "Translate example"
  FROM DUAL
  /
  
  2229
  
  --全是數字的:
  select * from 你的表 where translate(你的列,'0123456789',' ')='';
  
  select * from 你的表 where trim(ltrim(rtrim(replace(col_name,'0123456789',' ')))) is null
  
  80、分析表
  analyze table mzbs.db_code ESTIMATE STATISTICS SAMPLE 20 PERCENT;
  
  81、表空間管理和用戶管理
  
  --查看錶空間和數據文件
  
  select file_name,tablespace_name,autoextensible from dba_data_files;
  
  --數據表空間
  
  CREATE TABLESPACE USER_DATA
  LOGGING
  DATAFILE 'D:/ORACLE/ORADATA/ORCL/test.DBF' SIZE 50m REUSE ,
  'c:/USERS01112.DBF' SIZE 50m REUSE
  AUTOEXTEND
  ON NEXT 1280K MAXSIZE 16383M EXTENT MANAGEMENT LOCAL
  
  --臨時表空間
  
  CREATE TEMPORARY
  TABLESPACE USER_DATA_TEMP TEMPFILE 'D:/TEMP0111.DBF'
  SIZE 50M REUSE AUTOEXTEND
  ON NEXT 1024K MAXSIZE 16383M EXTENT MANAGEMENT LOCAL UNIFORM
  SIZE 1024K
  
  
  --增加數據文件
  
  ALTER TABLESPACE USER_DATA
  ADD DATAFILE 'c:/USERS01113.DBF' SIZE 50M;
  
  ALTER TABLESPACE USER_DATA
  ADD DATAFILE 'c:/USERS01114.DBF' SIZE 50M
  AUTOEXTEND ON
  ;
  
  --刪除表空間
  
  DROP TABLESPACE USER_DATA INCLUDING CONTENTS;
  
  --修改數據文件大小
  ALTER DATABASE
  DATAFILE 'c:/USERS01113.DBF' RESIZE 40M;
  
  --創建用戶、賦予權限
  
  CREATE USER USER_DATA PROFILE DEFAULT IDENTIFIED BY USER_DATA
  DEFAULT
  TABLESPACE USER_DATA TEMPORARY
  TABLESPACE USER_DATA ACCOUNT UNLOCK;
  
  GRANT CONNECT TO USER_DATA;
  GRANT RESOURCE TO USER_DATA;
  
  --把表移到另一個表空間
  ALTER TABLE TABLENAME MOVE TABLESPACE TABLESPACENAME;
  
  --創建索引
  
  CREATE INDEX INDEXNAME ON TABLENAME(COLUMNNAME);
  
  CREATE INDEX INDEXNAME ON TABLENAME(COLUMNNAME) TABLESPACE TABLESPACENAME;
  
  --重新建立索引
  
  ALTER INDEX INDEXNAME REBUILD TABLESPACE TABLESPACE;
  
  --創建表
  
  CREAE TABLE TABLENAME
  (COLUMN1 COLUTYPE DEFAULT(VALUE) NOT NULL)
  (COLUMN2 COLUTYPE DEFAULT(VALUE) NOT NULL);
  
  --建表的索引存儲分配
  
  CREATE TABLE summit.employee(id NUMBER(7) CONSTRAINT employee_id_pk PRIMARY KEY DEFERRABLE USING INDEX STORAGE(INITIAL 100K NEXT 100K)
  TABLESPACE indx,
  last_name VARCHAR2(25) CONSTRAINT employee_last_name_nn NOT NULL,
  dept_id NUMBER(7))
  TABLESPACE data;
  
  --建立主鍵
  
  ALTER TABLE TABLENAME
  ADD CONSTRAINT CONSTRAINTNAME PRIMARY KEY(COLUMN1,COLUMN2)
  
  --使約束無效
  
  ALTER TABLE TABLENAME ENABLE NOVALIDATE CONSTRAINT CONSTRANAME;
  
  ALTER TABLE TABLENAME ENABLE VALIDATE CONSTRAINT CONSTRANAME;
  
  --刪除約束
  
  ALTER TABLE TABLENAME DROP CONSTRAINT constraintname;
  
  DROP TABLE TABLENAEM CASCADE CONSTRAINTS;(刪除表後將所用的外鍵刪除)
  
  --給表增加列
  
  ALTER TABLE TABLENAME
  ADD COLUMN COLUTYPE DEFAULT(VALUE) NOT NULL;
  
  --給列增加缺省值
  
  ALTER TABLE TABLENAME
  MODIFY COLUMNNAME DEFAULT(VALUE) NOT NULL;
  
  --給表增加外鍵
  ALTER TABLE TABLENAME
  ADD CONSTRAINT CONSTRAINTNAME
  FOREIGN KEY(COLUMN) REFERENCES TABLE1NAME(COLUMN1);

四、PB動態庫
  pbvm70.dll pbdwe70.dll Pbo7370.dll PBO8470.DLL pbodb70.dll libjcc.dll
  
  Oracle的客戶端不安裝讓pb連上,我記得以前有帖子的,你可以搜索一下。
  具體步驟。
  (1).先在某機器上安裝好客戶端(最好安裝在c盤);
  (2).複製此客戶端oracle目錄下的所有文件作爲獨立的oracle安裝文件;
  (3).搜索註冊表,找到 HKey_Local_machine/software/oracle,把此項目及分支全部導出。
  (4).打包好你的pb程序,並獨立打包好oracle客戶端和註冊表導出文件。
  (5).到乾淨的客戶端,解開兩個包,導入註冊表文件,然後加入路徑支持:
  path=%path%;"c:/Ora817/bin"
  這樣處理,應該沒有問題,因爲我就是這樣快速處理了幾十個機器。
  
  若不想搞註冊表,你可以在程序中自己寫註冊表,構成Oracle客戶端必要的註冊表支持,至於路徑,手工添加應該不難。
  
  至於Oracle客戶端那些文件不需要,這個不好說,你可以把那些bin目錄下的所有exe刪除,Oracle Document刪除(7x兆)
  
  至於定義Oracle服務,找到 Ora817/net80/admin/TnsName.ora,參照格式,程序中生成一個也不麻煩。
  
  =======================================================
  2、在ORACLE中返回遊標結果集
  
  你需要寫到一個包中:
  create or replace package pag_cs_power as
  
  type c_Type is ref cursor;
  
  FUNCTION FUN_CS_GETDICTLIST(
  v_DictIndex in varchar2) return c_Type;
  
  end pag_cs_power;
  
  函數代碼:
  
  FUNCTION FUN_CS_GETDICTLIST(
  v_DictIndex in varchar2) return c_Type
  as
  c_cursor      c_Type;
  begin
  open c_cursor for
  select DICTID,DICTNAME FROM SYS_DICT WHERE DICTINDEX = v_DictIndex;
  return c_cursor;
  end FUN_CS_GETDICTLIST;
  ----------------------------------------------------------------------
  3、P4機器安裝ORACLE
  
  (1)、將ORACLE安裝軟件拷貝到硬盤。
  (2)、將 硬盤目錄文件/stage/Components/oracle.swd.jre/1.1.7.30/1
  /DataFiles/Expanded/jre/win32/bin/symcjit.dll的文件改名爲symcjit.old
  (3).再運行SETUP.exe 文件進行安裝。
  -----------------------------------------------------------------------
  4、單引號的插入問題
  
  SQL> insert into a values('i''m good');       --兩個''可以表示一個'
  
  SQL> insert into a values('i'||chr(39)||'m good'); --chr(39)代表字符'
  
  SQL> insert into a values('a'||'&'||'b');
  
  -----------------------------------------------------------------------
  5、全數據庫的導入與導出
  
  exp username/password full=y file=yourdata.dmp grants=y rows=y
  imp username/password full=y ignore=y file=yourdata.dmp grants=y
  
  6、exp與imp的具體用法
  
  exp username/password@mzbs_61 full=y file=yourdata.dmp grants=y rows=y
  imp username/password full=y ignore=y file=yourdata.dmp grants=y
  
  exp mzbs/mzbs@mzbs_61 file = c:/zzzzzzz.dmp grants = y rows = y
  imp mzbs/mzbs@mzbs_61 file = c:/zzzzzzz.dmp grants = y ignore=y FULL=Y
  
  (1)
  
  exp參數:
  關鍵字  說明(默認)
  ----------------------------------------------
  USERID  用戶名/口令
  FULL  導出整個文件 (N)
  BUFFER  數據緩衝區的大小
  OWNER  所有者用戶名列表
  FILE  輸出文件 (EXPDAT.DMP)
  TABLES  表名列表
  COMPRESS 導入一個範圍 (Y)
  RECORDLENGTH IO 記錄的長度
  GRANTS  導出權限 (Y)
  INCTYPE  增量導出類型
  INDEXES  導出索引 (Y)
  RECORD  跟蹤增量導出 (Y)
  ROWS  導出數據行 (Y)
  PARFILE  參數文件名
  CONSTRAINTS 導出限制 (Y)
  CONSISTENT 交叉表一致性
  LOG  屏幕輸出的日誌文件
  STATISTICS 分析對象 (ESTIMATE)
  DIRECT  直接路徑 (N)
  TRIGGERS 導出觸發器 (Y)
  FEEDBACK 顯示每 x 行 (0) 的進度
  FILESIZE 各轉儲文件的最大尺寸
  QUERY  選定導出表子集的子句
  
  imp參數:
  關鍵字  說明(默認)
  ----------------------------------------------
  USERID  用戶名/口令
  FULL  導入整個文件 (N)
  BUFFER  數據緩衝區大小
  FROMUSER 所有人用戶名列表
  FILE  輸入文件 (EXPDAT.DMP)
  TOUSER  用戶名列表
  SHOW  只列出文件內容 (N)
  TABLES  表名列表
  IGNORE  忽略創建錯誤 (N)
  RECORDLENGTH IO 記錄的長度
  GRANTS  導入權限 (Y)
  INCTYPE  增量導入類型
  INDEXES  導入索引 (Y)
  COMMIT  提交數組插入 (N)
  ROWS  導入數據行 (Y)
  PARFILE  參數文件名
  LOG  屏幕輸出的日誌文件
  CONSTRAINTS 導入限制 (Y)
  DESTROY  覆蓋表空間數據文件 (N)
  INDEXFILE 將表/索引信息寫入指定的文件
  SKIP_UNUSABLE_INDEXES 跳過不可用索引的維護 (N)
  ANALYZE  執行轉儲文件中的 ANALYZE 語句 (Y)
  FEEDBACK 顯示每 x 行 (0) 的進度
  TOID_NOVALIDATE 跳過指定類型 id 的校驗
  FILESIZE 各轉儲文件的最大尺寸
  RECALCULATE_STATISTICS 重新計算統計值 (N)
  
  (2)
  
  一、建立一個expdata.sql文件
  
  USERID=RMTAFIS/3    這裏寫你的用戶名和密碼
  BUFFER=32768
  OWNER=RMTAFIS     這裏寫導出的用戶
  FILE=E:/Exp/RMTAFIS.DMP   導出的文件,可以是相對路徑
  ROWs=Y
  GRANTS=Y
  COMPRESS=Y
  CONSISTENT=Y
  
  二、建立一個expdata.bat
  exp parfile=expdata.sql
  如果是805
  exp80 parfile=expdata.sql
  雙擊expdata.bat就導出數據了
  
  7、如果在like的變量中,是以‘%’開頭的話,是不會使用index的。反之,不是以‘%‘開頭,而又有相應的index,是會使用index的。具體可以用plain plan來看一下。
  
  8、複製空表結構
  create table new_table
  as select * from old_table where 1=2;
  複製表(含記錄)
  create table new_table
  as select * from old_table ;
  
  9、把一個用戶下的表導入到另一個用戶下,但需要改名
  
  先用exp導出所有的表;
  用imp將導出的表導入到新用戶;
  在新用戶下,執行
  select 'RENAME TABLE '||tname||' TO NEW_'||tname||';'
  from tab
  where tabtype='TABLE';
  將上面的查詢結果保存到一個sql文件中,處理後執行就可以了。
  
  10、審計步驟
  
  修改參數文件init.ora,參數audit_trail值爲true;
  重新啓動數據庫;
  打開審計audit session; (audit session by username)
  執行登錄操作;
  察看審計結果:
  select * from dba_audit_session;
  select * from sys.aud$;
  select * from dba_audit_trail;
  select * from dba_audit_exists;
  關於審計:
  
  爲了使oracle8i的審計功能可用,必須在數據庫參數文件中修改audit_trail初始參數,而這個修改並不支配oracle8i把生成的審計記錄記入審計痕跡中,
  由於狀態,特權和模式對象已被修改,因而審計的默認值不可用,其參數應設置爲none.下面列出了audit_trail 可用的參數
  
  db_使數據庫審計和全部直屬審計記錄到數據庫審計的痕跡中
  os_是數據庫審計依據直屬審計記入到操作系統的審計很集中
  none_不可用
  
  11、BFILE的用法
  
  (1)、create or replace directory
  BFILE_TEST
  as
  '/oracle/oradata/bfiles';
  
  (2)、grant read on directory BFILE_TEST to SCOTT;
  
  (3)、host ls -l /oracle/oradata/bfiles/1.TXT
  
  (4)、connect SCOTT/TIGER
  create table BFILES (ID number, TEXT bfile );
  
  (5)、insert into BFILES values ( 1,
  bfilename ( 'BFILE_TEST', '1.TXT' ) );
  
  12、如何在Windows 2000下將Oracle完全卸載?
  
  一、系統環境:
  (1)、操作系統:Windows 2000 Server,機器內存128M
  (2)、數據庫: Oracle 8i R2 (8.1.6) for NT 企業版
  (3)、安裝路徑:D:/ORACLE
  
  二、卸載步驟:
  (1)、開始->設置->控制面板->管理工具->服務
  停止所有Oracle服務。
  
  (2)、開始->程序->Oracle - OraHome81->Oracle Installation Products->Universal Installer
  卸裝所有Oracle產品
  
  (3)、運行regedit,選擇HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE,按del鍵刪除這個入口。
  
  (4)、運行regedit,選擇HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services,滾動這個列表,刪除所有Oracle入口
  
  (5)、從桌面上、STARTUP(啓動)組、程序菜單中,刪除所有有關Oracle的組和圖標
  
  (6)、重新啓動計算機,重起後才能完全刪除Oracle所在目錄
  
  (7)、刪除與Oracle有關的文件,選擇Oracle所在的缺省目錄C:/Oracle,刪除這個入口目錄及所有子目錄,
  
  並從Windows 2000目錄(一般爲C:/WINNT)下刪除以下文件
  
  ORACLE.INI、oradim80.INI
  
  (8)、WIN.INI文件中若有[ORACLE]的標記段,刪除該段
  
  --------------------------------------------------------------------
  13、如何使用SQLPLUS和SVRMGRL運行腳本
  
  (1)、用sqlplus調用:
  
  c:/script.txt的內容
  startup;
  
  命令行:sqlplus internal/oracle @c:/script.txt
  
  (2)、用svrmgrl調用:
  c:/script.txt的內容
  
  connect internal/oracle;
  startup;
  
  命令行:svrmgrl @c:/script.txt
  
  --------------------------------
  14、ORACLE的臨時表
  
  CREATE GLOBAL TEMPORARY TABLE TABLENAME (
  COL1 VARCHAR2(10),
  COL2 NUMBER
  ) ON COMMIT PRESERVE(DELETE) ROWS ;
  這種臨時表不佔用表空間,而且不同的SESSION之間互相看不到對方的數據
  在會話結束後表中的數據自動清空,如果選了DELETE ROWS,則在提交的時候即清空數據,PRESERVE則一直到會話結束
  
  ----------------
  在Oracle8i中,可以創建以下兩種臨時表:
  (1)會話特有的臨時表
  CREATE GLOBAL TEMPORARY ()
  ON COMMIT PRESERVE ROWS;
  
  (2)事務特有的臨時表
  CREATE GLOBAL TEMPORARY ()
  ON COMMIT DELETE ROWS;
  CREATE GLOBAL TEMPORARY TABLE MyTempTable
  所建的臨時表雖然是存在的,但是你試一下insert 一條記錄然後用別的連接登上去select,記錄是空的,明白了吧,我把下面兩句話再貼一下:
  --ON COMMIT DELETE ROWS 說明臨時表是事務指定,每次提交後ORACLE將截斷表(刪除全部行)
  --ON COMMIT PRESERVE ROWS 說明臨時表是會話指定,當中斷會話時ORACLE將截斷表。
  衝突的問題更本不用考慮.
  
  臨時表只是保存當前會話(session)用到的數據,數據只在事務或會話期間存在。
  
  通過CREATE GLOBAL TEMPORARY TABLE命令創建一個臨時表,對於事務類型的臨時表,
  數據只是在事務期間存在,對於會話類型的臨時表,數據在會話期間存在。
  
  會話的數據對於當前會話私有。每個會話只能看到並修改自己的數據。DML鎖不會加到
  臨時表的數據上。下面的語句控制行的存在性。
  
  ● ON COMMIT DELETE ROWS 表名行只是在事務期間可見
  ● ON COMMIT PRESERVE ROWS 表名行在整個會話期間可見
  
  可以對臨時表創建索引,視圖,出發器,可以用export和import工具導入導出表的
  定義,但是不能導出數據。表的定義對所有的會話可見。
  
  例如:
  CREATE GLOBAL TEMPORARY TABLE TEMP_TAB1(
  table_name VARCHAR2(20),
  primary_key VARCHAR2(100),
  field VARCHAR2(1000))
  ON COMMIT PRESERVE ROWS;
  
  CREATE GLOBAL TEMPORARY TABLE TEMP_TAB2(
  table_name VARCHAR2(20),
  primary_key VARCHAR2(100),
  field VARCHAR2(1000))
  ON COMMIT DELETE ROWS;
  
  15、如何使用OEM
  先啓數據庫服務,再啓oracle manager服務。
  否則重建檔案資料庫
  如果還不行就把ORACLEHOME/NETWORK/sqlnet.ora文件的內容
  sqlnet.authentication_services=(NTS)
  改成sqlnet.authentication_services=(NONE)
  
  登錄 sysman/oem_temp
  
  16、TNS:沒有監聽器的問題。
  
  (1)查一下監聽服務是否啓動,
  如果沒有啓動,則運行lsnrctrl start。
  (2)查看一下 LISTENER.ORA內監聽的服務器名、服務器IP、數據庫名是否正確。
  (3)查看一下 TNSNAMES.ORA內服務器名、服務器IP、數據庫名是否正確。
  
  17、LINUX、UNIX下自動啓動ORACLE服務
  
  (1)
  
  !/bin/sh
  
  # chkconfig: 345 51 49
  # description: starts the oracle dabase deamons
  #
  
  ORA_HOME=/u01/app/oracle/product/8.1.7
  ORA_OWNER=oracle
  case "$1" in
  'start')
  echo -n "Starting Oracle8i: "
  su - $ORA_OWNER -c $ORA_HOME/bin/dbstart
  touch /var/lock/subsys/oracle8i
  echo
  ;;
  
  'stop')
  
  echo -n "Shutting down Oracle8i: "
  su - $ORA_OWNER -c $ORA_HOME/bin/dbshut
  rm -f /var/lock/subsys/oracle8i
  echo
  ;;
  
  'restart')
  
  echo -n "Restarting Oracle8i: "
  $0 stop
  $0 start
  echo
  ;;
  
  *)
  echo "Usage: oracle8i { start | stop | restart }"
  exit 1
  
  esac
  exit 0
  
  我仿照su - $ORA_OWNER -c $ORA_HOME/bin/dbshut 的形式
  添加su - $ORA_OWNER -c $ORA_HOME/bin/lsnrctl start
  但是在系統啓動的時候listener啓動不了
  
  (2)
  
  /etc/rc.local
  改成如下就可以了
  touch /var/lock/subsys/local
  #echo 2147483648 > /proc/sys/kernel/shmmax
  echo -n "Starting Oracle Database:"
  date +"%D %T %a"
  su - oracle -c "lsnrctl start"
  #su - oracle -c "sqlplus /nolog @startmaster.sql"
  echo -n "Oracle Database Started:"
  date +"%D %T %a"
  -------------
  第一個#是改共享內存大小的
  第二個#是啓動數據庫的。
  
  (3)
  ftp://ftp.rpmfind.net/linux/rhcontrib/7.1/i386/oraclerun9i-1.0-1.i386.rpm
  
  下載這個軟件包並安裝。
  
  裏面每個文件都有一些要修改的地方。配置完成之後,就可以在系統服務配置中找到它,選中它就可能以自啓動了。
  
  18、回滾段不夠的處理方法
  
  (1)、先使回滾段脫機一個,
  如果不好用,則再脫機一個。直至好用。
  ALTER rollback segment rollbackname offline;
  (2)、增加回滾段數據文件的大小
  alter database datafile 'datafile' resize 200M;
  
  19、WINNT向WIN2000移植
  
  不用EXP和IMP的
  
  停掉數據庫的服務後,可以做一個數據庫的全備份。
  
  在WIN2000上建一個同名的數據庫,隨便建,越小越好,可以縮短時間。
  把WINNT下的數據庫備份恢復到WIN2000的數據庫上就可以了。但建庫的目錄
  必須一樣。(也可以不一樣,但需要更改數據文件的連接)
  
  我曾多次爲用戶這樣移植數據,萬無一失的。
  注意:因爲數據很重要,所以建議你先EXP備份一下。這是我們的習慣。
  
  20、ORACLE SQL PLUS Worksheet亂碼問題。
  
  dbappscfg.properties,修改該文件即可解決上述問題。$ORACLE_HOME/sysman/config目錄下,修改
  # SQLPLUS_NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1
  爲SQLPLUS_NLS_LANG=AMERICAN_AMERICA.ZHS16GBK。
  
  對於Windows操作系統,還需要修改一項
  #SQLPLUS_SYSTEMROOT=c://WINNT40
  爲SQLPLUS_SYSTEMROOT=C://WINNT
  
  如操作系統的主目錄在C盤的Winnt下
  
  對於後面一項的修改只對Windows操作系統進行,對UNIX操作系統則不需要。如果在Windows操作系統中不修改該項,在Oracle Enterprise Manager中,連接系統時,會提示如下的錯誤:
  ORA-12560 TNS:protocol adapter error
  或者
  ORA-12545 Connect failed because target host or object does not exist
  重新連接SQL PLUS Worksheet
  
  21、DROP掉名字是小寫的表(用雙引號括起來)。
  
  drop table "tablename"
  select * from "tablename"
  
  22、日期的顯示格式
  注意:SIMPLIFIED CHINESE(簡體中文需要" "括起來)
  別的國家不用" " 例如:ENGLISH
  select to_char(sysdate,'DAY','NLS_DATE_LANGUAGE=''SIMPLIFIED CHINESE''') from dual;
  ------------
  星期四
  ------------
  
  23、一個從ORACLE中讀表信息的存儲過程
  
  可以在vc下調用存儲過程來實現
  例子:
  先修改init.ora
  例如:
  utl_file_dir=/usr  //路徑爲 oracle所在的盤:/usr
  此過程將用戶TEMP的P1過程的代碼保存到ORACLE安裝盤下/USR/TEXT.TXT中
  create or replace procedure TEST
  is
  file_handle utl_file.file_type;
  STOR_TEXT VARCHAR2(4000);
  N NUMBER;
  I NUMBER;
  begin
  I:=1;
  SELECT MAX(LINE) INTO N FROM ALL_SOURCE WHERE OWNER='TEMP' AND NAME='P1';
  file_handle:=utl_file.fopen('/usr','test.txt','a');
  WHILE I<=N LOOP
  SELECT TEXT INTO STOR_TEXT FROM ALL_SOURCE WHERE OWNER='TEMP' AND NAME='P1' AND LINE= I;
  I:=I+1;
  utl_file.put_line(file_handle,stor_text);
  END LOOP;
  utl_file.fclose(file_handle);
  commit;
  end TEST;
  /
  
  24、關於修改ORACLE的列寬
  (1)、不論如何都要備份數據。
  (2)、如果沒有數據,則可以修改寬度。比如NUMBER,CHAR,VARCHAR2
  (3)、如果有數據,則可以增加寬度。比如NUMBER,CHAR,VARCHAR2
  注意:不可以減小寬度。
  (4)、語法:alter talbe tablename modify columnname columntype not null;
  
  25、如何查看用戶的存儲過程和函數
  
  select name,text from user_source where name= Procedurename and type = 'PROCEDURE' order by line;
  
  26、在批處理中自動啓動ORACLE服務(win2000)
  
  編一個批處理文件
  net start OracleServiceSID
  OracleServiceSID是ORACLE的實例名稱
  
  27、對行加鎖時,只對tb1加鎖
  
  select tb1.r1 from tb1, tb2 where tb1.r2 = tb2.r2 and tb2.r1 = xxx for update of tb1.r1 nowait
  
  28、得到列的信息
  
  desc tablename
  select cname from col where tname='TABLENAME';
  select column_name from user_tab_columns where table_name='TABLENAME';
  select column_name from ALL_tab_columns where table_name='TABLENAME';
  select column_name from dba_tab_columns where table_name='TABLENAME';
  select column_name from user_col_comments where table_name='TABLENAME';
  select column_name from all_col_comments where table_name='TABLENAME';
  select column_name from dba_col_comments where table_name='TABLENAME';
  
  29、使觸發器無效(login_on)
  
  svrmgrl
  connect internal/oracle
  alter trigger login_on disable;
  
  使觸發器爲無效alter trigger yourtriggername disable
  
  如果是對於某一個表的所有的觸發器:
  alter table yourtablename disable all triggers
  
  30、如在SQLPLUS中何調用存儲過程和函數。
  
  call只能調用存儲過程後面加上括號就可以了
  call 存儲過程名();
  exec procedurename;(可以不加())
  調用函數用sql語句
  select 函數名(參數) from dual;
  
  31、函數中如果調用DML語句就不可以調用SELECT語句
  
  32、REDO LOG BUFFER 什麼時候寫到REDO LOGFILE中
  (1)、在COMMIT的時候
  (2)、重做日誌緩衝區1/3滿的時候
  (3)、重做日誌緩衝區大於1M的時候
  (4)、它寫信息必須是在數據寫進程前調用
  (5)、一般CHECKPOINT在日誌組切換的時候進行或者由初始化參數設定
  在CHECKPOINT的時候需要調用數據寫進程
  
  33、ORACLE的http server 把原有的WEB server沖掉,如何解決?
  
  (1).如果你原來的http server是用IIS等其他發佈工具做的,那麼可以在服務中停掉     oracle http server服務,並且改爲手動啓動。
  (2).如果原來的http server是用apache發佈,則可以改變http.conf中的參數
  
  34、關於創建重建查看索引
  
  創建索引:
  CREATE INDEX IND_NAME ON TABLE_NAME(COL1,COL2,...);
  
  重建索引:
  ALTER INDEX IND_NAME REBUILD;
  
  查看索引:
  
  SELECT * FROM USER_INDEXES WHERE INDEX_NAME='IND_NAME';
  
  35、ORACLE如何查殺用戶的進程
  
  一|根據用戶的應用程序和SQL語句,在DBA STUDIO找到用戶的SESSION並斷開其連接
  
  二、
  
  (1)、要殺掉一個session應先應知道其sid和serial#,假設你已經知道。
  (2)、select paddr from v$session where sid=v_sid and serial#=v_serial#
  select spid from v$process where addr=paddr(以上語句所查出的);
  
  (3)、使用ALTER SYSTEM KILL SESSION 'v_sid,v_serial#' immediate; 試一試如不行轉
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章