C:\Adminstrator> sqlplus "/as sysdba" 查看是否鏈接到數據庫 SQL> select status from v$instance; v$動態表開頭,查看動態實例,open爲啓動。 SQL> shutdown immediate關閉數據庫 SQL> startup 繼續啓動 SQL> show parameter db_name 查看數據庫名稱 查詢數據庫SCOTT用戶默認的狀態 SQL> select username,account_status from dba_users where username='SCOTT'; SQL> desc user_tables; 描述 SQL> alter user ~scott數據庫用戶名~ account unlock; SQL> show user查看當前數據庫用戶 切換用戶 SQL> conn scott/dan 用戶名/密碼 C:\Adminstrator> sqlplus scott/dan 進入數據庫 oracle 命令 操做 內容包括三大項: 1.Oracle基本操做語句 2.SQLServer基本操做語句 3.各類數據庫鏈接方法 **************************************************oracle基本操做語句******************************************************** 打開服務器 net start oracleservicebinbo 打開監聽器 lsnrctl start 關閉服務器 net stop oracleservicebinbo 關閉監聽器 lsnrctl stop =============================================================== 清屏 clear screen **************************************************************** 數據字典 ===========desc user_views(關鍵詞) **************************************************************** =============================================================== 查看當前用戶的角色 SQL>select * from user_role_privs; =============================================================== 查看當前用戶的系統權限和表級權限 SQL>select * from user_sys_privs; SQL>select * from user_tab_privs; =============================================================== 查看當前用戶的缺省表空間 SQL>select username,default_tablespace from user_users; =============================================================== 換用戶 conn as sysdba sys tsinghua sqlplus "sys/tsinghua as sysdba" conn sys/zl as sysdba =============================================================== 修改表結構 alter table test modify(name not null); alter table test add(name varchar2(20)); alter table test drop column sex; alter table test set unused column sex; alter table test drop unused columns; =============================================================== 更改用戶密碼 sql>alter user 管理員 identified by 密碼; =============================================================== 建立表空間的數據文件 sql>create tablespace test datafile 'd:oraclebinbo.dbf' size 10m; =============================================================== 建立用戶 sql>create user 用戶名 identified by 用戶名; =============================================================== bfile類型實例 建立目錄 create directory tnpdir as 'c:'; 刪除目錄 drop directory tnpdir 受權 grant read on directory tn pdir to scott; 建表 create table bfiletest(id number(3), fname bfile); 添加數據 insert into bfiletest values(1,bfilename('TMPDIR','tmptest.Java')); =============================================================== 查看用戶 sql>show user =============================================================== 檢查語句是否有錯 show error =============================================================== 鎖定用戶 sql>alter user 用戶名 account lock =============================================================== 解除用戶 sql>alter user 用戶名 account unlock =============================================================== 刪除用戶 sql>drop user zl; =============================================================== 給用戶建立表權限 sql>grant create table to 用戶名; =============================================================== 授管理員權限 sql>grant dba to 用戶名; =============================================================== 給用戶登陸權限 sql>grant connect to 用戶名 =============================================================== 給用戶無限表空間權限 sql>grant unlinmited tablespace to 用戶名; =============================================================== 收回權限 sql>revoke dba from 用戶名; =============================================================== 查看用戶下全部的表 SQL>select * from user_tables; =============================================================== 查看名稱包含log字符的表 SQL>select object_name,object_id from user_objects where instr(object_name,'LOG')>0; =============================================================== 查看某表的建立時間 SQL>select object_name,created from user_objects where object_name=upper('&table_name'); =============================================================== 查看某表的大小 SQL>select sum(bytes)/(1024*1024) as "size(M)" from user_segments where segment_name=upper('&table_name'); =============================================================== 查看放在ORACLE的內存區裏的表 SQL>select table_name,cache from user_tables where instr(cache,'Y')>0; =============================================================== 再添加一個表空間的數據文件 sql>alter tablespace test add datafile 'd:oracletest1.dbf' size 10m; =============================================================== 建表 SQL>create table studen(stuno int,stuname varchar(8) not null,stubirth date default to_date('1987-5-9','YYYY-MM-DD')); 向表結構中加入一列 SQL>alter table studen add(stuphoto varchar(9)); 從表結構中刪除一列 SQL>alter table studen drop column stuphoto; 修改表一列的長度 SQL>alter table studen modify(stuno number(4)); 隱藏將要刪除的一列 SQL>alter table studen set unused column stuphoto; 刪除隱藏的列 SQL>alter table studen drop unused columns; 向表中加入約束 SQL>alter table studen add constraint pk primary key(stuno); 刪除約束 SQL>alter table studen drop constraint pk; =============================================================== 建立表 sql>create table 用戶名(name varchar2(20),password varchar(20)) tablespace 空間名; =============================================================== 添加字段 sql>alter table test add(column_x char(10) not null); =============================================================== 更改字段 sql>alter table emp modify(column_x char (20)); =============================================================== 刪除字段 如待刪除域屬於某個索引,則不容許刪除操做,必須將此域先設置爲NULL。 sql>alter table emp modify(column_x null); sql>update emp set column_x=null; sql>commit; sql>alter table emp drop(column_x); =============================================================== 選擇表空間 sql>alter user 用戶名 default tablespace test; =============================================================== 管理員刪除別的用戶中的表 sql>drop table 用戶名.表名; =============================================================== 退出 sql>exit; =============================================================== 默認進入 sql>sqlplus "/ as sysdba" =============================================================== 查看數據庫 sql>show parameter block; =============================================================== 寫大量語句用記事本,新建方式。 輸入"ed"回車 保存後 輸入"/"運行; =============================================================== 查詢用戶有多少表 sql>select * from tab; =============================================================== SQLServer取時間 sql>select getdate oracle 取時間 sql>sysdate; =============================================================== 操做表結構數據庫定義語言命令 (不記錄在日誌文件中) create table建表 sql>create table test(name varchar2(20),age date,sex char(2)); sql>insert into test(name,age,sex) values('aa',sysdate,'男'); sql>insert into test(name,age,sex) values('bb',to_date('1888-8-8',"yyyy-aa-dd hh24:mi:ss"),'男'); sql>select * from test; =============================================================== 查詢男和女總數 sql>select sex,count(sex) from test group by sex; --------------------------------------------------------------- test表中數據輸入test1表中 SQLSserver---select * into test1 from test; oracle---create table test1 as select * from test; --------------------------------------------------------------- 更改會話時間 sql>alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'; --------------------------------------------------------------- sql>show parameter block 表和視圖 sql>show parameter date 查數據結構 --------------------------------------------------------------- SQLServer中 --刪除表中相同數據 sql>create table test1 as select distinct * from test; --刪除表數據 sql>truncate table test; --把test中數據輸入到test1中 sql>insert into test(select * from test1); --------------------------------------------------------------- rowid(表中存儲地址至關表id)和rownum(表序號)稱僞列(用法) sql>select name,age,sex,rowid,rownum from test1; 查出前三行 sql>select * from test where rownum<=3; 查出後三行 sql>select * from (select name n,age a,sex s,rownum r from test) where r>(select count(*) from test)-3; 刪除後三行 SQL> delete from test where name not in(select name from test where rownum<=(select count(*) from test)-3); 刪除相同行 sql>delete from test where rowid not in(select max(rowid) from test group by name,age,sex); 刪除全部表 sql>select 'drop table' ||tname|| ':' from tab; sql>spool c:test.sql; sql>select 'drop table' ||tname|| ':' from tab; sql>spool off sql>@c:test.sql; --------------------------------------------------------------- alter table修改表 truncate table節段表(只刪除數據) drop table刪除表 =============================================================== 查看錶結構 desc 表名; =============================================================== 查出成績的前三名 sql>select * from (select * from stu order by score desc) where rownum<=3; =============================================================== 更改字符集 SQL>startup mount SQL>alter system enable restricted session; SQL>alter system set job_queue_processes=0; SQL>alter database open; SQL>alter database character set ZHS16GBK; SQL>shutdown SQL>startup =============================================================== 將一張表或幾張表中的域從新組合後插入新表。 假定原先的兩張表爲emp,work,現選擇部分數據域合併爲emp_work 創建emp_work SQL>insert into emp_new select a.no, sysdate, a.name, b.service_duration from emp a, work b where a.no=b.no; SQL>commit; 這樣的方式仍然要使用回滾段,爲加快數據遷移速度,可將insert替換成insert (大小寫不論),指示oracle以直通方式直接寫數據文件,繞過回滾空間。 SQL>insert into emp_new select a.no, sysdate, a.name, b.service_duration from emp a, work b where a.no=b.no; SQL>commit; =============================================================== DDL數據定義語言(create,alter,drop) DML數據操縱語言(insert,select,delete,update) TCL事務控制語言(commit,savepoint,rollback) DCL數據控制語言(GRANT REVOKE) =============================================================== 一個表中的某一列輸到另外一個表中 insert into stu1(name)(select name from stu); =============================================================== 事務 rollback; insert into stu1(name)(select name from stu); commit;提交 =============================================================== COMMIT - 提交併結束事務處理 ROLLBACK - 撤銷事務中已完成的工做 SAVEPOINT – 標記事務中能夠回滾的點 SQL> update order_master set del_date ='30-8月-05' WHERE orderno <= 'o002'; SQL> savepoint mark1; SQL> delete FROM order_master WHERE orderno = 'o002'; SQL> savepoint mark2; SQL> rollback TO SAVEPOINT mark1; SQL> COMMIT; =============================================================== 換名 set sqlprompt "scott>"; =============================================================== GRANT 授予權限 SQL> GRANT SELECT ON vendor_master TO accounts WITH GRANT OPTION; REVOKE 撤銷已授予的權限 SQL> REVOKE SELECT, UPDATE ON order_master FROM MARTIN; =============================================================== 比較操做符 SQL> SELECT vencode,venname,tel_no FROM vendor_master WHERE venname LIKE 'j___s'; SQL> SELECT orderno FROM order_master WHERE del_date IN (‘06-1月-05’,‘05-2月-05'); SQL> SELECT itemdesc, re_level FROM itemfile WHERE qty_hand < max_level/2; =============================================================== 邏輯操做符 SQL> SELECT * FROM order_master WHERE odate > ‘10-5月-05' AND del_date < ‘26-5月-05’; =============================================================== 集合操做符將兩個查詢的結果組合成一個結果 SQL> SELECT orderno FROM order_master MINUS SELECT orderno FROM order_detail; ----------------------------------------------------------------- select * from scott.stu union (all)重複的去掉[intersect把相同的取出來][minus顯示不相同的數] select * from stu ----------------------------------------------------------------- 顯示相同的數據 select name from stu intersect select name from stu1; =============================================================== 鏈接操做符 鏈接操做符用於將多個字符串或數據值合併成一個字符串 SQL> SELECT (venname|| ' 的地址是 ' ||venadd1||' '||venadd2 ||' '||venadd3) address FROM vendor_master WHERE vencode='V001'; =============================================================== 操做符的優先級 SQL 操做符的優先級從高到低的順序是: 算術操做符 --------最高優先級 鏈接操做符 比較操做符 NOT 邏輯操做符 AND 邏輯操做符 OR 邏輯操做符 --------最低優先級 =============================================================== 用來轉換空值的函數 NVL NVL2 NULLIF SELECT itemdesc, NVL(re_level,0) FROM itemfile; SELECT itemdesc, NVL2(re_level,re_level,max_level) FROM itemfile; SELECT itemdesc, NULLIF(re_level,max_level) FROM itemfile; =============================================================== GROUP BY和HAVING子句 GROUP BY子句 用於將信息劃分爲更小的組 每一組行返回針對該組的單個結果 HAVING子句 用於指定 GROUP BY 子句檢索行的條件 SELECT p_category, MAX(itemrate) FROM itemfile GROUP BY p_category; SELECT p_category, MAX(itemrate) FROM itemfile GROUP BY p_category HAVING p_category NOT IN ('accessories'); =============================================================== ROW_NUMBER (row_number)返回連續的排位,不論值是否相等 RANK(rank) 具備相等值的行排位相同,序數隨後跳躍 DENSE_RANK(dense_rank) 具備相等值的行排位相同,序號是連續的 SELECT d.dname, e.ename, e.sal, DENSE_RANK() OVER (PARTITION BY e.deptno ORDER BY e.sal DESC) AS DENRANK FROM emp e, dept d WHERE e.deptno = d.deptno; =============================================================== 日期函數 ADD_MONTHS(當前只加月) alter session set nls_date_format='yyyymmdd hh24miss'; select add_months(sysdate,2) from dual; ---------------------------------------------------------------- MONTHS_BETWEEN(前面時間減後面時間=得之間月差) select months_between(sysdate,to_date('2007-6-10','yyyy-mm-dd')) from dual; ---------------------------------------------------------------- LAST_DAY(求得當前月的最後一天) select last_day(sysdate) from dual; ---------------------------------------------------------------- ROUND(round年-月-日-->四捨五入) select round(2.3) from dual; select round(to_date('2007-6-10','yyyy-mm-dd'),'year') from dual; select round(to_date('2007-6-10','yyyy-mm-dd'),'month') from dual; select round(to_date('2007-6-10','yyyy-mm-dd'),'day') from dual; ---------------------------------------------------------------- NEXT_DAY(下一星期的星期二) select next_day(to_date('2007-6-10','yyyy-mm-dd'),'星期二') from dual; ---------------------------------------------------------------- TRUNC(trunc) ---------------------------------------------------------------- EXTRACT(extract) select extract(year from date '1998-03-07') from dual; select extract(month from to_date ('1998-03-07','yyyy-mm-dd')) from dual; ---------------------------------------------------------------- 2008年2月有多少天 inbo---->select extract(day from last_day(to_date ('2008-02-07','yyyy-mm-dd'))) from dual; ---------------------------------------------------------------- 2003-4-3與1956-3-1之間有多少天 inbo---->select round(months_between(to_date('2003-4-3','yyyy-mm-dd'),to_date('1956-3-1','yyyy-mm-dd'))/12) from dual; =============================================================== 把兩邊的9去掉 select trim('9' from '9999ddddddd99999') from dual; 去空格 select trim(' ' from ' 9999ddddddd99999') from dual; =============================================================== 函數 輸入 輸出 Initcap(char) Select initcap(‘hello’) from dual; Hello Lower(char) Select lower(‘FUN’) from dual; fun Upper(char) Select upper(‘sun’) from dual; SUN Ltrim(char,set) Select ltrim( ‘xyzadams’,’xyz’) from dual; adams Rtrim(char,set) Select rtrim(‘xyzadams’,’ams’) from dual; xyzad Translate(char, from, to) Select translate(‘jack’,’j’ ,’b’) from dual; back Replace(char,searchstring,[rep string]) Select replace(‘jack and jue’ ,’j’,’bl’) from dual; black and blue Instr (char, m, n) Select instr (‘worldwide’,’d’) from dual; 5 Substr (char, m, n) Select substr(‘abcdefg’,3,2) from dual; cd Concat (expr1, expr2) Select concat (‘Hello’,’ world’) from dual; Hello world =============================================================== 數字函數接受數字輸入並返回數值結果 函數 輸入 輸出 Abs(n) Select abs(-15) from dual; 15 Ceil(n) Select ceil(44.778) from dual; 45 Cos(n) Select cos(180) from dual; -.5984601 Cosh(n) Select cosh(0) from dual; 1 Floor(n) Select floor(100.2) from dual; 100 Power(m,n) Select power(4,2) from dual; 16 Mod(m,n) Select mod(10,3) from dual; 1 Round(m,n) Select round(100.256,2) from dual; 100.26 Trunc(m,n) Select trunc(100.256,2) from dual; 100.25 Sqrt(n) Select sqrt(4) from dual; 2 Sign(n) Select sign(-30) from dual; -1 =============================================================== 字符函數 查看有多少個字符 SQL> SELECT LENGTH('frances') FROM dual; ----------------------------------------------------------------- SQL> SELECT vencode, DECODE(venname,'frances','Francis') name FROM vendor_master WHERE vencode='v001'; ----------------------------------------------------------------- 查找人是否存在 加字段decode主明是否有人 select name,decode(name,'rbb','有人') from stu; =================================================================== 排續 select dense_rank() over(partition by sex order by score) from test; select row_number() over(order by score),name,sex,score from test; select rank() over(order by score) from test; select dense_rank() over(order by score) from test; ========================================================================== 建立同義詞 SQL> create public synonym test for rbb.test; SQL> create synonym test for mytest; 同一類的才能夠替換,同義詞替換同義詞 替換 SQL> create or replace synonym emp_sysn for scott.emp; ********************************************************************************************** 建立序列 SQL>create sequence xule increment by 1 start with 1 maxvalue 999; increment by 增加值 start with 起始值 maxvalue 最大值 minvalue 最小值 nocycle 不循環 chare 10緩存 xule.nextval ===========下一個序列的值 xule.currval ===========能夠查詢序列當前的值 更改序列 start with 不能改 alter sequence xule maxvalue 100 [sycle nocycle]; ********************************************************************************************** 序列用法 SQL>create table xl(name varchar2(4)); SQL>insert into test values(xule.nextval); SQL>select xl.currval from dual; ********************************************************************************************** 刪除序列 drop sequence x; desc user_sequences ********************************************************************************************** 建立視圖 視圖中可使用函數和表達式 create or replace view ********************************************************************************************** 建立視圖 SQL> create or replace view 視圖名 as select * from rbb union all select * from rbbb union all select * from test; SQL> create or replace view 視圖名 as 2 select empno as 編號,ename as 姓名 from scott.emp 3 where deptno=10; ========================================================================== 若是在當前用戶下沒有這個視圖就建立此視圖 若是有此視圖就覆蓋此視圖 create or replace view view_name as select empno,ename from emp where deptno=10; ********************************************************************************************** 在建立視圖前要爲當前用戶受權 grant resource to scott; create or replace view v_sal as select ename,sal from emp order by sal desc; ********************************************************************************************** 使用視圖 select * from v_sal; ********************************************************************************************** 刪除一個視圖 drop view view_name; ********************************************************************************************** 從新編譯已有的視圖 alter view view_name compile; ********************************************************************************************** 數據字典 ===========desc user_views ********************************************************************************************** 經常使用的轉換函數有 TO_CHAR SELECT TO_CHAR(sysdate,'YYYY"年"fmMM"月"fmDD"日" HH24:MI:SS') FROM dual; TO_DATE SELECT TO_DATE('2005-12-06', 'yyyy-mm-dd') FROM dual; TO_NUMBER SELECT TO_NUMBER('100') FROM dual; ********************************************************************************************** 集合操做符 union all 鏈接兩個表或者多個表爲一個視圖 MINUS 操做符返回從第一個查詢結果中排除第二個查 詢中出現的行。 INTERSECT 操做符只返回兩個查詢的公共行。 ********************************************************************************************** 鎖定的優勢 1.一致性 - 一次只容許一個用戶修改數據 2.完整性 - 爲全部用戶提供正確的數據。若是一個用戶進行了修改並保存,所作的修改將反映給全部用戶 3.並行性 -容許多個用戶訪問同一數據 行級鎖和表級鎖 行級鎖:是一種排他鎖,防止其餘事務修改此行. 解鎖:提交事務(commit),(rollback) --------------------------------------------------------------- 更新表數據:update test set score=80 where name='xiaoli'; -------------------------------------------------------------- 自動提交 set autocommit on set sutocommit off ------------------------------------------------------------ 鎖定某行更新語句 select * from scott.test where name='xiaoli' for update; SELECT * FROM order_master WHERE vencode='V002' FOR UPDATE OF odate,del_date; select * from scott.test where name='xiaoli' for update of score; select * from scott.test atest,test b where a.name=b.name and b.name='bbb' for update of b.score; -------------------------------------------------------------------- 等待update select * from scott.test where name='xiaoli' for update wait 2; select * from scott.test where name='xiaoli' for update nowait; ------------------------------------------------------------------- 表級鎖:鎖定整個表 表級鎖語法:lock table 表名 in mode mode; ------------------------------------------------------------------------- 行共享row share--行排他row exclusive--共享share-共享行排他share row exclusive-----排他exclusive --------------------------------------------------------------------------------- 行共享(row share):lock table scott.test in (row share) mode; [其餘用戶.行共享---其餘用戶.行排他---其餘用戶.共享----其餘用戶.共享行排他----其餘用戶.不能夠(排他)] -------------------------------------------------------------------------------- 行排他(row exclusive):lock table scott.test in (row exclusive) mode; [其餘用戶.行共享----其餘用戶.行排他----其餘用戶.不能夠(共享)---其餘用戶.不能夠(共享行排他)--其餘用戶.不能夠(排他)] --------------------------------------------------------------------------------- 共享(share):lock table scott.test in (share) mode; [其餘用戶.行共享---其餘用戶.不能夠(行排他)---其餘用戶.共享----其餘用戶.不能夠(共享行排他)---其餘用戶.不能夠(排他)] ----------------------------------------------------------------------------------- 共享行排他(share row exclusive):lock table scott.test in (share row exclusive) mode; [其餘用戶.行共享,其餘用戶.不能夠(行排他),其餘用戶.不能夠(共享),其餘用戶.不能夠(共享行排他),其餘用戶.不能夠(排他)] -------------------------------------------------------------------------------------- 排他(exclusive):lock table scott.test in (exclusive) mode; [其餘用戶.不能夠(行共享),其餘用戶.不能夠(行排他),其餘用戶.不能夠(共享),其餘用戶.不能夠(共享行排他,)其餘用戶.不能夠(排他)] ---------------------------------------------------------------------------------- 死鎖 當兩個事務相互等待對方釋放資源時,就會造成死鎖 Oracle會自動檢測死鎖,並經過結束其中的一個事務來解決死鎖 ---------------------------------------------------------------------------------- 表分區 ---範圍分區 create table test(name varchar2(20),sex char(2),score number(3)) partition by range(score) ( partition p1 values less than (50) tablespace users, partition p2 values less than (80), partitiom p3 values less than (maxvalue) ) select * from test partition(p1) union select * from test partitiom(p3); --- 刪除分區 alter table test drop partition p3; 添加分區 alter table test add partition p3 values less than (maxvalue); 拆分分區 alter table test split partition p2 at(60) into (partition p21,partition p22); 合併分區 alter table test merge partitions p21,p22 into partition p2; 截斷分區(刪除數據) alter table test truncate partition p3; 現有表分區 create table str as select * from student; drop table student; create table student( studentid integer not null, studentname varchar2(20), score integer ) partition by range(score)( partition p1 values less than(60), partition p2 values less than(75), partition p3 values less than(85), partition p4 values less than(maxvalue) ) insert into student(select * from stu); select * from test scott.emp@tsinghua ********************************************************************************************** 表分區 Oracle容許用戶對錶進一步的規化,即對錶進一步拆分,將表分紅若干個邏輯部分,每一個部分稱其爲表分區 優勢:加強可用性,單個分區出現故障,不影響其餘分區 均衡的I/O,不一樣的分區能夠映射到不一樣的磁盤 改善性能 ********************************************************************************************** ①範圍分區法 create table st( studentid integer not null, studentname varchar2(20), score integer ) partition by range(score)( partition p1 values less than(60), partition p2 values less than(75), partition p3 values less than(85), partition p4 values less than(maxvalue) ) ========================select * from stu partition(p1)============ ②散列分區 create table st(deptno int,deptname varchar(14)) partition by hash(deptno)( partition p1,partition p2 ) 組合分區 alter table test coalesce partition; ********************************************************************************************** ③複合分區 範圍分區和列表分區 create table salgrade( grade number(2),losal number(2),hisal number(2) ) partition by range(grade) subpartition by list(losal) ( partition p1 values less than(10) ( subpartition p1a values('湖北'), subpartition p1b values(default) ), partition p2 values less than(20) ( subpartition p1a values('河南'), subpartition p1b values(default) ), partition p3 values less than(30) ( subpartition p1a values('上海'), subpartition p1b values(default) ) ) 範圍分區和散列分區 create table salgrade( grade number(2),losal number(2),hisal number(2) ) partition by range(grade) subpartition by hash(losal) [subpartitions 5] ( partition p1 values less than(10)(subpartition p1a,subpartition p1b), partition p2 values less than(20)(subpartition p2a,subpartition p2b), partition p3 values less than(30)(subpartition p3a,subpartition p3b) ) -------------------------------------------- create table salg( grade number(2),losal number(2),hisal number(2) ) partition by range(grade) subpartition by hash(losal) subpartitions 3 ( partition p1 values less than(10), partition p2 values less than(20), partition p3 values less than(30) ) ********************************************************************************************** ④列表分區 create table test stu(id int,name varchar(20),add varchar(8)) partition by list(add) ( partition p1 values('中國'), partition p2 values('英國'), partition p3 values(default) ) ********************************************************************************************** 移動分區 alter table test move partition p5 tablespace users; ******************************************************************************************** 修改存檔 SQL> shutdown immediate 數據庫已經關閉。 已經卸載數據庫。 ORACLE 例程已經關閉。 SQL> startup mount ORACLE 例程已經啓動。 Total System Global Area 135338868 bytes Fixed Size 453492 bytes Variable Size 109051904 bytes Database Buffers 25165824 bytes Redo Buffers 667648 bytes 數據庫裝載完畢。 SQL> alter database archivelog; 數據庫已更改。 alter database open; SQL> archive log list; 數據庫日誌模式 存檔模式 自動存檔 禁用 存檔終點 d:oracleora92RDBMS 最先的概要日誌序列 1 下一個存檔日誌序列 2 當前日誌序列 2 SQL> alter system set log_archive_dest=true scope=spfile; 系統已更改。 SQL> alter database open; 數據庫已更改。 SQL> spool off ******************************************************************************************** PL/SSQL(過程化語言) 聲明部分 執行語句部分 異常處理部分 identifier constant datatype not null [:=|default expr]; declare my number(5); begin select quantity into my from products where product='wawa' for update of quantity; if my>0 then update products set quantity=quantity+1 where product='wawa'; insert into purchase_record values('wawawa',sysdate); end if; commit; Exception where others then dbms_output.put_line('chucuo'||SQLERRM); END; declare icode varchar2(6) p_catg varchar2(20); c_catg constant datatype:=0.10 數字類型 number decrmdl int/integer real(實數) binary_integer(帶符號的整數) pls_integer(同上) 字符類型 character char 3276 Raw(2000) long/long Raw(32760) Rowid/rowid() varchar2 (string(nchar/nvarchar)/varchar) 日期時間 date timeStamp(固定日期dd-mm-yy 秒6位) 子 timestamp with time zone ti timestamp(9) 布爾 boolean true false null 打印出時間 declare test_tz timestamp with time zone; begin test_tz:=to_timestamp_tz('2006-6-22 09:07:11','yyyy-mm-dd hh24:mi:ss'); dbms_output.put_line(test_tz); end; lob類型 BFILE BLOB CLOB NCLOB 屬性類型 %type %rowtype =============================================================== bfile類型實例 建立目錄 create directory tnpdir as 'c:'; 刪除目錄 drop directory tnpdir 受權 crant read on directory tnpdir to scott; 建表 create table bfiletest(id number(3), fname bfile); 添加數據 insert into bfiletest values(1,bfilename('TMPDIR','tmptest.java')); =============================================================== 向數據庫中添加圖片 create directory images as 'c:images'; crant read on directory images to scott; create table my_diagrams( chapter_descr varchar2(40); diagram_no integer, diagram blob ); declare l_bfile bfile; l_blob blob; begin insert into my_diagrams(diagram) values(emptv_blob()) return diagram into l_blob; l_bfile:=bfilename('images','nvimage.jpg'); dbms_lob.open(l_bfile,dbms_lob.file_readonly); dbms_lob.loadfromfile(l_blob,l_bfile,dbms_lob,getlength(l_bfile)); dbms_lob.close(l_bfile); commit; end; =============================================================== %type實例 查詢 declare dtr dept.dname%type; begin select dname into str from dept where deptno=30; dbms_output.put_line(str); end; set serverout on =============================================================== %rowtype實例 declare row dept%rowtype; begin select * into row from dept where deptno=30; dbms_output.put.line(row.dname||' '||row.deptno||' '||row.loc); //異常 exception when no_data_found then dbms_output.put_lin('沒有數據'); when too_many_rows(others) then dbms_output.put_lin('太多拉'); end; =============================================================== 格式 if 條件 then elsif 條件 then else end if =============================================================== 格式 begin case'&grade' when 'a' then dbms_output.put_line('優異'); when 'b' then dbms_output.put_line('良好'); else dbms_output.put_line('其它') end case; end; =============================================================== 外界變量 var vnm varchar2(20); begin :v:='aaaaa'; end; 打印 print v =============================================================== loop實例 begin loop exit when 3>4; end loop; end; =============================================================== while實例 begin while (條件)condition loop 語句體; end loop; end; =============================================================== 循環實例 正 begin for c in 1..10 loop dbms_output.put_line(c); end loop end; 倒 begin for c in reverse(倒) 1..10 loop dbms_output.put_line(c); end loop end; =============================================================== declare num number(3):=1; begin while num<10 loop dbms_output.put_line(num); num:=num+1; end loop; end; declare num number(3):=1; begin loop dbms_output.put_line(num); exit when num>10;//退出 num:=num+1; end loop; end; =============================================================== goto實例 DECLARE qtyhand itemfile.qty_hand%type; relevel itemfile.re_level%type; BEGIN SELECT qty_hand,re_level INTO qtyhand,relevel FROM itemfile WHERE itemcode = 'i201'; IF qtyhand < relevel THEN GOTO updation; ELSE GOTO quit; END IF; <<updation>> UPDATE itemfile SET qty_hand = qty_hand + re_level WHERE itemcode = 'i201'; <<quit>> NULL; END; =============================================================== 動態SQL 查詢 declare cl varchar2(20); va varchar2(20); tb varchar2(20); nm number(13); begin tb:='&table'; cl:='&aadd'; nm:=# EXECUTE IMMEDIATE 'select '||cl||' from '||tb||' where '||cl||'=:1' into va using nm; dbms_output.put_line(va); end; =============================================================== 動態SQL declare sql_stmt varchar2(200); emp_id number(4):=7566; emp_rec emp% rowtype; begin Execute immedlate 'create table bonus1(id number,amt number)'; sql_stmt:='select * from emp where empno=:id'; Execute immedlate sql_stmt into emp_rec using emp_id; end; =============================================================== declare aaa varchar2(20); num number(10); bbb varchar2(20); begin aaa='&aaa'; num=&kkk; execute immedlate 'select '||aaa||' from test where age=:a'into bbb using num;(標準SQL語句) dbms_output.put_line(bbb); end; into 變量(給值) :a(外界參數) using bb(邦定常量) =============================================================== 本身定義異常 declare invar exception; cate varchar2(10); begin cate:='&cate'; if cate not in('aa','ff','dd') then raise invar; else dbms_output.put_line('你輸入的類別是:'||cate); end if; exception when invar then dbms_output.put_line('沒法認識這個類別!'); raise_application_error(-20200,'本身寫'); end; 讓數據庫真正出錯 raise_application_error(-20200,'本身寫'); 例子2 declare rate itemfile.itemrate%type; ratee exception; begin select nvl(itemrate,0) into rate from itemfile where itemcode='i207'; if rate=0 then raise ratee; else dbms_output.put_line('項費率是:'||rate); end if; exception when ratee then RAISE_APPLICATION_ERROR(-20001, '未指定項費率'); end; =============================================================== create procedure存儲過程 =============================================================== 建立標準索引 SQL> CREATE INDEX item_index ON itemfile (itemcode) TABLESPACE index_tbs; 重建索引 SQL> ALTER INDEX item_index REBUILD; 刪除索引 SQL> DROP INDEX item_index; 惟一索引確保在定義索引的列中沒有重複值 Oracle 自動在表的主鍵列上建立惟一索引 使用CREATE UNIQUE INDEX語句建立惟一索引 SQL> CREATE UNIQUE INDEX item_index ON itemfile (itemcode); 組合索引是在表的多個列上建立的索引 索引中列的順序是任意的 若是 SQL 語句的 WHERE 子句中引用了組合索引的全部列或大多數列, 則能夠提升檢索速度 SQL> CREATE INDEX comp_index ON itemfile(p_category, itemrate); 反向鍵索引反轉索引列鍵值的每一個字節 一般創建在值是連續增加的列上,使數據均勻地分佈在整個索引上 建立索引時使用REVERSE關鍵字 SQL> CREATE INDEX rev_index ON itemfile (itemcode) REVERSE; SQL> ALTER INDEX rev_index REBUID NOREVERSE; 位圖索引適合建立在低基數列上 位圖索引不直接存儲ROWID,而是存儲字節位到ROWID的映射 減小響應時間 節省空間佔用 SQL> CREATE BITMAP INDEX bit_index ON order_master (orderno); 基於一個或多個列上的函數或表達式建立的索引 表達式中不能出現聚合函數 不能在LOB類型的列上建立 建立時必須具備 QUERY REWRITE 權限 SQL> CREATE INDEX lowercase_idx ON toys (LOWER(toyname)); SQL> SELECT toyid FROM toys WHERE LOWER(toyname)='doll'; 與索引有關的數據字典視圖有: USER_INDEXES - 用戶建立的索引的信息 USER_IND_PARTITIONS - 用戶建立的分區索引的信息 USER_IND_COLUMNS - 與索引相關的表列的信息 SQL> SELECT INDEX_NAME, TABLE_NAME, COLUMN_NAME FROM USER_IND_COLUMNS ORDER BY INDEX_NAME, COLUMN_POSITION; 能夠將索引存儲在不一樣的分區中 與分區有關的索引有三種類型: 局部分區索引 - 在分區. 表上建立的索引,在每一個表分區上建立獨立的索引,索引的分區範圍與表一致 全局分區索引 - 在分區表或非分區表上建立的索引,索引單獨指定分區的範圍,與表的分區範圍或是否分區無關 全局非分區索引 - 在分區表上建立的全局普通索引,索引沒有被分區 SQL> CREATE TABLE ind_org_tab ( vencode NUMBER(4) PRIMARY KEY, venname VARCHAR2(20) ) ORGANIZATION INDEX; 與索引有關的數據字典視圖有: USER_INDEXES - 用戶建立的索引的信息 USER_IND_PARTITIONS - 用戶建立的分區索引的信息 USER_IND_COLUMNS - 與索引相關的表列的信息 SQL> SELECT INDEX_NAME, TABLE_NAME, COLUMN_NAME FROM USER_IND_COLUMNS ORDER BY INDEX_NAME, COLUMN_POSITION; ----遊標簡介 逐行處理查詢結果,經編程的方式訪問數據 ---遊標類型: 隱式遊標:在 PL/SQL 程序中執行DML SQL 語句時自動建立隱式遊標。 顯式遊標:顯式遊標用於處理返回多行的查詢。 REF 遊標:REF 遊標用於處理運行時才能肯定的動態 SQL 查詢的結果 ------隱式遊標的屬性有: %FOUND – SQL 語句影響了一行或多行時爲 TRUE %NOTFOUND – SQL 語句沒有影響任何行時爲TRUE %ROWCOUNT – SQL 語句影響的行數 %ISOPEN - 遊標是否打開,始終爲FALSE 刪除遊標 delete from table_name where cursor of cursor_name; =============================================================== ------隱式遊標示例 ------too_many_rows的用法! 1 declare 2 empid varchar2(20); 3 begin 4 select name into empid from test; 5 exception 6 when too_many_rows then 7 dbms_output.put_line('該查詢多於兩行!'); 8* end; SQL> / 該查詢多於兩行! PL/SQL 過程已成功完成。 =============================================================== ------no_data_found的用法! SQL> set serverout on SQL> ed 已寫入文件 afiedt.buf 1 declare 2 empid varchar2(20); 3 desig varchar2(20); 4 begin 5 empid:='&emp'; 6 select name into desig from test where name=empid; 7 dbms_output.put_line('你查詢的名字是:'||desig); 8 exception 9 when no_data_found then 10 dbms_output.put_line('沒有時間!'); 11* end; SQL> / 輸入 emp 的值: xiaoli 原值 5: empid:='&emp'; 新值 5: empid:='xiaoli'; 你查詢的名字是:xiaoli PL/SQL 過程已成功完成。 SQL> / 輸入 emp 的值: ss 原值 5: empid:='&emp'; 新值 5: empid:='ss'; 沒有時間! PL/SQL 過程已成功完成。 =============================================================== SQL> set serveroutput on SQL> begin 2 update test set name='renbinbo' where name='binbo'; 3 if sql%found then 4 dbms_output.put_line('表已經更新!'); 5 end if; 6 end; 7 / test_t表中name也已經更新! 表已經更新! =============================================================== SQL> declare aa varchar2(20); bb varchar2(20); begin bb:='&bb'; select score into aa from test where name=bb; if sql%found then dbms_output.put_line(bb||'的分數爲:'||aa); end if; end; SQL> / 輸入 bb 的值: renbinbo 原值 5: bb:='&bb'; 新值 5: bb:='renbinbo'; renbinbo的分數爲:100 PL/SQL 過程已成功完成。 =============================================================== SQL> ed 已寫入文件 afiedt.buf 1 declare 2 my_toy rbb.test.name%type; 3 cursor toy_cur is 4 select name from test where name='xiaoli'; 5 begin 6 open toy_cur; 7 loop 8 fetch toy_cur into my_toy; 9 exit when toy_cur%notfound; 10 dbms_output.put_line('你查詢人的姓名:'||my_toy); 11 end loop; 12 close toy_cur; 13* end; SQL> / 你查詢人的姓名:xiaoli PL/SQL 過程已成功完成。 SQL> ed 昨天我說如今的想法那些確實的真的 也是事實 那是 已寫入文件 afiedt.buf 1 declare 2 name_n rbb.test.name%type; 3 sex_s rbb.test.name%type; 4 sex_t rbb.test.name%type; 5 cursor test_t is 6 select name,sex,score from test; 7 begin 8 open test_t; 9 dbms_output.put_line('你所查資料列表:'); 10 loop 11 fetch test_t into name_n,sex_s,sex_t; 12 exit when test_t%notfound; 13 dbms_output.put_line(name_n||' '||sex_s||' '||sex_t); 14 end loop; 15 close test_t; 16* end; 17 / 你所查資料列表: xiaoli 女 90 renbinbo 男 100 xiaoming 男 89 xiaowang 男 91 xiaohua 女 98 yunfeng 男 88 wangming 男 78 wuming 男 98 xiaobin 男 68 binbin 男 44 tianhua 女 55 liyun 女 65 PL/SQL 過程已成功完成。 =============================================================== bibno-->ed 已寫入文件 afiedt.buf 1 declare 2 cursor test_cur is 3 select name,sex,score from test; 4 begin 5 dbms_output.put_line('用戶資料列表:'); 6 for namet in test_cur 7 loop 8 dbms_output.put_line(namet.name||' '||namet.sex||' '||namet.score); 9 end loop; 10* end; 11 / 用戶資料列表: xiaoli 女 90 renbinbo 男 100 xiaoming 男 89 xiaowang 男 91 xiaohua 女 98 yunfeng 男 88 wangming 男 78 wuming 男 98 xiaobin 男 68 binbin 男 44 tianhua 女 55 liyun 女 65 PL/SQL 過程已成功完成。 =============================================================== 帶參數的顯式遊標 SET SERVEROUTPUT ON SQL> DECLARE desig VARCHAR2(20); emp_code VARCHAR2(5); empnm VARCHAR2(20); CURSOR emp_cur(desigparam VARCHAR2) IS SELECT empno, ename FROM employee WHERE designation=desig; BEGIN desig:= '&desig'; OPEN emp_cur(desig); LOOP FETCH emp_cur INTO emp_code,empnm; EXIT WHEN emp_cur%NOTFOUND; DBMS_OUTPUT.PUT_LINE(emp_code||' '||empnm); END LOOP; CLOSE emp_cur; END; =============================================================== SET SERVEROUTPUT ON SQL> DECLARE new_price NUMBER; CURSOR cur_toy IS SELECT toyprice FROM toys WHERE toyprice<100 FOR UPDATE OF toyprice; BEGIN OPEN cur_toy; LOOP FETCH cur_toy INTO new_price; EXIT WHEN cur_toy%NOTFOUND; UPDATE toys SET toyprice = 1.1*new_price WHERE CURRENT OF cur_toy; END LOOP; CLOSE cur_toy; COMMIT; END; =============================================================== 遊標變量的功能強大,能夠簡化數據處理 遊標變量的優勢有: 1.可從不一樣的 SELECT 語句中提取結果集 2.能夠做爲過程的參數進行傳遞 3.能夠引用遊標的全部屬性 4.能夠進行賦值運算 使用遊標變量的限制: 1.不能在程序包中聲明遊標變量 2.FOR UPDATE子句不能與遊標變量一塊兒使用 3.不能使用比較運算符 =============================================================== =============================================================== 建立過程 create procedure test_b(test varchar2,test1 number) as begin dbms_output.put_line(test); dbms_output.put_line(test1); end; create procedure test_c(test varchar2,test1 char) as aa varchar2(20); bb char(10); begin select name into aa from test where name=test; dbms_output.put_line(aa); select age into bb from test where age=test1; dbms_output.put_line(bb); end; =============================================================== 建立函數 create or replace function test_binbo return varchar2 as begin return '我愛你!'; end 執行: select test_binbo from dual; create or replace function test_binbo return varchar2 as aa varchar2(20); bb char(3); begin bb:='&bb'; select name into aa from test where sex=bb; return 'name'; end; 執行: select test_binbo from dual; create or replace function item_price_range(price number) return varchar2 as min_price number; max_price number; begin select max(itemrate),min(temrate) into max_price,min_price from test; if price>=min_price and price<=max_price then return '將計就計機'; else return '哩哩啦啦理論'; end if; end; 執行: select test_binbo from dual; =============================================================== 自主事務處理 CREATE OR REPLACE PROCEDURE p1 AS b VARCHAR2(50); BEGIN UPDATE vendor_master SET venadd1='10 Walls Street' WHERE vencode='V002'; P2(); SELECT venadd1 INTO b FROM vendor_master WHERE vencode='V002'; DBMS_OUTPUT.PUT_LINE(b); END; / 執行 EXECUTE p1; CREATE OR REPLACE PROCEDURE p2 AS a VARCHAR2(50); PRAGMA AUTONOMOUS_TRANSACTION; BEGIN SELECT venadd1 INTO a FROM vendor_master WHERE vencode='V002'; DBMS_OUTPUT.PUT_LINE(a); ROLLBACK; END; / =============================================================== 建立程序包 SQL> ed 已寫入文件 afiedt.buf 1 create or replace package package_me as 2 procedure proc_test(test varchar2); 3 function fun_test(funt varchar2) return varchar2; 4* end; 5 / 程序包已建立。 已寫入文件 afiedt.buf 1 create or replace package body package_me as 2 procedure proc_test(test varchar2) as 3 nam varchar2(20); 4 begin 5 select name into nam from test where name=test; 6 dbms_output.put_line('你所查的人的姓名是:'||nam); 7 end; 8 function fun_test(funt varchar2) return varchar2 as 9 funn varchar2(20); 10 begin 11 select next_day(funt,'星期六')-7 into funn from dual; 12 return funn; 13 end; 14* end package_me; SQL> / 程序包主體已建立。 SQL> select package_me.fun_test('2008-10-16') from dual; PACKAGE_ME.FUN_TEST('2008-10-16') --------------------------------------------------------- 2008-10-11 SQL> exec package_me.proc_test('xiaoli'); 你所查的人的姓名是:xiaoli PL/SQL 過程已成功完成。 =============================================================== create or replace package pack_me as procedure order_pr(orn varchar2); function order_fu(onr varchar2) return varchar2; end pack_me; / CREATE OR REPLACE PACKAGE BODY pack_me AS PROCEDURE order_proc (orno VARCHAR2) IS stat CHAR(1); BEGIN SELECT ostatus INTO stat FROM order_master WHERE orderno = orno; IF stat = 'p' THEN DBMS_OUTPUT.PUT_LINE('暫掛的訂單'); ELSE DBMS_OUTPUT.PUT_LINE('已完成的訂單'); END IF; END order_proc; FUNCTION order_fun(ornos VARCHAR2) RETURN VARCHAR2 IS icode VARCHAR2(5); ocode VARCHAR2(5); qtyord NUMBER; qtydeld NUMBER; BEGIN SELECT qty_ord, qty_deld, itemcode, orderno INTO qtyord, qtydeld, icode, ocode FROM order_detail WHERE orderno = ornos; IF qtyord < qtydeld THEN RETURN ocode; ELSE RETURN icode; END IF; END order_fun; END pack_me; / =============================================================== 執行 EXECUTE pack_me.order_proc('o002'); DECLARE msg VARCHAR2(10); BEGIN msg := pack_me.order_fun('o002'); DBMS_OUTPUT.PUT_LINE('值是 ' || msg); END; / CREATE OR REPLACE PACKAGE BODY cur_pack AS CURSOR ord_cur(vcode VARCHAR2) RETURN order_master%ROWTYPE IS SELECT * FROM order_master WHERE VENCODE=vcode; PROCEDURE ord_pro(vcode VARCHAR2) IS or_rec order_master%ROWTYPE; BEGIN OPEN ord_cur(vcode); LOOP FETCH ord_cur INTO or_rec; EXIT WHEN ord_cur%NOTFOUND; DBMS_OUTPUT.PUT_LIne('返回的值爲' || or_rec.orderno); END LOOP; END ord_pro; END cur_pack; EXEC cur_pack.ord_pro('V001'); =============================================================== COLUMN OBJECT_NAME FORMAT A18 SELECT object_name, object_type FROM USER_OBJECTS WHERE object_type IN ('PROCEDURE', 'FUNCTION', 'PACKAGE', 'PACKAGE BODY'); DESC USER_SOURCE COLUMN LINE FORMAT 9999 COLUMN TEXT FORMAT A50 SELECT line, text FROM USER_SOURCE WHERE NAME='TEST'; DESC pack_me; =============================================================== 數據庫級觸發器 CREATE TABLE system.session_info ( username VARCHAR2(30), logontime DATE, session_id VARCHAR2(30), ip_addr VARCHAR2(30), hostname VARCHAR2(30), auth_type VARCHAR2(30) ); 顯示 set serverout on create or replace trigger trg_session_info defore logoff on database declare session_id varchar2(30); ip_addr varchar2(30); hostname varchar2(30); auth_type varchar2(30); logontime date; begin select sys_context('userenv','sessionid') -- 會話編號 -- 用戶登陸的客戶端IP地址 select sys_context('userenv','ip_address') into ip_addr from dual; -- 用戶登陸的客戶端主機名 select sys_context('usernv','host') into hostname from dual; -- 登陸認證方式,數據庫認證或外部認證 select sys_context('usernv','authentication_type') into auth_type from dual; insert into system.session_info values (user,sysdate,session_id,ip_addr,hostname,auth_type); end; SELECT * FROM system.session_info; =============================================================== 對錶employees建立觸發器 create or replace trigger tr_employee after update on employees for each row begin if(:new.salary>40000) then raise_application_error(-20002,'職員工資不能超過 40000'); end if; end; =============================================================== create or replace procedure demo(salary in number) as cursor_name integer; rows_processed interger; begin cursor_name:=dbms_sql.open_cursor; dbms_sql.parse(cursor_name,'delete from salary_records where empsal>:temp_sal',dbms_sql.native); dbms_sql.bind_variable(cursor_name,':temp_sal',salay); rows_processed:=dbms_sql.execute(cursor_name); dbms_sql.close_cursor(crusor_name); exception when others then dbms_sql.close_cursor(cursor_name); end; =============================================================== 1.寫一個帶程序包的函數,只要傳入文件名和地址就能夠把這個文件的內容存到BLOB類型的字段中。 binbo>create directory tnpdir as 'c:bfile'; binbo>grant read on directory tnpdir to scott; binbo>CREATE TABLE my_dia ( chapter_descr VARCHAR2(40), diagram_no INTEGER, diagram BLOB ); DECLARE l_bf BFILE; l_bl BLOB; BEGIN INSERT INTO my_dia (diagram) VALUES (EMPTY_BLOB()) RETURN diagram INTO l_bl; l_bf := BFILENAME('jsp', 'test.jsp'); DBMS_LOB.OPEN(l_bf, DBMS_LOB.FILE_READONLY); DBMS_LOB.LOADFROMFILE(l_bl, l_bf, DBMS_LOB.GETLENGTH(l_bf)); DBMS_LOB.CLOSE(l_bf); COMMIT; END; =============================================================== 2.有一張表,字段的值是這樣的:name varchar2(20),sex char(2),score number(3)。其中的SCORE字段爲分數字段。請用一條SQL語句把九十分以上的顯示爲A。九十到七十分的爲B。七十分如下的爲C。 binbo>create table test(name varchar2(20),sex char(2),score number(3)); binbo>select name,sex,case when score<=70 then 'C' when score<=90 and score>70 when 'B' when score>90 when 'A' end case from test; =============================================================== 3.有一個表,其中有一個字段爲自動增加的數據類型。請在ORACLE中實現。 binbo>create table test(id number,name varchar2(20)); create sequence seq_test increment by 1 start with 1 maxvalue 999; create or replace trigger tr_test before insert or update of id on test for each row begin if insert into then select seq_test.nextval into :new.id from dual; else raise_application_error(-20002,'不容許更新ID序列!'); end if; end; =============================================================== 4.如何刪除一個用戶下的全部表。 binbo>spool c:test.sql binbo>select 'drop table '||tname||';'from tab; binbo>spool off binbo>@c:test; =============================================================== 5。如何把數據庫的日誌模式從歸檔模式變爲非歸檔模式 binbo>shutdown immediate binbo>startup mount binbo>alter database archivelog; binbo>archive log list; binbo>alter system set log_archive_dest=false scope=spfile; binbo>alter database open; =============================================================== 6。創建一個用戶和表空間,在這個用戶和表空間下創建一張表。並授予SCOTT用戶查詢權利。 binbo>create user binbo identified by binbo; binbo>create tablespace test datafile 'e:test.dbf' size 10m; binbo>GRANT SELECT ON scott.test to scott; =============================================================== 7。寫一個過程,計算某個月有多少天。 create or replace procedure dept(test in varchar2) as aa varchar2(20); begin select extract(day from last_day(to_date (test,'yyyy-mm'))) into aa from dual; dbms_output.put_line(aa); end; =============================================================== 8。有一章表,字段爲name,sex,score,score字段爲分數字段,查詢出這個班的第五名到第七名的人的姓名。 binbo>create table test(name varchar2(20),sex char(3),score number(3)); binbo>select * from (select name n,score sc,rownum r from (select name,score,rownum from test order by score desc)) where r between 5 and 7; =============================================================== 9。查詢出當前這個星期的星期六是幾號。 binbo>select next_day(sysdate,'星期六') from dual; =============================================================== 10。作一個外鍵關聯的兩個表。而後用觸發器作級聯更新。 create table test(name varchar2(20),sex char(3),score number(3)); create table test_t(name varchar2(20)); create or replace trigger test_test before insert or update of name on test for each row begin if inserting then insert into test_t(name) values (:new.name); dbms_output.put_line('test_t表中name也已經插入!'); elseif updating then update test_t set name=:new.name where name=old.name; dbms_output.put_line('test_t表中name也已經更新!'); elseif deleting then delete from test_t where name=:old.name; dbms_output.put_line('test_t表中name也已經刪除!'); else raise_application_error(-20002,'不容許更新test表中的name字段'); end if; end; =============================================================== ---從外界向數據庫中插入數據 SQL> create table test_file(name varchar(30),shell varchar2(30)); 表已建立。 G:盤data.ctl:(tab鍵隔開時間用x'09') load data into table test_file fields terminated by '=='(name,shell); G:盤data.txt: aaaaaaaa==11111111 bbbbbbbb==22222222 cccccccc==33333333 binbo==hehehehe C:Documents and SettingsAdministrator>sqlldr rbb/rbb control=G:data.ctl data=G:data.txt SQL*Loader: Release 9.2.0.1.0 - Production on 星期二 7月 10 20:37:47 2007 Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved. 達到提交點,邏輯記錄計數3 達到提交點,邏輯記錄計數4 SQL> select * from test_file; NAME SHELL ------------------------------ ------------------------------ aaaaaaaa 11111111 bbbbbbbb 22222222 cccccccc 33333333 binbo hehehehe =============================================================== declare result clob; xmlstr varchar2(32767); line varchar2(2000); line_no integer:=1; begin result:=dbms_xmlquery.getxml('select * from test'); xmlstr:=dbms_lob.substr(result,32767); loop exit when xmlstr is null; line:=substr(xmlstr,1,instr(xmlstr,chr(10))-1); dbms_output.put_line(line_no||':'||line); xmlstr:=substr(xmlstr,instr(xmlstr,chr(10))+1); line_no:=line_no+1; end loop; end; SQL> / PL/SQL 過程已成功完成。 SQL> select instr('abcdefsfssdfabcabcsdfs','bc',2,2) "instring" from dual; instring ---------- 14 =============================================================== ---建立表中自動增加列(利用觸發器) //建立表 create table test_bin(id number(3),name varchar2(20)); //建立序列 create sequence test_sq increment by 1 start with 1 maxvalue 1000; //建立觸發器 行級觸發器 create or replace trigger test_test before insert or update of id on test_bin for each row begin if inserting then select test_sq.nextval into :new.id from dual; else raise_application_error(-20002,'不容許更新id'); end if; end; =============================================================== 語句級觸發器 create or replace trigger trgdemo after insert or update or delete on order_master begin if updating then dbms_output.put_line('已更新order_master中的數據'); elseif deleting then dbms_output.put_line('已刪除order_master中的數據'); elseif inserting then dbms_output.put_line('已在order_master中插入數據'); end if; end; =============================================================== instead of 觸發器(主要用在視圖中[視圖中只能有for each row]) create or replace trigger upda_ord instead of update on ord_view for each row begin update order_master set vencode=:new.vencode where orderno=:new.orderno; dbms_output.put_line('已激活觸發器'); end; =============================================================== 觸發器由三部分組成: 觸發器語句(事件) 定義激活觸發器的 DML 事件和 DDL 事件 觸發器限制 執行觸發器的條件,該條件必須爲真才能激活觸發器 觸發器操做(主體) 包含一些 SQL 語句和代碼,它們在發出了觸發器語句且觸發限制的值爲真時運行 =============================================================== 觸發器類型 DDL 觸發器 數據庫級觸發器 DML 觸發器 語句級觸發器 行級觸發器 INSTEAD OF 觸發器 =============================================================== 模式觸發器 create table dropped_obj(obj_name varchar2(30),obj_type varchar2(20),drop_date date); create or replace trigger log_drop_obj after drop on schema begin insert into dropped_obj values(ora_dict_obj_name,ora_dict_obj_type,sysdate); end; =============================================================== 啓用和禁用觸發器 alter trigger aiu_name disable; alter trigger aiu_name enable; =============================================================== 刪除觸發器 drop trigger aiu_name; =============================================================== user_triggers數據字典視圖包含有關觸發器的信息 select trigger_name from user_triggers where table_name='emp'; select trigger_type,triggering_event,when_clause from user_triggers where trigger_name='biu_emp_deptno'; =============================================================== dbms_output包顯示pl/sql塊和子程序的調試信息 set serveroutput on BEGIN DBMS_OUTPUT.PUT_LINE('打印三角形'); FOR i IN 1..9 LOOP FOR j IN 1..i LOOP DBMS_OUTPUT.PUT('*'); END LOOP for_j; DBMS_OUTPUT.NEW_LINE; END LOOP for_i; END; 打印三角形 * ** *** **** ***** ****** ******* ******** ********* PL/SQL 過程已成功完成。 =============================================================== 1.DBMS_LOB 包提供用於處理大型對象的過程和函數 2.DBMS_XMLQUERY 包用於將查詢結果轉換爲 XML 格式 DECLARE result CLOB; xmlstr VARCHAR2(32767); line VARCHAR2(2000); line_no INTEGER := 1; BEGIN result := DBMS_XMLQuery.getXml('SELECT * FROM test'); xmlstr := DBMS_LOB.SUBSTR(result,32767); LOOP EXIT WHEN xmlstr IS NULL; line := SUBSTR(xmlstr,1,INSTR(xmlstr,CHR(10))-1); DBMS_OUTPUT.PUT_LINE(line_no || ':' || line); xmlstr := SUBSTR(xmlstr,INSTR(xmlstr,CHR(10))+1); line_no := line_no + 1; END LOOP; END; =============================================================== 一些經常使用的內置程序包: DBMS_OUTPUT 包輸出 PL/SQL 程序的調試信息 DBMS_LOB 包提供操做 LOB 數據的子程序 DBMS_XMLQUERY 將查詢結果轉換爲 XML 格式 DBMS_RANDOM 提供隨機數生成器 UTL_FILE 用於讀寫操做系統文本文件 =============================================================== 觸發器 CREATE OR REPLACE TRIGGER biu_emp_deptno BEFORE INSERT OR UPDATE OF deptno ON emp FOR EACH ROW WHEN (New.deptno <> 40) BEGIN :New.comm := 0; END; / 觸發器已建立 =============================================================== ----沒有表還不能測試 CREATE VIEW ord_view AS SELECT order_master.orderno, order_master.ostatus, order_detail.qty_deld, order_detail.qty_ord FROM order_master, order_detail WHERE order_master.orderno = order_detail.orderno; CREATE OR REPLACE TRIGGER order_mast_insert INSTEAD OF INSERT ON ord_view REFERENCING NEW AS n FOR EACH ROW DECLARE CURSOR ecur IS SELECT * FROM order_master WHERE order_master.orderno = :n.orderno; CURSOR dcur IS SELECT * FROM order_detail WHERE order_detail.orderno = :n.orderno; a ecur%rowtype; b dcur%rowtype; BEGIN OPEN ecur; OPEN dcur; FETCH ecur into a; FETCH dcur into b; IF dcur%notfound THEN INSERT INTO order_master(orderno,ostatus) VALUES(:n.orderno, :n.ostatus); ELSE UPDATE order_master SET order_master.ostatus = :n.ostatus WHERE order_master.orderno = :n.orderno; END IF; IF ecur%notfound THEN INSERT INTO order_detail(qty_ord,qty_deld,orderno) VALUES(:n.qty_ord, :n.qty_deld, :n.orderno); ELSE UPDATE order_detail SET order_detail.qty_ord = :n.qty_ord, order_detail.qty_deld = :n.qty_deld WHERE order_detail.orderno = :n.orderno; END IF; CLOSE ecur; CLOSE dcur; END; / =============================================================== CREATE TABLE dropped_obj ( obj_name VARCHAR2(30), obj_type VARCHAR2(20), drop_date DATE ); CREATE OR REPLACE TRIGGER log_drop_obj AFTER DROP ON SCHEMA BEGIN INSERT INTO dropped_obj VALUES (ORA_DICT_OBJ_NAME, ORA_DICT_OBJ_TYPE, SYSDATE); END; / ALTER TRIGGER biu_emp_deptno DISABLE; ALTER TRIGGER biu_emp_deptno ENABLE; DROP TRIGGER biu_emp_deptno; DESC USER_TRIGGERS; =============================================================== DECLARE l_num NUMBER; counter NUMBER; BEGIN counter:=1; WHILE counter <= 10 LOOP l_num := ABS((DBMS_RANDOM.RANDOM MOD 100)) + 1; DBMS_OUTPUT.PUT_LINE(l_num); counter := counter + 1; END LOOP; END; / 40 4 35 52 68 5 94 38 49 51 PL/SQL 過程已成功完成。 =============================================================== =============================================================== ---查詢出表中數據轉換爲xml格式 -- 以 SYSTEM 用戶登陸執行命令 CREATE DIRECTORY TEST_DIR AS 'C:DEVELOP'; GRANT READ, WRITE ON DIRECTORY TEST_DIR TO SCOTT; -- 以 SCOTT 用戶登陸 DECLARE src CLOB; xmlfile UTL_FILE.FILE_TYPE; length INTEGER; buffer VARCHAR2(16384); BEGIN src := DBMS_XMLQuery.getXml('select * from emp'); length := DBMS_LOB.GETLENGTH(src); DBMS_LOB.READ(src, length, 1, buffer); xmlfile := UTL_FILE.FOPEN('TEST_DIR', 'employees.xml', 'w'); UTL_FILE.PUT(xmlfile, buffer); UTL_FILE.FCLOSE(xmlfile); END; / =============================================================== -------讀取xml格式的文件 UTL_FILE 包用於讀寫操做系統文本文件 操做文件的通常過程是打開、讀或寫、關閉 UTL_FILE 包指定文件路徑依賴於 DIRECTORY 對象 1.CREATE DIRECTORY TEST_DIR AS 'C:DEVELOP'; 2.GRANT READ, WRITE ON DIRECTORY TEST_DIR TO SCOTT SET SERVEROUT ON FORMAT WRAPPED DECLARE input_file UTL_FILE.FILE_TYPE; input_buffer VARCHAR2(4000); BEGIN input_file := UTL_FILE.FOPEN('TEST_DIR', 'employees.xml', 'r'); FOR I IN 1..11 LOOP UTL_FILE.GET_LINE(input_file, input_buffer); DBMS_OUTPUT.PUT_LINE(input_buffer); END LOOP; UTL_FILE.FCLOSE(input_file); EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('------------------'); END; =============================================================== oracle 數據庫重生$rman oracle 數據庫備份兩種類型:物理備份和邏輯備份 =============================================================== oracle 故障有4種類型 1.語句故障 在執行 SQL 語句過程當中發生的邏輯故障可致使語句故障。若是用戶編寫的 SQL 語句無效,就會發生邏輯故障 2.用戶進程故障 當用戶程序出錯而沒法訪問數據庫時發生用戶進程故障。致使用戶進程故障的緣由是異常斷開鏈接或異常終止進程 3. 實例故障 當 Oracle 的數據庫實例因爲硬件或軟件問題而沒法 繼續運行時,就會發生實例故障 4.介質故障 在數據庫沒法正確讀取或寫入某個數據庫文件時, 會發生介質故障 =============================================================== oracle 導出導入模式 1.徹底數據庫 導出和導入整個數據庫中的全部對象 2.表 導出和導入一個或多個指定的表或表分區 3.用戶 導出和導入一個用戶模式中的全部對象 4.表空間 導出和導入一個或多個指定的表空間中的全部對象 =============================================================== 導出實用程序有如下經常使用命令參數 USERID 肯定執行導出實用程序的用戶名和口令 BUFFER 肯定導出數據時所使用的緩衝區大小,其大小用字節表示 FILE 指定導出的二進制文件名稱,默認的擴展名是.dmp FULL 指定是否以所有數據庫方式導出,只有受權用戶纔可以使用此參數 OWNER 要導出的數據庫用戶列表 HELP 指定是否顯示幫助消息和參數說明 ROWS 肯定是否要導出表中的數據 TABLES 按表方式導出時,指定需導出的表和分區的名稱 PARFILE 指定傳遞給導出實用程序的參數文件名 TABLESPACES 按表空間方式導出時,指定要導出的表空間名 按用戶方式導出數據 exp scott/tiger@tsinghua file=scott_back owner=scott 按表方式導出數據 exp scott/tiger@tsinghua tables=(emp, dept) file=scott_back_tab 按表空間方式導出數據 exp system/zl@tsinghua tablespaces=(users) file=tbs_users 使用參數文件導出數據 exp system/zl parfile='C:parameters.txt' =============================================================== 導入實用程序有以下經常使用命令參數 USERID 指定執行導入的用戶名和密碼 BUFFER 指定用來讀取數據的緩衝區大小,以字節爲單位 COMMIT 指定是否在每一個數組(其大小由BUFFER參數設置)插入後進行提交 FILE 指定要導入的二進制文件名 FROMUSER 指定要從導出轉儲文件中導入的用戶模式 TOUSER 指定要將對象導入的用戶名。FROMUSER與TOUSER能夠不一樣 FULL 指定是否要導入整個導出轉儲文件 TABLES 指定要導入的表的列表 ROWS 指定是否要導入表中的行 PARFILE 指定傳遞給導入實用程序的參數文件名,此文件能夠包含這裏列出的全部參數 IGNORE 導入時是否忽略遇到的錯誤,默認爲N TABLESPACES 按表空間方式導入,列出要導入的表空間名 將整個文件導入數據庫 imp tsinghua/tsinghua@tsinghua file=item_back.dmp ignore=y full=y 將scott用戶的表導入到martin用戶 imp system/zl@tsinghua file=scott_back fromuser=scott touser=martin tables=(emp,dept) 使用參數文件導入數據 imp system/oracle parfile='C:parameters.txt' =============================================================== 歸檔日誌方式下的數據庫:自動歸檔和手動歸檔 手動歸檔容許用戶手動歸檔非活動日誌文件文件的已填充組 自動歸檔對非活動日誌文件文件進行自動歸檔 =============================================================== 數據庫可在兩種方式下運行:非歸檔日誌方式和歸檔日誌方式 非歸檔日誌方式能夠避免實例故障,但沒法避免介質故障。在此方式下,數據庫只能實施冷備份. 歸檔日誌方式產生歸檔日誌,用戶可使用歸檔日誌徹底恢復數據庫. =============================================================== 導出和導入實用程序的特色有: 能夠按時間保存表結構和數據 1.容許導出指定的表,並從新導入到新的數據庫中 2.能夠把數據庫遷移到另一臺異構服務器上 3.在兩個不一樣版本的Oracle數據庫之間傳輸數據 4.在聯機狀態下進行備份和恢復 5.能夠從新組織表的存儲結構,減小連接及磁盤碎片 =============================================================== oracle表輸格式爲xml全過程.txt SQL> conn sys/sys as sysdba 已鏈接。 SQL> drop directory test_dir 2 / 目錄已丟棄。 SQL> CREATE DIRECTORY TEST_DIR AS 'C:'; 目錄已建立。 SQL> GRANT READ, WRITE ON DIRECTORY TEST_DIR TO rbb; 受權成功。 SQL> conn rbb/rbb 已鏈接。 SQL> ed 已寫入文件 afiedt.buf 1 DECLARE 2 src CLOB; 3 xmlfile UTL_FILE.FILE_TYPE; 4 length INTEGER; 5 buffer VARCHAR2(16384); 6 BEGIN 7 src := DBMS_XMLQuery.getXml('select * from liuxing'); 8 length := DBMS_LOB.GETLENGTH(src); 9 DBMS_LOB.READ(src, length, 1, buffer); 10 xmlfile := UTL_FILE.FOPEN('TEST_DIR', 'emp.xml', 'w'); 11 UTL_FILE.PUT(xmlfile, buffer); 12 UTL_FILE.FCLOSE(xmlfile); 13* END; SQL> / PL/SQL 過程已成功完成。 =============================================================== SQL> ed 已寫入文件 afiedt.buf 1 declare 2 lname number; 3 counter number; 4 begin 5 counter:=1; 6 while counter<=10 7 loop 8 lname:=dbms_random.random; 9 dbms_output.put_line(lname); 10 counter:=counter+1; 11 end loop; 12* end; SQL> / 277652640 -479979827 -1049652647 -1006595853 1252280346 196435204 466478280 -85782435 -1489036577 -927786638 PL/SQL 過程已成功完成。 已用時間: 00: 00: 00.00 =============================================================== 修改表名 alter table old_table_name rename to new_table_name; =============================================================== 估算SQL執行的I/O數 SQL>SET AUTOTRACE ON ; SQL>SELECT * FROM TABLE; OR SQL>SELECT * FROM v$filestat ; =============================================================== 如何查有多少個數據庫實例 SQL>SELECT * FROM V$INSTANCE; =============================================================== 查詢數據庫有多少表 SQL>select * from all_tables; =============================================================== 顯示測試SQL語句執行所用的時間 SQL>set timing on ; =============================================================== 監控事例的等待 select event,sum(decode(wait_Time,0,0,1)) "Prev", sum(decode(wait_Time,0,1,0)) "Curr",count(*) "Tot" from v$session_Wait group by event order by 4; =============================================================== 回滾段的爭用狀況 select name, waits, gets, waits/gets "Ratio" from v$rollstat C, v$rollname D where C.usn = D.usn; =============================================================== 監控表空間的 I/O 比例 select B.tablespace_name name,B.file_name "file",A.phyrds pyr, A.phyblkrd pbr,A.phywrts pyw, A.phyblkwrt pbw from v$filestat A, dba_data_files B where A.file# = B.file_id order by B.tablespace_name; =============================================================== 監控文件系統的 I/O 比例 select substr(C.file#,1,2) "#", substr(C.name,1,30) "Name", C.status, C.bytes, D.phyrds, D.phywrts from v$datafile C, v$filestat D where C.file# = D.file#; =============================================================== 在某個用戶下找全部的索引 select user_indexes.table_name, user_indexes.index_name,uniqueness, column_name from user_ind_columns, user_indexes where user_ind_columns.index_name = user_indexes.index_name and user_ind_columns.table_name = user_indexes.table_name order by user_indexes.table_type, user_indexes.table_name, user_indexes.index_name, column_position; =============================================================== 監控 SGA 的命中率 select a.value + b.value "logical_reads", c.value "phys_reads", round(100 * ((a.value+b.value)-c.value) / (a.value+b.value)) "BUFFER HIT RATIO" from v$sysstat a, v$sysstat b, v$sysstat c where a.statistic# = 38 and b.statistic# = 39 and c.statistic# = 40; =============================================================== 監控 SGA 中字典緩衝區的命中率 select parameter, gets,Getmisses , getmisses/(gets+getmisses)*100 "miss ratio", (1-(sum(getmisses)/ (sum(gets)+sum(getmisses))))*100 "Hit ratio" from v$rowcache where gets+getmisses <>0 group by parameter, gets, getmisses; =============================================================== 監控 SGA 中共享緩存區的命中率,應該小於1% select sum(pins) "Total Pins", sum(reloads) "Total Reloads", sum(reloads)/sum(pins) *100 libcache from v$librarycache; select sum(pinhits-reloads)/sum(pins) "hit radio",sum(reloads)/sum(pins) "reload percent" from v$librarycache; =============================================================== 顯示全部數據庫對象的類別和大小 select count(name) num_instances ,type ,sum(source_size) source_size , sum(parsed_size) parsed_size ,sum(code_size) code_size ,sum(error_size) error_size, sum(source_size) +sum(parsed_size) +sum(code_size) +sum(error_size) size_required from dba_object_size group by type order by 2; =============================================================== 監控 SGA 中重作日誌緩存區的命中率,應該小於1% SELECT name, gets, misses, immediate_gets, immediate_misses, Decode(gets,0,0,misses/gets*100) ratio1, Decode(immediate_gets+immediate_misses,0,0, immediate_misses/(immediate_gets+immediate_misses)*100) ratio2 FROM v$latch WHERE name IN ('redo allocation', 'redo copy'); =============================================================== 監控內存和硬盤的排序比率,最好使它小於 .10,增長 sort_area_size SELECT name, value FROM v$sysstat WHERE name IN ('sorts (memory)', 'sorts (disk)'); =============================================================== 監控當前數據庫誰在運行什麼SQL語句 SELECT osuser, username, sql_text from v$session a, v$sqltext b where a.sql_address =b.address order by address, piece; =============================================================== 監控字典緩衝區 SELECT (SUM(PINS - RELOADS)) / SUM(PINS) "LIB CACHE" FROM V$LIBRARYCACHE; SELECT (SUM(GETS - GETMISSES - USAGE - FIXED)) / SUM(GETS) "ROW CACHE" FROM V$ROWCACHE; SELECT SUM(PINS) "EXECUTIONS", SUM(RELOADS) "CACHE MISSES WHILE EXECUTING" FROM V$LIBRARYCACHE; =============================================================== 後者除之前者,此比率小於1%,接近0%爲好。 SELECT SUM(GETS) "DICTIONARY GETS",SUM(GETMISSES) "DICTIONARY CACHE GET MISSES" FROM V$ROWCACHE =============================================================== 監控 MTS select busy/(busy+idle) "shared servers busy" from v$dispatcher; 此值大於0.5時,參數需加大 select sum(wait)/sum(totalq) "dispatcher waits" from v$queue where type='dispatcher'; select count(*) from v$dispatcher; select servers_highwater from v$mts; servers_highwater接近mts_max_servers時,參數需加大 =============================================================== 知道當前用戶的ID號 SQL>SHOW USER; OR SQL>select user from dual; =============================================================== 查看碎片程度高的表 SELECT segment_name table_name , COUNT(*) extents FROM dba_segments WHERE owner NOT IN ('SYS', 'SYSTEM') GROUP BY segment_name HAVING COUNT(*) = (SELECT MAX( COUNT(*) ) FROM dba_segments GROUP BY segment_name); =============================================================== 知道表在表空間中的存儲狀況 select segment_name,sum(bytes),count(*) ext_quan from dba_extents where tablespace_name='&tablespace_name' and segment_type='TABLE' group by tablespace_name,segment_name; =============================================================== 知道索引在表空間中的存儲狀況 select segment_name,count(*) from dba_extents where segment_type='INDEX' and owner='&owner' group by segment_name; =============================================================== 知道使用CPU多的用戶session 11是cpu used by this session select a.sid,spid,status,substr(a.program,1,40) prog,a.terminal,osuser,value/60/100 value from v$session a,v$process b,v$sesstat c where c.statistic#=11 and c.sid=a.sid and a.paddr=b.addr order by value desc; =============================================================== **************************************************SQLServer語言基本語句*********************************************************** SQL分類: DDL—數據定義語言(CREATE,ALTER,DROP,DECLARE) DML—數據操縱語言(SELECT,DELETE,UPDATE,INSERT) DCL—數據控制語言(GRANT,REVOKE,COMMIT,ROLLBACK) 首先,簡要介紹基礎語句: &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 一、說明:建立數據庫 CREATE DATABASE database-name create database database &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 二、說明:刪除數據庫 drop database database drop database dbname &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 三、說明:備份sql server --- 建立 備份數據的 device user pubs exec database 'disk' USE master EXEC sp_addumpdevice 'disk', 'testBack', 'c:mssql7backupMyNwind_1.dat' --- 開始 備份 backup database pubs to testback BACKUP DATABASE pubs TO testBack &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 四、說明:建立新表 create table tabname(name nvchar(20) primary key,password nvchar(16)) create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..) 根據已有的表建立新表: A:create table tab_new like tab_old (使用舊錶建立新表) B:create table tab_new as select col1,col2… from tab_old definition only &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 五、說明: 刪除新表:drop table tabname &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 六、說明: 增長一個列:Alter table tabname add column col type alter table tabanme add column col 注:列增長後將不能刪除。DB2中列加上後數據類型也不能改變,惟一能改變的是增長varchar類型的長度。 &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 七、說明: 添加主鍵:Alter table tabname add primary key(col) 說明: 刪除主鍵:Alter table tabname drop primary key(col) &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 八、說明: 建立索引:create [unique] index idxname on tabname(col….) 刪除索引:drop index idxname 注:索引是不可更改的,想更改必須刪除從新建。 &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 九、說明: 建立視圖:create view viewname as select statement 刪除視圖:drop view viewname &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 十、說明:幾個簡單的基本的sql語句 選擇:select * from table1 where 範圍 插入:insert into table1(field1,field2) values(value1,value2) 刪除:delete from table1 where 範圍 更新:update table1 set field1=value1 where 範圍 查找:select * from table1 where field1 like ’%value1%’ ---like的語法很精妙,查資料! 排序:select * from table1 order by field1,field2 [desc] 總數:select count * as totalcount from table1 求和:select sum(field1) as sumvalue from table1 平均:select avg(field1) as avgvalue from table1 最大:select max(field1) as maxvalue from table1 最小:select min(field1) as minvalue from table1 &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 十一、說明:幾個高級查詢運算詞 下列語句建立 STAFF 表 中 20 部門的非經理人員視圖,其中薪水和佣金不經過基表顯示。 CREATE VIEW STAFF_ONLY AS SELECT ID, NAME, DEPT, JOB, YEARS FROM STAFF WHERE JOB <> 'Mgr' AND DEPT=20 在建立視圖以後,下列語句顯示視圖的內容: SELECT * FROM STAFF_ONLY A: UNION union 運算符 UNION 運算符經過組合其餘兩個結果表(例如 TABLE1 和 TABLE2)並消去表中任何重複行而派生出一個結果表。當 ALL 隨 UNION 一塊兒使用時(即 UNION ALL),不消除重複行。兩種狀況下,派生表的每一行不是來自 TABLE1 就是來自 TABLE2。 B: EXCEPT except運算符 EXCEPT 運算符經過包括全部在 TABLE1 中但不在 TABLE2 中的行並消除全部重複行而派生出一個結果表。當 ALL 隨 EXCEPT 一塊兒使用時 (EXCEPT ALL),不消除重複行。 C: INTERSECT intersect運算符 INTERSECT 運算符經過只包括 TABLE1 和 TABLE2 中都有的行並消除全部重複行而派生出一個結果表。當 ALL 隨 INTERSECT 一塊兒使用時 (INTERSECT ALL),不消除重複行。 注:使用運算詞的幾個查詢結果行必須是一致的。 &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 十二、說明:使用外鏈接 A、left outer join: 左外鏈接(左鏈接):結果集幾包括鏈接表的匹配行,也包括左鏈接表的全部行。 SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c B:right outer join: 右外鏈接(右鏈接):結果集既包括鏈接表的匹配鏈接行,也包括右鏈接表的全部行。 C:full outer join: 全外鏈接:不只包括符號鏈接表的匹配行,還包括兩個鏈接表中的全部記錄。 其次,你們來看一些不錯的sql語句 一、說明:複製表(只複製結構,源表名:a 新表名:b) (Access可用) 法一:select * into b from a where 1<>1 法二:select top 0 * into b from a 二、說明:拷貝表(拷貝數據,源表名:a 目標表名:b) (Access可用) insert into b(a, b, c) select d,e,f from b; 三、說明:跨數據庫之間表的拷貝(具體數據使用絕對路徑) (Access可用) insert into b(a, b, c) select d,e,f from b in ‘具體數據庫’ where 條件 例子:..from b in '"&Server.MapPath(".")&"data.mdb" &"' where.. 四、說明:子查詢(表名1:a 表名2:b) select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3) 五、說明:顯示文章、提交人和最後回覆時間 select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b 六、說明:外鏈接查詢(表名1:a 表名2:b) select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c 七、說明:在線視圖查詢(表名1:a ) select * from (SELECT a,b,c FROM a) T where t.a > 1; 八、說明:between的用法,between限制查詢數據範圍時包括了邊界值,not between不包括 select * from table1 where time between time1 and time2 select a,b,c, from table1 where a not between 數值1 and 數值2 九、說明:in 的使用方法 select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’) 十、說明:兩張關聯表,刪除主表中已經在副表中沒有的信息 delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 ) 十一、說明:四表聯查問題: select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where ..... 十二、說明:日程安排提早五分鐘提醒 SQL: select * from 日程安排 where datediff('minute',f開始時間,getdate())>5 1三、說明:一條sql 語句搞定數據庫分頁 select top 10 b.* from (select top 20 主鍵字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主鍵字段 = a.主鍵字段 order by a.排序字段 1四、說明:前10條記錄 select top 10 * form table1 where 範圍 1五、說明:選擇在每一組b值相同的數據中對應的a最大的記錄的全部信息(相似這樣的用法能夠用於論壇每個月排行榜,每個月熱銷產品分析,按科目成績排名,等等.) select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b) 1六、說明:包括全部在 TableA 中但不在 TableB和TableC 中的行並消除全部重複行而派生出一個結果表 (select a from tableA ) except (select a from tableB) except (select a from tableC) 1七、說明:隨機取出10條數據 select top 10 * from tablename order by newid() 1八、說明:隨機選擇記錄 select newid() 1九、說明:刪除重複記錄 Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...) 20、說明:列出數據庫裏全部的表名 select name from sysobjects where type='U' 2一、說明:列出表裏的全部的 select name from syscolumns where id=object_id('TableName') 2二、說明:列示type、vender、pcs字段,以type字段排列,case能夠方便地實現多重選擇,相似select 中的case。 select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type 顯示結果: type vender pcs 電腦 A 1 電腦 A 1 光盤 B 2 光盤 A 2 手機 B 3 手機 C 3 2三、說明:初始化表table1 TRUNCATE TABLE table1 2四、說明:選擇從10到15的記錄 select top 5 * from (select top 15 * from table order by id asc) table_別名 order by id desc 隨機選擇數據庫記錄的方法(使用Randomize函數,經過SQL語句實現) 對存儲在數據庫中的數據來講,隨機數特性能給出上面的效果,但它們可能太慢了些。你不能要求ASP「找個隨機數」而後打印出來。實際上常見的解決方案是創建以下所示的循環: Randomize RNumber = Int(Rnd*499) +1 While Not objRec.EOF If objRec("ID") = RNumber THEN ... 這裏是執行腳本 ... end if objRec.MoveNext Wend 這很容易理解。首先,你取出1到500範圍以內的一個隨機數(假設500就是數據庫內記錄的總數)。而後,你遍歷每一記錄來測試ID 的值、檢查其是否匹配RNumber。知足條件的話就執行由THEN 關鍵字開始的那一塊代碼。假如你的RNumber 等於495,那麼要循環一遍數據庫花的時間可就長了。雖然500這個數字看起來大了些,但相比更爲穩固的企業解決方案這仍是個小型數據庫了,後者一般在一個數據庫內就包含了成千上萬條記錄。這時候不就死定了? 採用SQL,你就能夠很快地找出準確的記錄而且打開一個只包含該記錄的recordset,以下所示: Randomize RNumber = Int(Rnd*499) + 1 SQL = "SELECT * FROM Customers WHERE ID = " & RNumber set objRec = ObjConn.Execute(SQL) Response.WriteRNumber & " = " & objRec("ID") & " " & objRec("c_email") 沒必要寫出RNumber 和ID,你只須要檢查匹配狀況便可。只要你對以上代碼的工做滿意,你自可按需操做「隨機」記錄。Recordset沒有包含其餘內容,所以你很快就能找到你須要的記錄這樣就大大下降了處理時間。 再談隨機數 如今你下定決心要榨乾Random 函數的最後一滴油,那麼你可能會一次取出多條隨機記錄或者想採用必定隨機範圍內的記錄。把上面的標準Random 示例擴展一下就能夠用SQL應對上面兩種狀況了。 爲了取出幾條隨機選擇的記錄並存放在同一recordset內,你能夠存儲三個隨機數,而後查詢數據庫得到匹配這些數字的記錄: SQL = "SELECT * FROM Customers WHERE ID = " & RNumber & " OR ID = " & RNumber2 & " OR ID = " & RNumber3 假如你想選出10條記錄(也許是每次頁面裝載時的10條連接的列表),你能夠用BETWEEN 或者數學等式選出第一條記錄和適當數量的遞增記錄。這一操做能夠經過好幾種方式來完成,可是 SELECT 語句只顯示一種可能(這裏的ID 是自動生成的號碼): SQL = "SELECT * FROM Customers WHERE ID BETWEEN " & RNumber & " AND " & RNumber & "+ 9" 注意:以上代碼的執行目的不是檢查數據庫內是否有9條併發記錄。 隨機讀取若干條記錄,測試過 Access語法:SELECT top 10 * From 表名 ORDER BY Rnd(id) Sql server:select top n * from 表名 order by newid() MySQL select * From 表名 Order By rand() Limit n Access左鏈接語法(最近開發要用左鏈接,Access幫助什麼都沒有,網上沒有Access的SQL說明,只有本身測試, 如今記下以備後查) 語法 select table1.fd1,table1,fd2,table2.fd2 From table1 left join table2 on table1.fd1,table2.fd1 where ... 使用SQL語句 用...代替過長的字符串顯示 語法: SQL數據庫:select case when len(field)>10 then left(field,10)+'...' else field end as news_name,news_id from tablename Access數據庫:SELECT iif(len(field)>2,left(field,2)+'...',field) FROM tablename; Conn.Execute說明 Execute方法 該方法用於執行SQL語句。根據SQL語句執行後是否返回記錄集,該方法的使用格式分爲如下兩種: 1.執行SQL查詢語句時,將返回查詢獲得的記錄集。用法爲: Set 對象變量名=鏈接對象.Execute("SQL 查詢語言") Execute方法調用後,會自動建立記錄集對象,並將查詢結果存儲在該記錄對象中,經過Set方法,將記錄集賦給指定的對象保存,之後對象變量就表明了該記錄集對象。 2.執行SQL的操做性語言時,沒有記錄集的返回。此時用法爲: 鏈接對象.Execute "SQL 操做性語句" [, RecordAffected][, Option] ·RecordAffected 爲可選項,此出可放置一個變量,SQL語句執行後,所生效的記錄數會自動保存到該變量中。經過訪問該變量,就可知道SQL語句隊多少條記錄進行了操做。 ·Option 可選項,該參數的取值一般爲adCMDText,它用於告訴ADO,應該將Execute方法以後的第一個字符解釋爲命令文本。經過指定該參數,可以使執行更高效。 ·BeginTrans、RollbackTrans、CommitTrans方法 這三個方法是鏈接對象提供的用於事務處理的方法。BeginTrans用於開始一個事物;RollbackTrans用於回滾事務;CommitTrans用於提交全部的事務處理結果,即確認事務的處理。 事務處理能夠將一組操做視爲一個總體,只有所有語句都成功執行後,事務處理纔算成功;若其中有一個語句執行失敗,則整個處理就算失敗,並恢復處處裏前的狀態。 BeginTrans和CommitTrans用於標記事務的開始和結束,在這兩個之間的語句,就是做爲事務處理的語句。判斷事務處理是否成功,可經過鏈接對象的Error集合來實現,若Error集合的成員個數不爲0,則說明有錯誤發生,事務處理失敗。Error集合中的每個Error對象,表明一個錯誤信息。 ***************************************各類數據庫鏈接方法********************************************************************** ==================TestSQLServer.java鏈接SQLServer==================================== import java.sql.*; import java.util.*; public class TestSQLServer{ public static void main (String args[]){ try{ Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance(); String url = "jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=testdb"; String user ="sa"; String password = "sa"; Connection conn = DriverManager.getConnection(url,user,password); Statement stat = conn.createStatement(); ResultSet result = stat.executeQuery("SELECT * FROM users"); result.next(); System.out.println(result.getString(1)); System.out.println(result.getString(2)); System.out.println(result.getString(3)); result.close(); stat.close(); conn.close(); }catch(ClassNotFoundException en){ System.out.println("數據庫驅動找不到!"); en.printStackTrace(); }catch(SQLException ex) { while (ex != null) { ex.printStackTrace(); ex = ex.getNextException(); } }catch(Exception e){ System.out.println("其餘未知異常!"); e.printStackTrace(); } } } =================TestMysql.java鏈接mysql數據庫======================================= package org.binbo.dom; import java.sql.*; public class TestMysql{ public static void main (String args[]){ try{ Class.forName("com.mysql.jdbc.Driver").newInstance(); String url = "jdbc:mysql://localhost:3306/binbo"; String user ="root"; String password = "binbo"; Connection conn = DriverManager.getConnection(url,user,password); Statement stat = conn.createStatement(); ResultSet result = stat.executeQuery("SELECT * FROM testxml"); result.next(); System.out.println(result.getString(1)); System.out.println(result.getString(2)); System.out.println(result.getString(3)); result.close(); stat.close(); conn.close(); }catch(ClassNotFoundException en){ System.out.println("數據庫驅動找不到!"); en.printStackTrace(); }catch(SQLException ex) { while (ex != null) { ex.printStackTrace(); ex = ex.getNextException(); } }catch(Exception e){ System.out.println("其餘未知異常!"); e.printStackTrace(); } } } =================TestOracle.java鏈接oracle數據庫================================== package org.binbo.dom; import java.sql.*; public class TestOracle{ public static void main (String args[]){ try{ Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); String url = "jdbc:oracle:thin:@localhost:1521:binbo"; String user ="scott"; String password = "tiger"; Connection conn = DriverManager.getConnection(url,user,password); Statement stat = conn.createStatement(); ResultSet result = stat.executeQuery("SELECT * FROM test"); result.next(); System.out.println(result.getString(1)); System.out.println(result.getString(2)); System.out.println(result.getString(3)); result.close(); stat.close(); conn.close(); }catch(ClassNotFoundException en){ System.out.println("數據庫驅動找不到!"); en.printStackTrace(); }catch(SQLException ex) { while (ex != null) { ex.printStackTrace(); ex = ex.getNextException(); } }catch(Exception e){ System.out.println("其餘未知異常!"); e.printStackTrace(); } } } ===============XML鏈接數據庫===================================================== da.xml <?xml version="1.0" encoding="UTF-8"?> <PEOPLE><!-- <PERSON PERSONID="E01"> <className>com.microsoft.jdbc.sqlserver.SQLServerDriver</className> <url>jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=binbo</url> <user>sa</user> <password>sa</password> </PERSON> --><PERSON PERSONID="E02"> <className>com.mysql.jdbc.Driver</className> <url>jdbc:mysql://localhost:3306/binbo</url> <user>root</user> <password>binbo</password> </PERSON><!-- <PERSON PERSONID="E03"> <className>oracle.jdbc.driver.OracleDriver</className> <url>jdbc:oracle:thin:@localhost:1521:binbo</url> <user>scott</user> <password>tiger</password> </PERSON> --></PEOPLE> -------------------------------------------- content.java package org.binbo.dom; import java.sql.Connection; import java.sql.DriverManager; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; public class Content { public static Connection getConnection(){ Connection conn =null; try { DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance(); DocumentBuilder builder=factory.newDocumentBuilder(); Document doc=builder.parse("da.xml"); NodeList nl=doc.getElementsByTagName_r("PERSON"); Element node=(Element) nl.item(0); String className =node.getElementsByTagName_r("className").item(0).getFirstChild().getNodeValue(); String url =node.getElementsByTagName_r("url").item(0).getFirstChild().getNodeValue(); String user =node.getElementsByTagName_r("user").item(0).getFirstChild().getNodeValue(); String pwd =node.getElementsByTagName_r("password").item(0).getFirstChild().getNodeValue(); Class.forName(className); conn =DriverManager.getConnection(url,user,pwd); } catch (Exception e) { e.printStackTrace(); } return conn; } } -------------------------------------------- Domtest.java package org.binbo.dom; import java.io.FileOutputStream; import java.sql.*; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Document; import org.w3c.dom.Element; public class Domtest { public static void main(String[] args){ try{ Connection conn =Content.getConnection(); PreparedStatement ps=conn.prepareStatement("select * from testxml"); ResultSet rs =ps.executeQuery(); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.newDocument(); Element Stu = doc.createElement_x("binboxml"); Element uname = doc.createElement_x("username"); Element nameid = doc.createElement_x("userid"); Element pass = doc.createElement_x("password"); while(rs.next()){ String id=rs.getString(1); String name=rs.getString(2); String pwd=rs.getString(3); System.out.print(rs.getString(1)); System.out.print(rs.getString(2)); System.out.print(rs.getString(3)); System.out.print("寫入成功!"); nameid.appendChild(doc.createTextNode(id)); uname.appendChild(doc.createTextNode(name)); pass.appendChild(doc.createTextNode(pwd)); } Stu.appendChild(nameid); Stu.appendChild(uname); Stu.appendChild(pass); doc.appendChild(Stu); TransformerFactory tf = TransformerFactory.newInstance(); Transformer tr = tf.newTransformer(); tr.transform(new DOMSource(doc), new StreamResult( new FileOutputStream("Binbo.xml"))); rs.close(); } catch(Exception e){ e.printStackTrace(); } } } =====================數據庫鏈接池===================================== 加到tomcat中的server.xml <Logger className="org.apache.catalina.logger.FileLogger" directory="logs" prefix="localhost_log." suffix=".txt" timestamp="true"/> 這個後面 <Context path="/myjsp" docBase="myjsp" debug="5" reloadable="true" crossContext="true"> <Resource name="jdbc/myjsp" auth="Container" type="javax.sql.DataSource"/> <ResourceParams name="jdbc/myjsp"> <parameter> <name>factory</name> <value>org.apache.commons.dbcp.BasicDataSourceFactory</value> </parameter> <parameter> <name>maxActive</name> <value>100</value> </parameter> <parameter> <name>maxIdle</name> <value>30</value> </parameter> <parameter> <name>maxWait</name> <value>10000</value> </parameter> <parameter> <name>username</name> <value>sa</value> </parameter> <parameter> <name>password</name> <value>sa</value> </parameter> <parameter> <name>driverClassName</name> <value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value> </parameter> <parameter> <name>url</name> <value>jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=jsp</value> </parameter> </ResourceParams> </Context> ----------------------------------------------------------------------- 用DBPool.java得到數據庫鏈接池 package com.binbo.dbo; import java.sql.Connection; import java.sql.DriverManager; import javax.naming.Context; import javax.naming.NamingException; import javax.sql.DataSource; public class DBPool { public static synchronized Connection getConnection()throws Exception{ DataSource ds = null; try{ Context ininCtx = new javax.naming.InitialContext(); Context envCtx = (Context)ininCtx.lookup("java:comp/env"); ds = (DataSource)envCtx.lookup("jdbc/myjsp"); }catch(NamingException e){ e.printStackTrace(); } Connection conn = ds.getConnection(); return conn; } } ----------------------------------------------------------- 操做數據庫 package com.binbo.dbo; import java.sql.*; import com.binbo.javabean.BreakBean; import com.binbo.javabean.OpenBean; public class DataBaseClass { private Statement sta = null; private ResultSet rs = null; Connection conn = null; private int count; public DataBaseClass() throws Exception { // 取得數據庫的鏈接 conn = DBPool.getConnection(); sta = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); } public void getExecute(String sql) { try { System.out.println(sql); sta.executeUpdate(sql); } catch (SQLException e) { e.printStackTrace(); } } public ResultSet getQuery(String sql) { try { System.out.println(sql); rs = sta.executeQuery(sql); } catch (SQLException e) { e.printStackTrace(); } return rs; } * 取得結果集的行數 public int getCount(ResultSet rs2) { try { rs2.next(); count = rs2.getRow(); } catch (SQLException e) { e.printStackTrace(); } return count; } //添加! public void getRegister(OpenBean open) { String sql = "insert into f_info(nam,email,titl,content,tem,mid)values(?,?,?,?,?,?)"; try { PreparedStatement ps = conn.prepareStatement(sql); ps.setString(1, open.getNam()); ps.setString(2, open.getEmail()); ps.setString(3, open.getTitl()); ps.setString(4, open.getContent()); ps.setString(5, open.getTem()); ps.setString(6, open.getDepa()); ps.execute(); } catch (SQLException e) { e.printStackTrace(); } } // 刪除 public void getRealys(OpenBean real) { try { String sql = "delete from departments where id=?"; PreparedStatement ppt = conn.prepareStatement(sql); ppt.setString(1, real.getUnam()); ppt.execute(); } catch (SQLException e) { e.printStackTrace(); } } // 查詢 public void getRealy(OpenBean hg) { try { String sql = "select * from departments where id=?"; PreparedStatement ppg = conn.prepareStatement(sql); ppg.setString(1, hg.getUnam()); ppg.execute(); } catch (SQLException e) { e.printStackTrace(); } } } ============================hibernate操做數據庫==================================== package com.binbo.hibernate.xml; import java.util.Iterator; import java.util.List; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; public class PersonOperate { private Session session = null ; public PersonOperate() { Configuration config = new Configuration().configure() ; SessionFactory factory = config.buildSessionFactory() ; this.session = factory.openSession() ; } // 增長數據 public void insert(Person p) { Transaction tran = this.session.beginTransaction() ; this.session.save(p) ; tran.commit() ; this.session.close() ; } ------------------------------------------ 增長數據調用 LinOperate po = new LinOperate(); Lin p = new Lin(); p.setLname(lname); p.setLmonery(lmonery); p.setLmain(lmain); p.setLtime(ltime); LinOperate po = new LinOperate(); po.insert(p); errors.add("success", new ActionMessage("xiangxi")); request.setAttribute("org.apache.struts.action.ERROR", errors); return mapping.findForward("jinru"); ------------------------------------------ // 修改 public void update(Person p) { Transaction tran = this.session.beginTransaction() ; this.session.update(p) ; tran.commit() ; this.session.close() ; } // 用戶登陸 public boolean queryById(Person person) { boolean flag = false; String hql = "from Person as p where p.id=? and p.password=?" ; Query q = this.session.createQuery(hql) ; q.setString(0,person.getId()) ; q.setString(1,person.getPassword()); Iterator iter = q.list().iterator(); if (iter.hasNext()) { flag = true; person.setName(((Person) iter.next()).getName()); } this.session.close() ; return flag; } //驗證用戶存不存在 public boolean queryC(Person person) { boolean flag = false; String hql = "from Person as p where p.name=?" ; Query q = this.session.createQuery(hql) ; q.setString(0,person.getName()) ; Iterator iter = q.list().iterator(); if (iter.hasNext()) { flag = true; } this.session.close() ; return flag; } //查看我的資料 public Person queryZliao(String id) { Person p = null ; String hql = "from Person as p where p.id=?" ; Query q = this.session.createQuery(hql) ; q.setString(0,id) ; List l = q.list() ; Iterator iter = l.iterator() ; if(iter.hasNext()) { p = (Person)iter.next() ; } return p ; } // 刪除數據 public void delete(Person p) { Transaction tran = this.session.beginTransaction() ; this.session.delete(p) ; tran.commit() ; } // 修改 public void delete(String name) { String hql = "delete Person where name=?" ; Query q = this.session.createQuery(hql) ; q.setString(0,name) ; q.executeUpdate() ; this.session.beginTransaction().commit() ; } // 查詢所有數據 public List queryAll() { List l = null ; String hql = "from Person as p" ; Query q = this.session.createQuery(hql) ; l = q.list() ; return l ; } ------------------------------- ( 查詢所有數據調用 LinOperate po = new LinOperate(); List l = po.queryAll(); Iterator iter = l.iterator(); ArrayList lus = new ArrayList(); while (iter.hasNext()) { Lin p = (Lin) iter.next(); Luser lu = new Luser(); lu.setName(p.getLname()); lu.setChange(p.getLmonery()); lu.setMainn(p.getLmain()); lu.setLtime(p.getLtime()); lus.add(lu); System.out.print(p.getLname() + " "); request.setAttribute("lus", lus); ) ------------------------ // 模糊查詢 public List queryByLike(String cond) { List l = null ; String hql = "from Person as p where p.name like ?" ; Query q = this.session.createQuery(hql) ; q.setString(0,"%"+cond+"%") ; l = q.list() ; return l ; } }