1 概述
資料庫是軟體開發的基礎構件。開發将涉及資料庫基礎知識、庫互聯、模拟資料制造等必要的知識。
本文檔介紹資料庫開發和Oracle的基礎知識,包括:基本概念、基本指令、技術專題、設計方法、FAQ等,其中部分内容引用其他作者内容。
本文提供大量的操作執行個體,全部内容貫穿自己的心得和體會。
本文檔适合所有開發人員、支援人員等。
2 基本概念
2.1 Schema
Schema 中文意思是 方案. "方案"隻是 Oracle 一個分類,不同使用者有不同的方案. DBA Studio來說吧,在左邊分了四大類:(例程,存儲,安全,方案) 例程: 是管理庫的啟動。 存儲: 管理表空間,資料檔案。 安全: 就是管理使用者(密碼,表空間配置設定...) 方案: 有(表,視圖,存儲過程...),不同使用者有不同的案. 如: 在"方案"->選你的"使用者名"之後,才會出現使用者名相關的表. 就隻是一個分類,清晰一點,友善管理。 如 Win2000以上的版本 裡的控制台來說,不是有 管理工具,網絡連接配接... 都是一種分類。主要的是如何建表,視圖等等這些内容.
注意事項:
1.如果隻建立一個使用者,而使用者沒有(表or存儲過程...)的話,在schema裡是看不到的.
2.2 Sysnonyms
A synonym is an alias for a schema object. Synonyms can provide a level of ecurity by masking the name and owner of an object and by providing location transparency for remote objects of a distributed database. Also, they are convenient to use and reduce the complexity of SQL statements for database users.
Synonyms allow underlying objects to be renamed or moved, where only the synonym needs to be redefined and applications based on the synonym continue to function without modification. You can create both public and private synonyms. A public synonym is owned by the special user group named PUBLIC and is accessible to every user in a database. A private synonym is contained in the schema of a specific user and available only to the user and the user’s grantes.
2.3 視圖
使用者在一定的限制條件下可以通過視圖更新、插入、删除資料。
如果視圖連接配接多個表,那麼在一個時間裡隻能更新一個表。所有的能被更新的列可以在資料字典USER_UPDATETABLE_COLUMNS中查到。
使用者在CREATE VIEW中可以使用了WITH子串。WITH READ ONLY子串表示建立的視圖是一個隻讀視圖,不能進行更新、插入、删除操作。WITH CHECK OPTION表示可以進行插入和更新操作,但應該滿足WHERE子串的條件。這個條件就是建立視圖WHERE子句的條件,比如在上面的例子中使用者建立了一個視圖TOP_EMP,在這個視圖中使用者不能插入salary小于2000的資料行。
更多的操作細節可以參照:Oracle 9i
1. 修改視圖需要create view 和 delete 權限。
2. 表和視圖的指令在同一個命名空間中,是以同一個資料庫不能有表名和視圖名重複。
3. 可以對其他資料庫中的表建視圖
4. 視圖的定義有以下的限制: 1、from子句中不能有子查詢 2、select不能指向系統或者使用者的變量 3、select不能指向prepared文法參數 4、定義中的表或視圖必須存在 5、不能對臨時表建視圖,也不能建臨時視圖 6、視圖定義中的表名必須已經存在 7、不能在觸發器和視圖之間建關聯
5. ORDER BY可以用在視圖定義中,但是如果通路視圖的select中使用的order by,則視圖定義中的ORDER BY被忽略。
3 基本指令
3.1.1 ;
在sqlplus環境下, ;表示指令結束。
3.1.2 create
create table dxmp.cfg_sale_agent as select * from usdxmp4.cfg_sale_agent
3.1.3 decode
3.1.4 rowid
select rowid,t.* from 表名稱 t
可以直接在toad中,修改列字段中的值。
3.1.5 Insert
1. 如果兩個表的結構相同時,可以不要制定列,直接的在兩個表之間導資料。
INSERT INTO USDXMP4.DAT_DXMP_INFO select * FROM [email protected]_ZJ
2. 如果兩個表字段不同時,必須把所有的字段列出來,并且,如果字段少的表向字段多的表導資料時,必須向字段多的表中,多的字段,插入空’’。
INSERT INTO USDXMP4.DAT_DXMP_INFO
( SN , ACCOUNT_ID , CONTRACT_ID ,
) select SN , ACCOUNT_ID , CONTRACT_ID , UNIT_TEL , PROD_ID,'','','' FROM DXMP.DAT[email protected]_ZJ
3.
3.1.6 Like
1. select t.*, t.rowid from sys_apm_operation t where describe not like '%您好 %'
3.1.7 select嵌套
update cfg_area_code a
set location_id = (select location_id from cfg_location b where a.area_name = b.location_name)
where exists
(select 1 from cfg_location c
where c.location_name=a.area_name); // 1 僅表示對于選擇出來的列進行指派
update cfg_area_code set location_id = substr(location_id,1,4)
where location_id <> area_code and length(location_id) = 6
and area_code in ('010','023','021','022');
update usdxmp4.dat_dxmp_info ddi set ddi.location_name =
( select cf.location_name from [email protected]_zj cf
where ddi.LOCATION_ID = cf.LOCATION_ID )
兩個表關聯時,沒有互相唯一的字段對應時,也就是一對多時,是不能update的。
update usbms4.cfg_service_subscriber css set css.SA_ID = (
select css1.SA_ID from [email protected]_zj css1
where css1.SUBSCRIBER_ID = css.SUBSCRIBER_ID
and css.prod_id like 'DXMP%'
and substr(css.prod_id,6,3) = css1.prod_id
)
錯誤:隻能記錄數相同才能這樣?
INSERT INTO USDXMP4.DAT_DXMP_INFO(location_name)
select cf.location_name
from usdxmp4.dat_dxmp_info ddi,[email protected]s_zj cf
where ddi.LOCATION_ID = cf.LOCATION_ID
3.1.8 not exists
1.表一中電話号碼在另外一個表中,不存在的電話号碼。select d.* from DAT_YYHB_ACCOUNT d, cfg_order_relation c
where not exists (select c.ACCOUNT_ID from cfg_order_relation c
where d.acc_number = c.account_id)
或者用:not exists ç=è 0= (select count(*) from ……)
2.組合查詢條件
select distinct d.ACC_NUMBER from DAT_YYHB_ACCOUNT d, cfg_order_relation c where ( not exists (select c.ACCOUNT_ID from cfg_order_relation c
where d.ACC_NUMBER = c.ACCOUNT_ID) )
or (d.acc_number = c.account_id and c.service_id not like 'YYHB%')
3.下面方式相同:
select d.* from DAT_YYHB_ACCOUNT d
where not exists (select c.ACCOUNT_ID from cfg_order_relation c
where d.acc_number = c.account_id)
select d.* from DAT_YYHB_ACCOUNT d
where 0= (select count(*) from cfg_order_relation c
where d.acc_number = c.account_id)
4.跨不同的表空間的實作方式
select * from vpm2.customer a where not exists (select * from vpm2.linkman b
where a.id = b.CUSTOMER_ID )
3.1.9 in
SQL=select sum(c.enterprise_Adver_Rate) from channelorder c where c.available='0' and c.enterprise_Adver_Rate > 0 and c.channel_Id='PDGG_HMCX1001' and c.channel_order_id in (select channel_order_id from advertisement where begin_date<sysdate and stop_date>=sysdate)
嵌套删除的方式:
delete from cfg_sys_user_role csur
where csur.USER_ID
in (
select csur.USER_ID
from cfg_sys_user csu, cfg_sys_user_role csur
where csu.OID = csur.USER_ID
and csu.USER_NAME = 'lanchuangsa'
)
3.1.10 ||
update dat_yyhb_account d set d.AREA_CODE = '0'||d.area_code
或update dat_yyhb_account d set d.AREA_CODE = concat('0',d.AREA_CODE)
select '0'||d.area_code from dat_yyhb_account d
update dat_yyhb_account d set d.area_code = ltrim(d.AREA_CODE, '0')
3.1.11 And 和 not 和 or 的優先級别
基本所有的語言都是not>and>or
true or false and false
=true or (false and false)
=true or false
=true
應該是1
3.1.12 In
delete from usdxmp4.cfg_enterprise_order_relation css
where css.SUBSCRIBER_ID in ('DXMP_0570_468688_HW', 'DXMP_0570_489490_HW', 'DXMP_0571_4508362_HW')
and css.PROD_ID like 'DXMP%'
select * from DAT_97_ZX_PARAS
where sn in (select sn from dat_97_zx d where to_char(d.R_DATETIME, 'YYYYMMDD') = '20070701')
UPDATE cfg_subscriber cs
SET cs.status = '4'
WHERE cs.subscriber_id IN (
SELECT DISTINCT cb.subscriber_id
FROM cfg_bill_subscriber cb
WHERE cb.OID IN (
SELECT DISTINCT c.bill_subscriber_oid
FROM cfg_service_bill
3.1.13 Create view
CREATE VIEW Sales AS
SELECT Customer."Salesperson ID", "Sales Order"."Customer ID", Customer.Name Customer, Product."Product ID", Product.Description Product, SUM(ITEM.TOTAL) Amount
FROM "Sales Order", Item, Customer, Product
WHERE Item."Order ID" = "Sales Order"."Order ID" AND "Sales Order"."Customer ID" = Customer."Customer ID" AND Item."Product ID" = Product."Product ID"
GROUP BY Customer."Salesperson ID", "Sales Order"."Customer ID", Customer.Name, Product."Product ID", Product.Description
3.1.14 1=1
在where後,添加了1=1,它使得可以直接使用and 關鍵字。
例如:where.append(" where 1=1 ");
where.append(" and css.sa_id = csa.sa_id");
3.1.15 (+)
表的外連接配接,寫在where條件的左右,可以到時測試一下, 可以選擇。
(+)外部聯結運算符,可以在where子句中使用或使用outer join關鍵字建立聯接。
例如:
sql.append(" sub.SUBSCRIBER_id = mr.account_id (+) ");
sql.append(" and sub.SUBSCRIBER_id = ts.account_id (+) ");
sql.append(" and sub.SUBSCRIBER_id = tl.account_id (+) ");
3.1.16 dual
dual是Oracle的一個表,oracle不像sql server可以不要from子句,是以增加了這個虛拟表dual
3.1.17 tab
1. select * from tab where tname = 'cfg_service'
2. select tname from tab where tname between'DAT_DR_200606' and 'DAT_DR_200606' order by tname
3.1.18 trunc & to_char()
trunc(sysdate) 隻得到日期;to_char(sysdate,'hh24:mi:ss') 或sysdate - trunc(sysdate)可以獲得時間;
3.1.19 concat
update CFG_ENTERPRISE_ORDER_RELATION set prod_id=concat('DXMP_',prod_id)
3.1.20 nvl
通過查詢獲得某個字段的合計值,如果這個值位null将給出一個預設的預設值 select nvl(sum(t.dwxhl),1) from tb_jhde t where zydm=-1這裡關心的nvl的用法,nvl(arg,value)代表如果前面的arg的值為null那麼傳回的值為後面的value
執行個體:
UPDATE usbms4.cfg_service_subscriber
SET area_code = nvl(substr(subscriber_id, 7, 3), '???'), location_id = nvl(substr(subscriber_id, 7, 3), '???'),
account_id = substr(subscriber_id, 6, 4) || account_id
WHERE prod_id = 'DXMP_208' AND account_id NOT LIKE '0%';
COMMIT;
3.1.21 sequence
不能修改值。隻能删除後。再建。
3.1.22 having
select * from usdxmp4.cfg_enterprise_order_relation css
where css.SUBSCRIBER_ID in
(select css.SUBSCRIBER_ID from usdxmp4.cfg_enterprise_order_relation css
group by css.SUBSCRIBER_ID having(count(css.SUBSCRIBER_ID )) > 1)
and css.prod_id not like 'DXMP%'
select cs.cust_id, count(*) from cfg_subscriber cs
group by cs.cust_id having count(*) > 1
SELECT subscriber_id, prod_id
FROM cfg_service_subscriber
WHERE subscriber_id IN (SELECT subscriber_id
FROM cfg_service_subscriber
GROUP BY subscriber_id
HAVING COUNT > 1)
ORDER BY subscriber_id
3.1.23 group by
select cs.cust_id, count(*) from cfg_subscriber cs group by cs.cust_id having count(*) > 1
1. 不能在group by使用列的别名。
3.1.24 substr
UPDATE USDXMP4.WF_ENT_ORDER WEO SET WEO.LOCATION_ID = SUBSTR(WEO.SERVICE_AREA_CODE, 2, 3);
3.1.25 nextval
SELECT ('VTMP_DR_'||SEQ_VTMP_SDR.NEXTVAL) TMP_VIEW FROM dual
3.1.26 to_char 和to_date
按時間精确比較
select * from wf_ent_order weo where
weo.LAST_UPDATE_TIME >= to_date('20070615', 'yyyyMMdd')
and weo.LAST_UPDATE_TIME <= to_date('20070616', 'yyyyMMdd')
查詢某天的資料
select * from wf_ent_order weo where to_char(weo.LAST_UPDATE_TIME , 'yyyyMMdd') = '20070615'
3.1.27 rownum
1. select * from wf_ent_order where rownum <= 1000
2.區間查詢select * from (select rownum rom, sn, ACCOUNT_ID, CONTRACT_ID,AREA_CODE, UNIT_ID from dat_dxmp_info d) where rom between 50 and 100
參照:DrQueryMonthlyReport類,有很多好的sql設計。
sql.append("select * from (");
sql.append("select rownum rid, drTable.* from (").append(
buildReportTableSQL(tmpViewName)).append(
") drTable where rownum <=").append( // drTable is an alias
(getPager() + 1) * getPageSize());
sql.append(") where rid > ").append(getPager() * getPageSize());
select * from (select rownum rid, drTable.* from ( select dr.service_id service_id, dr.calling_id calling_id, dr.called_id called_id, dr.account_id account_id, dr.start_time start_time, dr.end_time end_time, (dr.fee_rate/100) fee_rate, (dr.fee /100) fee, dr.duration duration from VTMP_DR_28 dr,cfg_service service where dr.service_id = service.service_id and dr.start_time >= to_date('200605', 'yyyyMM') and dr.start_time <= to_date('200606', 'yyyyMM') and dr.fee_rate_type = 'MR' order by start_time asc) drTable where rownum <=100) where rid > 0
4 技術專題
4.1 Oralce互連
4.1.1 不同Oracle互連1
1. 不同IP的oralce系統之間可以進行關聯。在邏輯上,可以進行建立成一個大的資料庫系統。
2. 134.96.71.13 建立了在97營業系統上的中間表的視圖,然後可以對97系統上的表進行相關的操作。參見:操作指令。
3. 通路其他網段ip上的資料庫,需要建DBlink,然後所有的insert,update,delete添加@dblinkName
4. 134.96.71.13使用的是linux系統。
在建立DBlink之前,必須修改tnsnames.ora這個檔案。134.96.71.13目錄是:/opt/oracle/product/ 9.2.0 .4/network/admin
4.1.2 不同oracle互連2
1. 當一個Ip上的oracle要通路其他ip上的oracle系統時,需要進行必要的配置(需要一定的權限設定)。
a) 首先,獲得對方ip位址、協定、端口号、服務名稱。等等。
b) 定位到oracle安裝ip位址和檔案夾位址。Unix/Linux環境下:echo $ORACLE_HOME,然後進入目錄,然後再進入,network/admin/>。 在toad工具上,在TNSnames Editors也可以看檔案的配置。
c) 定位到檔案tnsnames.ora。 增加一個關聯的另外一台oracle資料庫。
嘉興測試庫使用者名:hmbst 密碼為:hmbst
jxtest_164 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 134.100.64.164)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = jxtest)
)
)
注意:有時資料庫版本不同,SERVICE_NAME有時需要用SID來表示。
2. 然後,在toad中,建立一個DB link。 輸入使用者名和密碼,建立連接配接。可以用圖形來實作。
例如:create public database link ACCOUNT_97_0573
connect to HMBST
identified by "<pwd>"
using 'jxtest_164';:
3. 建立視圖,通過視圖來進行通路其他系統的相關的表。
操作指令:
CREATE OR REPLACE VIEW DAT_YYHB_ACCOUNT_0572 as select * from [email protected]_97_link_13
将産生:
CREATE OR REPLACE VIEW DAT_SYN_CENTER_0573
(ID, AREA_CODE, ACC_NUMBER, ACT_TYPE, ACT_TIME,
STS, MESSAGE, STS_TIME, PARAMETER_STR, SO_NBR,
REMARKS, COMMENTS)
AS
select "ID","AREA_CODE","ACC_NUMBER","ACT_TYPE","ACT_TIME","STS","MESSAGE","STS_TIME","PARAMETER_STR","SO_NBR","REMARKS","COMMENTS" from [email protected]_97_0573(這個是DB link名稱)
/
4.2 導資料方法
1. 如果新表和舊表結構不同時,先建立原來相同的表。然後,把資料導入。然後,再修改表的結構。不要把順序搞反了。否則,工作量會增加很多倍。
2. 在腳本中,在每一個操作之後,一定要添加上;來辨別一個操作的結束。
4.3 制造測試資料
可以通過寫存儲過程構造測試資料。速度快,制造資料腳本可重用性高。
執行個體:
create or replace procedure insert_prepay ( num in number)
is
str_sql varchar2(500);
total number;
begin
total := 0;
str_sql:='INSERT INTO usbms41.CFG_SUBSCRIBER_PREPAY (SUBSCRIBER_ID, BALANCE, CREDIT, PRE_CHARGE_FEE, STATUS,
INSERT_TIME, RESERVE ) VALUES (trim(to_char(SEQ_PREPAY_DETAIL_ID.nextval,'||'99999999'||')),12020, 9999, 0,'|| '1'||',sysdate, NULL)';
while total < num loop
execute immediate str_sql;
total := total + 1;
if total mod 200 = 0 then
execute immediate 'commit';
end if;
end loop;
execute immediate 'commit';
end;
4.4 觸發器的使用
資料庫觸發器常常用來生成審計日志,這種辦法友善,且有很好的性能,缺點就是不能跨資料庫平台。Hibernate的攔截器也可以生成日志,,它可以不依賴具體的資料庫。
4.5 嵌套查詢
select * from usdxmp4.cfg_enterprise_order_relation css
where css.SUBSCRIBER_ID in
(select css.SUBSCRIBER_ ID from usdxmp4.cfg_enterprise_order_relation css
group by css.SUBSCRIBER_ID having(count(css.SUBSCRIBER_ID )) > 1)
and css.prod_id not like 'DXMP%'
4.5.1 一個表更新另外一個表字段
update usdxmp4.wf_ent_order weo
set weo.WF_STATUS =
(
select w.WF_STATUS from usdxmp4.wf_ent_order wo, dxmp.wf_ent_order w
where wo.sn = w.SN
and wo.sn = weo.sn
) where to_char(weo.SUBMIT_TIME, 'yyyyMMdd') > '20070531'
4.5.2 兩個表之間的子查詢
delete from cfg_order_relation c where exists
(select * from cfg_sys_user cs where c.USER_ID = cs.OWNER_ID
and c.SERVICE_ID = 'YYHB_0572_0001' and cs.PASSWORD is null ) and rownum < 5
4.5.3 在不同表的字段之間複制值
update
(select weo.UNIT_ID UNIT_ID,ddi.UNIT_ID UNIT_ID_1 from wf_ent_order weo,dat_dxmp_info ddi
where weo.SN = ddi.SN
and weo.wf_status = '00'
and ddi.UNIT_ID is not null
)
set UNIT_ID =UNIT_ID_1
4.5.4 多表之間子查詢
select distinct d.acc_number from DAT_YYHB_ACCOUNT d, CFG_ORDER_RELATION c where ((not exists (select c.account_id from CFG_ORDER_RELATION c where d.acc_number = c.account_id) )
or (d.acc_number = c.account_id and c.service_id not like 'YYHB%') ) and not exists (select cf.personnal_Id from cfg_personnal_cust cf where d.acc_number = cf.personnal_Id)
4.6 時間專題
4.6.1 精确到小時和分鐘和秒
select * from usbms2.cfg_service_subscriber css
where to_char(css.BOOK_TIME, 'yyyyMMddhh24mmss') > '20070604120000'
select acct_deal_batch,count(*) record_counts,sum(fee) total_fee
from dat_third_dr
where start_time >= to_date('20051121000000','yyyymmddhh24miss')
and start_time <= to_date('20051208235959','yyyymmddhh24miss')
group by acct_deal_batch
4.6.2 to_char不同使用方式
1. sql.append(" and ( status = 1 or ( status = 2 and to_char ( css.quit_time,'yyyyMMdd') >= '");
sql.append(DateFormatUtils.format(getStartDate(), "yyyyMMdd"))
.append("')");
to_char(sysdate,’yyyy-mm-dd hh24:mi:ss’)
to_char(viewDr.end_time, 'hh24:mi:ss')
delete from CFG_ENTERPRISE_ORDER_RELATION ceor where to_char(ceor.INSERT_TIME, 'yyyymmddhhmm24ss') > '20070309171712'
select count(*) from CFG_ENTERPRISE_ORDER_RELATION ceor where to_char(ceor.BOOK_TIME, 'yyyymmddhh24miss') > '20070309171712'
4.6.3 關于時間和日期的執行個體
sysdate即是Oracle提供的取系統時間的函數
1.日期時間間隔操作 目前時間減去7分鐘的時間 select sysdate,sysdate - interval ’ 7’ MINUTE from dual 目前時間減去7小時的時間 select sysdate - interval ’ 7’ hour from dual 目前時間減去7天的時間 select sysdate - interval ’ 7’ day from dual 目前時間減去7月的時間 select sysdate,sysdate - interval ’ 7’ month from dual 目前時間減去7年的時間 select sysdate,sysdate - interval ’ 7’ year from dual 時間間隔乘以一個數字 select sysdate,sysdate - 8 *interval ’ 2’ hour from dual 2.日期到字元操作 select sysdate,to_char(sysdate,’yyyy-mm-dd hh24:mi:ss’) from dual select sysdate,to_char(sysdate,’yyyy-mm-dd hh:mi:ss’) from dual select sysdate,to_char(sysdate,’yyyy-ddd hh:mi:ss’) from dual select sysdate,to_char(sysdate,’yyyy-mm iw-d hh:mi:ss’) from dual 參考oracle的相關關文檔(ORACLE901DOC/SERVER.901/A90125/SQL_ELEMENTS4.HTM#48515) 3. 字元到日期操作 select to_date(’ 2003-10-17 21:15: 37’ ,’yyyy-mm-dd hh24:mi:ss’) from dual 具體用法和上面的to_char差不多。 4. trunk/ ROUND函數的使用 select trunc(sysdate ,’YEAR’) from dual select trunc(sysdate ) from dual select to_char(trunc(sysdate ,’YYYY’),’YYYY’) from dual 5.oracle有毫秒級的資料類型 --傳回目前時間 年月日小時分秒毫秒 select to_char(current_timestamp(5),’DD-MON-YYYY HH24:MI:SSxFF’) from dual; --傳回目前 時間的秒毫秒,可以指定秒後面的精度(最大=9) select to_char(current_timestamp(9),’MI:SSxFF’) from dual; 6.計算程式運作的時間(ms) declare type rc is ref cursor; l_rc rc; l_dummy all_objects.object_name%type; l_start number default dbms_utility.get_time; begin for I in 1 .. 1000 loop open l_rc for ’select object_name from all_objects ’|| ’where object_id = ’ || i; fetch l_rc into l_dummy; close l_rc; end loop; dbms_output.put_line ( round( (dbms_utility.get_time-l_start)/100, 2 ) || ’ seconds...’ ); end;
7.插入系統時間
insert into aa('11', sysdate) 其中:sysdate即是Oracle提供的取系統時間的函數
4.6.4 to_date()
sqlWhere.append(" and viewDr.start_time >= to_date('").append(
DateFormatUtils.format(getStartDate(), "yyyyMM"))
.append("', 'yyyyMM')").append(
" and viewDr.start_time <= to_date('").append(
DateFormatUtils.format(newEndDate,"yyyyMM")).append(
"', 'yyyyMM')").append(
" and viewDr.fee_rate_type = 'MR'"); // 包月類型
1. dr.service_id = service.service_id and dr.start_time >= to_date('200606', 'yyyyMM') and dr.start_time <= to_date('200606', 'yyyyMM') and dr.fee_rate_type = 'MR' order by start_time asc)
4.6.5 oracle取得系統時鐘
SELECT SYSDATE AS xxx FROM DUAL
1. sysdate是Oracle的系統函數,用于取得系統時鐘,這其中包括了日期和時間。 例如: select * from cfg_order_relation where (sysdate-insert_time <30 )
2. trunc(sysdate) 隻得到日期;
3. to_char(sysdate,'hh24:mi:ss') 或sysdate - trunc(sysdate)可以獲得時間;select trunc(sysdate) from dual
4. select trunc(sysdate ,'YEAR') from dual
5. select CUSTOMER_CODE, PATTERN_OVER_TIME from CUSTOMER where PATTERN_OVER_TIME < sysdate
4.6.6 where中的時間使用
1、 select * from cfg_order_relation where (sysdate-insert_time <30 )
2、 d dr.start_time >= to_date('200605', 'yyyyMM') and dr.start_time <= to_date('200606', 'yyyyMM')
3、 select * from dat_dxmp_info ddi
where ddi.STAFFNO = 'jxsa' and ddi.CREATE_DATE > to_date(' 2006-12-30 ', 'yyyy-mm-dd')
4、 ddi.CREATE_DATE > to_date('20061230', 'yyyyMMdd')
select sysdate, sysdate - ddi.CREATE_DATE, ddi.CREATE_DATE, ddi.sn, ddi.STAFFNO from dat_dxmp_info ddi
where ddi.STAFFNO = 'jxsa'
and sysdate - ddi.CREATE_DATE < 3.1 // this is a day’s number
5、 查詢具體某一天的資料量 要采用like 關鍵字
select ddi.CREATE_DATE from dat_dxmp_info ddi
where ddi.CREATE_date like to_date('20061230', 'yyyyMMdd')
或者采用另外的一種方式:
select count(ddi.sn) count from dat_dxmp_info ddi
4.6.7 where to_char(ddi.CREATE_DATE, 'yyyyMMdd') like '20061230'SYS使用者登陸問題
1. 原因:用SYS使用者登入資料庫時,文法與其它操作使用者寫法不同,必須寫明登入權限。 解決方法:使用正确的書寫方式。 例如:SYS/密碼@服務名 AS SYSDBA;
2. 幾種連接配接用到的指令形式 1.sqlplus / as sysdba 這是典型的作業系統認證,不需要listener程序 2.sqlplus sys/oracle 這種連接配接方式隻能連接配接本機資料庫,同樣不需要listener程序 3.sqlplus sys/[email protected] 這種方式需要listener程序處于可用狀态。最普遍的通過網絡連接配接。
以上連接配接方式使用sys使用者或者其他通過密碼檔案驗證的使用者都不需要資料庫處于可用狀态,作業系統認證也不需要資料庫可用,普通使用者因為是資料庫認證,是以資料庫必需處于open狀态。
4.7 預設對象
1. select * from all_objects where object_name = 'PK_WF_ENT_ORDER_HISTORY'
4.8 normal、sysdba、sysoper、sys、sysdba、dba
4.8.1 sys和system使用者的差別
【system】使用者隻能用normal身份登陸em。 【sys】使用者具有“SYSDBA”或者“SYSOPER”權限,登陸em也隻能用這兩個身份,不能用normal。 “SYSOPER”權限,即資料庫操作員權限,權限包括: 打開資料庫伺服器 關閉資料庫伺服器 備份資料庫 恢複資料庫 日志歸檔 會話限制 “SYSDBA”權限,即資料庫管理者權限,權限包括: 打開資料庫伺服器 關閉資料庫伺服器 備份資料庫 恢複資料庫 日志歸檔 會話限制 管理功能 建立資料庫
4.8.2 normal 、sysdba、 sysoper有什麼差別
normal 是普通使用者 另外兩個,你考察他們所具有的權限就知道了 sysdba擁有最高的系統權限 sysoper主要用來啟動、關閉資料庫,sysoper 登陸後使用者是 public sysdba登陸後是 sys
SQL> conn / as sysdba 已連接配接。 SQL> grant sysoper to test;
授權成功。
SQL> conn test/test as sysoper; 已連接配接。 SQL> show user USER 為"PUBLIC" SQL> conn test/test as sysdba 已連接配接。 SQL> show user USER 為"SYS" SQL>
4.8.3 dba和sysdba的差別
dba、sysdba這兩個系統角色有什麼差別呢 在說明這一點之前我需要說一下oracle服務的建立過程 ·建立執行個體 ·啟動執行個體 ·建立資料庫(system表空間是必須的) 啟動過程 ·執行個體啟動 ·裝載資料庫 ·打開資料庫
sysdba,是管理oracle執行個體的,它的存在不依賴于整個資料庫完全啟動, 隻要執行個體啟動了,他就已經存在,以sysdba身份登陸,裝載資料庫、打開資料庫 隻有資料庫打開了,或者說整個資料庫完全啟動後,dba角色才有了存在的基礎
5 設計方法
1. 表之間沒有關聯,middlegen生成後,也沒互相設定,對方的對象的變量,但是它們也是可以互相程式來把它們關聯起來。要有業務邏輯來決定。
2. 如果有兩個表有實際的關聯關系時,在ER Studio就劃個連線,在生成code時,在類之間就有了聯系。操作時,就更加友善。要根據具體情況來決定。
3. 由于新業務的要添加。需要添加新的表,如果的确和原來的表有必要關聯,則需要修改po對象,和hbm之間的關聯。這樣操作友善。如果不這樣做。也可以從程式層把他們關聯起來。這樣可以降低一定的耦合度(?)。
4. 當建表時,最好預留一定的保留字段,友善以後的擴充。根據具體情況,有時容易造成備援資訊。
5. 當建一個表時,最好要建一個建立時間字段。 這樣可以友善的定位資料插入時間。
6. 表與表之間的多對多的關系時,要分拆為兩個1對多的關系。當兩個表建立關聯時, 将産生一個關聯屬性。例如:學生和課程的關系, 學生id和課程id,他們的之間的關聯屬性是:成績。這也是這兩個id所能确定出來的一個辨別。例如:訂單和商品的關系,訂單id和商品id可以唯一的定位關聯屬性:産品數量。例如:客戶和短信表的關系,他們的關聯屬性是:發送次數。
7. 如果一個實體(或稱為對象),有一個對象類型,例如:一個電話,有個電話類型字段,可以有公司、家庭、移動。The type of phone number, such as business, home or fax. 參見資料庫設計技術。可以根據這個類型的不同來建立一個單獨的表。
8. 建立一個基本的表,然後可以建立一個關聯的Detail表,來描述基本表中的詳細資訊。
9. 部門上司和普通員工,可以建立一個自身的關聯。可以是1對多的關系。參見,ER工具的執行個體。
10. 建一個表,一些基本的字段包括:ID,名稱,描述,插入時間,備注資訊。
11. 如果有不同的程式,或不同的合作方,共同的操作一個表時,一方要修改字段,然後讀取字段資訊時,建字段的方式,可以是: status(0表示原始 1 失敗) message(成功,失敗的原因), 失敗的message最好是發送的源頭來寫,因為它是源頭,這樣,讀資料方,就可以直接的讀了。
12. 當涉及到與固定電話的設計時,最好設計區号和帶區号的電話。區号:當涉及到多個表操作時,可以友善的通過它來定位,不用通過程式每次都解析帶區号的電話。帶區号的電話: 可以友善業務處理,通過這一個電話可以友善的定位到具體的一條記錄。
13. 在一個組織内,如果存在多用使用者類型。不同的角色的使用者,他們的字段也相差很多。可以先建立一個父表,存儲公共資訊,增加一個使用者類型字段,來差別不同的使用者。然後,員工表父表,飛行員子表、修理市為子表。員工表和其它兩個表建立1:1的關系。采用相同的主鍵。這樣就比較清晰。主鍵可以通過sequence來生成來,保證唯一性。
14. 如果主鍵是sequence,但是還想讓另外一個字段,例如:如果還需要userName唯一,可以在資料庫上配置為建唯一性索引。保證唯一性。
15. 對于關鍵資料,最好鍵入插入時間,這個插入時間,可以直接采用資料庫的時間。Sysdate。
16. 如果要使得一個表中幾個字段是唯一的,需要把幾個鍵建成一個唯一性索引,Unique 屬性一定要選中。
17. 主鍵辨別。 通常命名為:PK+表名
18.
6 sql-plus
1. 隻要安裝oracle用戶端,在dos下也可以連接配接資料庫,或者直接用oracle的sqlplus。sqlplus [email protected] wf97
[email protected]表示資料庫名稱
2. start or @ 執行腳本檔案。例如:@E:/USBOSS-4.1/cfg_sys_action.sql
3.
7 學習階梯
1. 裝上一個 Oracle 資料庫。
下載下傳資源 http://otn.oracle.com/software/products/8i_personal/index.html
2. 基礎入門。www.oradb.net
3. 電子書。www.pdown.net http://www.studa.com/newdown/soft/713.htm http://61.144.28.248:8080/d6i/bbs_armok01/bbs_content.jsp?bbsSerialNo=7722&bbsPageNo=1
4. 官方文檔最有權威。http://otn.oracle.com/documentation/oracle8i_arch_816.html
5. 論壇www.oracle-dev.com (開發) www.itpub.net otn.oracle.com
6. 榜樣的力量
http://www.ncn.cn/oracle/admin/2003003.htm http://www.cnoug.org/bin/ut/topic_show.cgi?id=1657&h=1&bpg=1&age=30
建議: 少買書,看相關網站的 FAQ & 精華區;多動手;多思考;
8 FAQ
1. 當查詢語句比較複雜時,将報寫檔案錯誤。
答:在TablesSpaces/Temp,給temp檔案配置設定更大的空間;如果,temp檔案所在目錄下已經沒有空間,可以考慮配置設定一個其他目錄下的建臨時檔案,視具體情況來配置設定。
2. 如果使得一個字段或多個字段的資料在表中是唯一的?
答:可以通過建立唯一性索引。建主鍵時,将預設建一個唯一索引。例如:
CREATE UNIQUE INDEX PK_CFG_SERVICE ON CFG_SERVICE (SERVICE_ID)
3. 存在限制時,不能删除表中資料。
答:把其他表對該表的限制,先設定為失效。等操作完資料後,在改為生效。
4.