|
SELECT *
FROM (SELECT COUNT (c_nme_en) as cus , c_nme_en
FROM web_prod
WHERE c_prod_no = '0325' AND c_tab_no != '0040'
GROUP BY c_nme_en)
WHERE cus > 1
order by c_nme_en
這個就是對c_nme_en列的不同內容進行統計。
可以參考:http://www.w3school.com.cn/sql/sql_groupby.asp
posted @ 2009-06-03 11:11 斷點 閱讀(56) | 評論 (0)
數據類型:
數字類型:
Number用來表示可變長的數值列,語法為Number(p, s),p是指所有有效數字的位數,s是指小數點以后的位數;p和s的取值分別是p=1 to 38,s=-84 to 127;
有效數位:從左邊第一個不為0的數算起,小數點和負號不計入有效位數。
p>0,對s分3種情況:
1. s>0
精確到小數點右邊s位,并四舍五入。然后檢驗有效數位是否<=p;如果s>p,小數點右邊至少有s-p個0填充。
2. s<0
精確到小數點左邊s位,并四舍五入。然后檢驗有效數位是否<=p+|s|
3.s是0或者未指定,四舍五入到最近整數。
注意:當p小于s時候,表示數字是絕對值小于1的數字,且從小數點右邊開始的前s-p 位必須是0,保留s位小數。
比如
Value Datatype Stored Value
123.2564 NUMBER 123.2564
1234.9876 NUMBER(6) 1235
1234.9876 NUMBER(6,2) 1234.99
12345.12345 NUMBER(6,2) Error
12345.345 NUMBER(5,-2) 12300
1234567 NUMBER(5,-2) 1234600
12345678 NUMBER(5,-2) Error
12345.58 NUMBER(*, 1) 12345.6
0.1 NUMBER(4,5) Error
0.01234567 NUMBER(4,5) 0.01235
0.09999 NUMBER(4,5) 0.09999
0.099996 NUMBER(4,5) <>
用法如下:
create table t_n(id number(5,2));
insert into t_n values(123.455);
insert into t_n values(1.234);
insert into t_n values(.001);
select * from t_n 結果為:
Number類型存儲實數,PLS_Integer和BINARY_Integer只能存儲整數。
字符類型:
Char表示定長的字符串,語法Char(L),L是可選的。如果沒有指定L值,默認為1;最大長度為32767。
VarChar2用來存儲可變的字符串,語法VarChar2(L),L是必須的。最大長度為32767。
布爾類型:
Boolean類型的合法賦值為True、False和Null。
類型轉換:
To_Char:可以將Number和Date類型轉換為Varchar2類型;
To_Date:將Char類型轉換Date類型;
To_Number:將Char類型轉換Number類型;
變量和常量:
變量名稱:1.必須以字母開頭;2.其后可以跟一個或多個字母、數字(0~9)、特殊字符$、#或_ ;
3.變量長度不超過30個字符;4.變量名中不能有空格。
1.變量的聲明:
DECLARE
v_StudentName VARCHAR2(20),
v_CurrentDate DATE;
v_NumberCredits NUMBER(3);
2.自定義的數據類型:
DECLARE
TYPE t_StudentRecord IS RECORD (FirstName Varchar2(10),LastName Varchar2(10),
CurrentCredits NUMBER(3));
v_Student t_StudentRecord;
3.變量屬性:
下面介紹常見的幾種復合數據類型變量的定義。
(1)使用%type定義變量
為了讓PL/SQL中變量的類型和數據表中的字段的數據類型一致,Oracle 9i提供了%type定義方法。這樣當數據表的字段類型修改后,PL/SQL程序中相應變量的類型也自動修改。如下:
declare
mytable emp.empno%type;
begin
select a.empno into mytable
from emp a
where a.ename='SCOTT';
dbms_output.put_line(mytable);
end;
(2)使用%rowtype定義變量
使用%type可以使變量獲得字段的數據類型,使用%rowtype可以使變量獲得整個記錄的數據類型。
比較兩者定義的不同:變量名 數據表.列名%type,變量名 數據表%rowtype。
declare
mytable emp%rowtype;
begin
select * into mytable
from emp a
where a.ename='SCOTT';
dbms_output.put_line(mytable.empno||' '||mytable.job);
end;
流程控制:
待續。。。
posted @ 2009-02-03 11:33 斷點 閱讀(176) | 評論 (0)
SELECT b.c_dpt_cde as CDptCde,
a.c_prod_no as CProdNo,
a.c_ply_no as CPlyNo,
a.c_edr_no as CEdrNo,
a.c_insrnt_cde as CInsrntCde,
a.c_bs_cur as CBsCur,
a.n_bs_amt as NBsAmt,
a.n_exch_rate as NExchRate,
a.c_rp_cur as CRpCur,
a.n_rp_amt as NRpAmt,
a.n_orig_cur_amt as NOrigCurAmt,
a.c_main_con_cde as CMainConCde,
a.c_sls_cde as CSlsCde,
a.c_cha_cls as CChaCls,
a.c_cha_cde as CChaCde,
b.c_oper_cde as COperCde,
b.t_cav_tm as TCavTm,
b.t_upd_tm as TUpdTm,
a.c_cav_pk_id as CCavPkId,
c.c_rp_type as CRpType,
b.c_check_cde as CCheckCde,
b.t_check_tm as TCheckTm,
b.c_check_flag as CCheckFlag,
b.c_check_memo as CCheckMemo,
a.c_prmdue_pk_id as CPrmduePkId,
a.c_paydue_pk_id as CPayduePkId,
a.c_clmdue_pk_id as CClmduePkId,
a.c_cavdoc_pk_id as CCavdocPkId,
a.c_clm_no as CClmNo,
a.c_bill_flag as CBillFlag,
a.c_feetyp_cde as CFeetypCde
FROM web_fin_cav_doc a
left join web_fin_cav_bill b on a.c_cav_pk_id = b.c_cav_pk_id
left join web_fin_cav_rptyp c on a.c_cav_pk_id = c.c_cav_pk_id
WHERE 1 = 1
AND 1 = 1
AND 1 = 1
AND 1 = 1
AND 1 = 1
AND 1 = 1
AND 1 = 1
AND 1 = 1
AND 1 = 1
AND 1 = 1
AND 1 = 1
AND 1 = 1
AND 1 = 1
AND 1 = 1
AND 1 = 1
AND 1 = 1;
上面實現的是三個數據表之間的左連接。以前看見過兩個表的左連接,而要實現三個表之間的左連接,還真有點困難,搞了半天才做出來。。。
posted @ 2009-02-27 09:50 斷點 閱讀(356) | 評論 (0)
1.集合操作:
Union 用第二個查詢結果合并第一個查詢結果,同時不顯示重復的行。
Union all 檢索出所有的行,包括重復的行。
intersect 返回兩個查詢所檢索出的共有行。
minus 返回將第二個查詢檢索出的行從第一個查詢檢索出的行中減去之后剩余的行。
select ename,dname,job
from dept t,emp p
where t.deptno=p.deptno and t.dname='SALES'
union/intersect/minus
select ename,dname,job
from dept t,emp p
where t.deptno=p.deptno and p.job='MANAGER';
2.子查詢:
可以在一個select語句中嵌入另一個完整的select語句,但此句的子查詢的返回結果只能有一個,如想返回多個可用 in 。
select ename,dname,job
from dept t,emp p
where t.deptno=p.deptno and t.dname=
(
select dname
from dept t,emp p
where t.deptno=p.deptno and p.sal=1600.00
);
select ename,dname,job
from dept t,emp p
where t.deptno=p.deptno and t.dname in
(
select dname
from dept t,emp p
where t.deptno=p.deptno and p.sal>3000.00
);
3.表的連接:
select t.dname
from emp p,dept t
where p.deptno=t.deptno and p.ename='SMITH';
由于實施了關系連接的兩表是任何連接的,所有需要在where子句中設置主關鍵字等于外部關鍵字的條件,否則查詢結果不對。
4.case語句:
*簡單case語句,使用表達式確定返回值,但case后的變量只有一個;
select t.dname,t.loc,t.deptno,
case t.deptno
when 10 then 'ACCOUNTING'
when 20 then 'RESEARCH'
when 30 then 'SALES'
else 'T'
end
from dept t;
*搜索case語句,使用條件確定返回值,但when后面可以跟多個條件。
select t.dname,t.loc,t.deptno,
case
when t.deptno=10 and t.loc='CHICAGO' then 'ACCOUNTING'
when t.deptno=20 then 'RESEARCH'
when t.deptno=30 then 'SALES'
else 'T'
end
from dept t;
5.decode函數:
decode(value,search_value,result,default_value)
如果value和search_value相等,則返回result,否則返回default_value。
select t.dname,t.loc,t.deptno,
decode(t.deptno,
10,'ACCOUNTING',
20,'RESEARCH',
30,'SALES',
'T'
)
from dept t;
posted @ 2009-01-13 17:15 斷點 閱讀(240) | 評論 (0)
1.在where子句中使用比較運算符:= ,!=(不等于) , <> (不等于), < ,> ,<= ,>= ,like。
2.使用比較運算符like:%通配符可以匹配任何長度的字符;_每個下劃線匹配一個字母。
3.or:或的意思。
4.and:連接的兩個條件必須同時滿足。
5.not 非:select * from web_fin_dcr t where not t.n_item_no in(1,2);
6.between...and:指定某個范圍內的所有值,包括指定值本身。
7.in用來指定一條列值:select * from web_fin_dcr t where t.n_item_no in(1,2);
8.order by:對檢索到的數據進行排序,默認為升序asc(ascend),降序為desc(descend)。
select * from web_fin_dcr t where t.n_item_no in(1,2,3) order by t.n_item_no desc;
9.distinct來檢索唯一的表列值,也就是檢索哪些不同的數據:
select distinct t.c_cav_flag from web_fin_dcr t where t.n_item_no in(1,2,3);
posted @ 2009-01-12 16:19 斷點 閱讀(61) | 評論 (0)
<beans>
<bean id="person" class="org.spring.bean.Person">
<property name="name">
<value>zhangsan</value>
/property>
<property name="age">
<value>23</value>
</property>
</bean>
</beans>
注意:配置bean的開始,注意在property里name的屬性值要和你在bean類里面的那個name成員變量一樣。
從上面.xml的文檔說明我們可以知道id屬性是一個bean的唯一標示符,這個id在管理Bean的BeanFactory或者ApplicationContext中必須是唯一的標示符。用法如下
Person p = (Person) a.getBean("person");在getBean()方法里所傳遞的參數就是bean的id屬性值。
當然我們也可以使用name屬性來指定Bean的id演示代碼如下:
<beans>
<bean name="person,user" class="org.spring.bean.Person">
<property name="name">
<value>zhangsan</value>
</property>
<property name="age">
<value>23</value>
</property>
</bean>
</beans>
使用bean的id和name來指定bean的id的區別:
id屬性允許我們指定一個Bean的id,并且它在XML DTD中作為一個真正的XML元素的ID屬性被標記,所以XML解析器能夠在其他元素指向它的時候做一些額外的效驗;name屬性則與id相反,如果我們在開發中有必要使用一些非法的字符,那么我們可以通過name屬性指定一個或多個id。當我們指定多個id時要用逗號(,)或者(;)來進行分隔。
用法如下:Person p = (Person) a.getBean("person"); 或改寫為Person p = (Person) a.getBean("user");
posted @ 2009-02-11 10:35 斷點 閱讀(1005) | 評論 (0)
數據庫使用鎖(lock)來保證任何給定時刻最多只有一個事務在修改給定的一段數據。實質上講,正是鎖機制才使并發控制成為可能。
ORACLE的封鎖策略:
1、只有當修改時,Oracle在行級上鎖定數據,不要把鎖定上升到塊或表級。
2、Oracle決不會為讀取而鎖定數據,簡單讀取不能在數據行上設置鎖定。
3、數據的寫入器不會阻塞數據讀取器。
4、只有當另一個數據寫入器已經鎖定了某行數據后,才阻塞其他人對該行數據的寫入。數據的讀取器決不會阻塞數據的寫入器。
-------------------------------------------------------------------------
Oracle并發處理機制的簡單看法。http://www.51testing.com/html/97/n-131297.html
轉載內容如下:
在Oracle開發過程中,如果你只是獨立地測試你的應用,然后部署,并交給數十個并發用戶使用,就很有可能痛苦地遭遇原先未能檢測到的并發問題。例如,2個用戶同時修改某張訂單,首先他們會查詢這張訂單存在不存在,如果存在,那么修改它的狀態。在并發操作中,用戶1會很奇怪的發現他的修改丟失了。當然,除此之外,在未能夠很好的處理并發問題可能遭遇的情況還有:
◆破壞數據的完整性。
◆隨著用戶數的增多,應用的運行速度減慢。
◆不能很好地擴縮應用來支持大量用戶。
為解決這些問題。首先要引入的是ORACLE的鎖機制。數據庫使用鎖(lock)來保證任何給定時刻最多只有一個事務在修改給定的一段數據。實質上講,正是鎖機制才使并發控制成為可能。對ORACLE的鎖機制可以查看ORACLE官方文檔介紹。以下是對ORACLE鎖的一點總結。
Oracle只在修改時才對數據加行級鎖。正常情況下不會升級到塊級鎖或表級鎖(不過兩段提交期間的一段很短的時間內除外,這是一個不常見的操作)。
◆如果只是讀數據,Oracle絕不會對數據鎖定。不會因為簡單的讀操作在數據行上鎖定。
◆寫入器(writer)不會阻塞讀取器(reader)。換種說法:讀(read)不會被寫(write)阻塞。這一點幾乎與其他所有數據庫都不一樣。在其他數據庫中,讀往往會被寫阻塞。盡管聽上去這個特性似乎很不錯(一般情況下確實如此),但是,如果你沒有充分理解這個思想,而且想通過應用邏輯對應用施加完整性約束,就極有可能做得不對。
◆寫入器想寫某行數據,但另一個寫入器已經鎖定了這行數據,此時該寫入器才會被阻塞。讀取器絕對不會阻塞寫入器。
開發人員要盡可能的考慮以上因素。而且還要意識到這些事ORACLE獨有的。針對其他數據庫,在鎖的應用上略有不同。
以DB2為例
1.Oracle通過具有意向鎖的多粒度封鎖機制進行并發控制,保證數據的一致性。其DML鎖(數據鎖)分為兩個層次(粒度):即表級和行級。通常的DML操作在表級獲得的只是意向鎖(RS或RX),其真正的封鎖粒度還是在行級;DB2也是通過具有意向鎖的多粒度封鎖機制進行并發控制,保證數據的一致性。
其DML鎖(數據鎖)分為兩個層次(粒度):即表級和行級。通常的DML操作在表級獲得的只是意向鎖(IS,SIX或IX),其真正的封鎖粒度也是在行級;另外,在Oracle數據庫中,單純地讀數據(SELECT)并不加鎖,這些都提高了系統的并發程度,Oracle強調的是能夠“讀”到數據,并且能夠快速的進行數據讀取。而DB2的鎖強調的是“讀一致性”,進行讀數據(SELECT)時會根據不同的隔離級別(RR,RS,CS)而分別加S,IS,IS鎖,只有在使用UR隔離級別時才不加鎖。從而保證不同應用程序和用戶讀取的數據是一致的。
2. 在支持高并發度的同時,DB2和Oracle對鎖的操縱機制有所不同:Oracle利用意向鎖及數據行上加鎖標志位等設計技巧,減小了Oracle維護行級鎖的開銷,使其在數據庫并發控制方面有著一定的優勢。而DB2中對每個鎖會在鎖的內存(locklist)中申請分配一定字節的內存空間,具體是X鎖64字節內存,S鎖32字節內存(注:DB2 V8之前是X鎖72字節內存而S鎖36字節內存)。
3. Oracle數據庫中不存在鎖升級,而DB2數據庫中當數據庫表中行級鎖的使用超過locklist*maxlocks會發生鎖升級。
4. 在Oracle中當一個session對表進行insert,update,delete時候,另外一個session仍然可以從Orace回滾段或者還原表空間中讀取該表的前映象(before image); 而在DB2中當一個session對表進行insert,update,delete時候,另外一個session仍然在讀取該表數據時候會處于lock wait狀態,除非使用UR隔離級別可以讀取第一個session的未提交的值;所以Oracle同一時刻不同的session有讀不一致的現象,而DB2在同一時刻所有的session都是“讀一致”的。
posted @ 2009-11-28 17:50 斷點 閱讀(24) | 評論 (0)
今天在選擇一條記錄進行做刪除操作時,碰見index失敗的問題,如下:
處理失敗!錯誤信息:[SQLException ORA-01502 index VHL_V6.PK_WEB_APP_TGT_OBJ or partition of such index is in unusable state ]
在網上查詢了下,知道原因,就上數據庫查了一下,結果如下:
1 PK_WEB_APP_TGT_OBJ NORMAL VHL_V6 TABLE UNUSABLE。
顯然是UNUSABLE狀態,那也就知道原因了,呵呵,解決!
以下為參考文件:
SQL> create table t(a number);
Table created.
1、現在,我們建立一個唯一索引來看看:
SQL> create unique index idx_t on t(a);
Index created.
SQL> select index_name,index_type,tablespace_name,table_type,status from user_indexes where index_name='T';
no rows selected
SQL> select index_name,index_type,tablespace_name,table_type,status from user_indexes where index_name='IDX_T';
INDEX_NAME INDEX_TYPE TABLESPACE_NAME TABLE_TYPE STATUS
------------------------------ --------------------------- ------------------------------ ----------- --------
IDX_T NORMAL DATA_DYNAMIC TABLE VALID
SQL> insert into t values(1);
1 row created.
SQL> commit;
Commit complete.
2、將索引手工修改為unusable狀態(模擬發生索引失效的情況):
SQL> alter index idx_t unusable;
Index altered.
SQL> select index_name,index_type,tablespace_name,table_type,status from user_indexes where index_name='IDX_T';
INDEX_NAME INDEX_TYPE TABLESPACE_NAME TABLE_TYPE STATUS
------------------------------ --------------------------- ------------------------------ ----------- --------
IDX_T NORMAL DATA_DYNAMIC TABLE UNUSABLE
我們看到這是,已經不能正常往表中插入數據:
SQL> insert into t values(2);
insert into t values(2)
*
ERROR at line 1:
ORA-01502: index 'MISC.IDX_T' or partition of sUCh index is in unusable state
3、首先,我們通過重建索引(rebuild index)的方法來解決問題:
SQL> alter index idx_t rebuild;
Index altered.
SQL> select index_name,index_type,tablespace_name,table_type,status from user_indexes where index_name='IDX_T';
INDEX_NAME INDEX_TYPE TABLESPACE_NAME TABLE_TYPE STATUS
------------------------------ --------------------------- ------------------------------ ----------- --------
IDX_T NORMAL DATA_DYNAMIC TABLE VALID
SQL> insert into t values(2);
1 row created.
SQL> commit;
Commit complete.
SQL>
4、現在我們再次模擬索引失效(unusable狀態):
SQL> alter index idx_t unusable;
Index altered.
SQL> select index_name,index_type,tablespace_name,table_type,status from user_indexes where index_name='IDX_T';
INDEX_NAME INDEX_TYPE TABLESPACE_NAME TABLE_TYPE STATUS
------------------------------ --------------------------- ------------------------------ ----------- --------
IDX_T NORMAL DATA_DYNAMIC TABLE UNUSABLE
SQL> insert into t values(3);
insert into t values(3)
*
ERROR at line 1:
ORA-01502: index 'MISC.IDX_T' or partition of such index is in unusable state
5、然后,看看是否可以通過設置參數skip_unusable_indexes=true來解決問題:
SQL> alter session set skip_unusable_indexes=true;
Session altered.
SQL> insert into t values(3);
insert into t values(3)
*
ERROR at line 1:
ORA-01502: index 'MISC.IDX_T' or partition of such index is in unusable state
SQL> select index_name,index_type,tablespace_name,table_type,status from user_indexes where index_name='IDX_T';
INDEX_NAME INDEX_TYPE TABLESPACE_NAME TABLE_TYPE STATUS
------------------------------ --------------------------- ------------------------------ ----------- --------
IDX_T NORMAL DATA_DYNAMIC TABLE UNUSABLE
SQL> alter index idx_t rebuild;
Index altered.
SQL> select index_name,index_type,tablespace_name,table_type,status from user_indexes where index_name='IDX_T';
INDEX_NAME INDEX_TYPE TABLESPACE_NAME TABLE_TYPE STATUS
------------------------------ --------------------------- ------------------------------ ----------- --------
IDX_T NORMAL DATA_DYNAMIC TABLE VALID
SQL> insert into t values(3);
1 row created.
SQL> commit;
Commit complete.
SQL>
總結:對于unique index,通過簡單的設置參數是不能解決問題的,要解決unique index 失效的問題,只能通過重建索引來實現。
資料引用:http://www.knowsky.com/388811.html
posted @ 2009-09-26 21:36 斷點 閱讀(80) | 評論 (0)
1、用戶
查看當前用戶的缺省表空間:SQL>select username,default_tablespace from user_users;
查看當前用戶的角色:SQL>select * from user_role_privs;
查看當前用戶的系統權限和表級權限
SQL>select * from user_sys_privs;
SQL>select * from user_tab_privs;
顯示當前會話所具有的權限:SQL>select * from session_privs;
顯示指定用戶所具有的系統權限:SQL>select * from dba_sys_privs where grantee='GAME';
顯示特權用戶:select * from v$pwfile_users;
顯示用戶信息(所屬表空間)
select default_tablespace,temporary_tablespace
from dba_users where username='GAME';
顯示用戶的PROFILE :select profile from dba_users where username='GAME';
2、表
查看用戶下所有的表 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;
3、索引
查看索引個數和類別
SQL>select index_name,index_type,table_name from user_indexes order by table_name;
查看索引被索引的字段
SQL>select * from user_ind_columns where index_name=upper('&index_name');
查看索引的大小
SQL>select sum(bytes)/(1024*1024) as "size(M)" from user_segments
where segment_name=upper('&index_name');
4、序列號
查看序列號,last_number是當前值
SQL>select * from user_sequences;
5、視圖
查看視圖的名稱 SQL>select view_name from user_views;
查看創建視圖的select語句
SQL>set view_name,text_length from user_views;
SQL>set long 2000; 說明:可以根據視圖的text_length值設定set long 的大小
SQL>select text from user_views where view_name=upper('&view_name');
6、同義詞
查看同義詞的名稱
SQL>select * from user_synonyms;
7、約束條件
查看某表的約束條件
SQL>select constraint_name, constraint_type,search_condition, r_constraint_name
from user_constraints where table_name = upper('&table_name');
SQL>select c.constraint_name,c.constraint_type,cc.column_name
from user_constraints c,user_cons_columns cc
where c.owner = upper('&table_owner') and c.table_name = upper('&table_name')
and c.owner = cc.owner and c.constraint_name = cc.constraint_name
order by cc.position;
8、存儲函數和過程
查看函數和過程的狀態
SQL>select object_name,status from user_objects where object_type='FUNCTION';
SQL>select object_name,status from user_objects where object_type='PROCEDURE';
查看函數和過程的源代碼
SQL>select text from all_source where owner=user and name=upper('&plsql_name');
轉載:http://www.javaeye.com/topic/264639
posted @ 2009-09-14 17:29 斷點 閱讀(28) | 評論 (0)
最近看C語言的程序,程序里面帶有sql語句,其中就有這么一句:
EXEC SQL select upper(nvl(c_grant_dpt_cde,'0')),nvl(C_CTCT_CDE,'0') into :sGrantCde,:sCtctCde from t_department where c_dpt_cde = :sDptCde;
if (sqlca.sqlcode!=0) {
printf("[ppPlyNewCountPrm]ERROR:sqlca.sqlerrmc = %s\n", sqlca.sqlerrm.sqlerrmc);
return(SetUserError(lpInBuffer,2,"取機構部門歸屬錯誤!"));
}
不明白 sqlca.sqlcode = 0 是什么意思,搜了搜,記錄一下sqlca.sqlcode的各種取值的意義:
0 ——最近一次sql語句執行成功
-1 ——最近一次sql語句執行失敗
100 ——最近一次sql語句沒有返回數據
posted @ 2009-09-10 19:59 斷點 閱讀(129) | 評論 (0)
|