2013年6月26日

< s:iterator

如果要跑回圈的資料來源是一個list包著map

需要多一層<s:iterator

範例:
<s:iterator value="#request['immaplist']" status="stat">
  <s:iterator>
   <s:property value="#stat.index"/>
    <s:property value="key"/>
    <s:property value="value"/>
  </s:iterator>
 </s:iterator>

2013年6月20日

< s:fielderror 五四三

標準寫法(我最常用的):
<s:fielderror theme="myThem" cssClass="error-message" fieldName="email" />

 cssClass="error-message" ←←自己設的css

忘了為了什麼目的的寫法:
<s:fielderror  cssClass="error-message"><s:param>email</s:param> </s:fielderror>

無效寫法:
<s:fielderror value="startYear.val" />


判斷是不是有fielderror:
<s:if test="hasFieldErrors()">  有錯誤訊息!!</s:if>


2013年6月7日

字串從右邊算來取N位

substr(dept.name ,-N)

查詢各表 總筆數(總列數) 使用量(大小)

SELECT USER_TABLES.TABLE_NAME ,num_rows 列數 ,
SUM(BYTES) / (1024 * 1024) AS "size(M)"
FROM USER_TABLES,
USER_SEGMENTS WHERE USER_SEGMENTS.SEGMENT_NAME = USER_TABLES.TABLE_NAME
GROUP BY USER_TABLES.TABLE_NAME,num_rows
ORDER BY "size(M)" DESC

SQL Developer 不能enter 不能ctrl c v



Tools→Preferences→Accelerators→Load Preset button


資料來源:https://forums.oracle.com/forums/thread.jspa?threadID=692894

 Select Tools, Preferences, Accelerators and hit the Load Preset button. This rests them to default. It's less drastic than deleting the system folder.

oracle的亂數


select substr(to_char(dbms_random.value),5,5)rnd  from xx  --只有數字
SELECT ABS(dbms_random.normal)  from xx  --只有數字
SELECT (1+ABS(MOD(dbms_random.random,100000))) from xx   --只有數字


dbms_random.string(opt IN CHAR, len IN NUMBER) --RETURN VARCHAR2;
opt seed values:
'a','A'  alpha characters only (mixed case) ←只有字母
'l','L'  lower case alpha characters only
'p','P'  any printable characters ←有符號
'u','U'  upper case alpha characters only
'x','X'  any alpha-numeric characters (upper) ←字母和數字

SELECT dbms_random.string('A', 5) RNDMSTR from  xx   --只有字母

SELECT dbms_random.value(2, 5)RNDMSTR from xx --亂數區間2~5

2013年6月5日

ORA-12528


資料來源:http://blog.sina.com.cn/s/blog_636415010100x3lc.html

ORA-12528: TNS:listener: all appropriate instances are blocking new connections
    ORA-12528問題是因為監聽中的服務使用了動態服務,實例雖然啟動,但沒有註冊到監聽。實例是通過PMON進程註冊到監聽上的,而PMON進程需要在MOUNT狀態下才會啟動。所以造成了上面的錯誤。
    解決這個問題,有三種方法:1、把監聽設置為靜態,2、在tnsnames.ora中追加(UR=A),3、重新啟動服務。

    一、通過修改listener.ora的參數,把動態的參數設置為靜態的參數,然後從新啟動監聽# listener.ora Network Configuration File: $ORACLE_HOME\network\admin\listener.ora
# Generated by Oracle configuration tools.
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = [IP])(PORT = 1521))
    )
  )
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = [DBNAME])
      (ORACLE_HOME = [$ORACLE_HOME])
      (SID_NAME = [SID])
    )
  )
    靜態註冊的風險:如果在instance運行中,lisener重新啟動,就找不到instance了。靜態註冊需要先啟動lisener,再啟動instance。且靜態模式下,lisener status顯示的是unknown
    二、啟動到nomount狀態,通過修改tnsnames.ora的參數# tnsnames.ora Network Configuration File: $ORACLE_HOME\network\admin\tnsnames.ora
# Generated by Oracle configuration tools.
SYK =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = [IP])(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = SYK)
      (UR=A)    )
  )
    然後連接上數據庫
    SQL>alter database mount;
    SQL>alter database open;
    三、重啟ORACLE或者重啟ORACLE服務

找出一年內資料

SELECT * FROM XX WHERE stime> add_months(SYSDATE, -12)

匯入/匯出資料庫

匯入資料庫
imp username/password@sid
匯出資料庫
EXP username/password@sid file=c:\DB\OOO\ZZZ.DMP log=c:\DB\OOO\ZZZ.log
(sid xe)

exp 不要匯出資料 rows=no

 ↓↓忘了是什麼用法= = exp username/password@sid   FILE=/prod2/dbwork/expdata/EXP_A6417K01_H1.dmp tables=A6417K01
QUERY=\"where SYSDAT \< \'20090930235959\' and K1DEAL \<> \'1\'\"
log=/prod2/dbwork/expdata/EXP_A6417K01_S1.log ROWS=y GRANTS=y

ORACLE:ORA-01940 無法刪除使用者


解決辦法:
1.找出卡在線上的 SESSION ,請用有管理權限之帳號(我是用SYSTEM 做的 , 對 ORACLE DB 有點小小不熟,對權限控管的定義還不是很清楚) ,在可操作 ORACLE 的工具上\執行以下t T-SQL
select username,sid,serial# from v$session where username='USER_NAME';
2.可查出如以下列表資料
USERNAME   
SID
SERIAL#
USER_NAME
37
41363
USER_NAME
47
25604
USER_NAME
158
14321


3.把 SESSION 踢掉 , 請用以下 T-SQL  (SID=37 ,SERIAL=41363), 全部 踢完就可以去刪資料庫了
alter system kill session'37,41363';
資料來源:
http://www.google.com/url?q=http%3A%2F%2Fjason0324.pixnet.net%2Fblog%2Fpost%2F37310500&sa=D&sntz=1&usg=AFQjCNGGYJgZoiQ7KWKq38IcdiFp46r3-w

ORA-01536: 表格空間 xxx 已超過空間配額

解決辦法
ALTER USER <username> QUOTA UNLIMITED ON <tablespace name>

oracle要刪session

select t2.username,t2.sid,t2.serial#,t2.logon_time
from v$locked_object t1,v$session t2
where t1.session_id=t2.sid order by t2.logon_time

select sql_text from v$session a,v$sqltext_with_newlines b
 where DECODE(a.sql_hash_value, 0, prev_hash_value, sql_hash_value)=b.hash_value
 and a.sid ='245' order by piece

 alter system kill session '235,714'

先定義子查詢

WITH XX AS (子查詢)

然後就可以對XX處理



with a as
  (
  select * from member,
  (
  SELECT name,org_id,COUNT(*)
  FROM member
  GROUP BY name,org_id
  HAVING COUNT(*) &gt; 1
  )t
  where member.name=t.name
  and member.org_id=t.org_id
  )

select id from a
WHERE a.id!=(select max(id)from a)

Oracle密碼忘記怎麼辦

以下都是查到的方法

有兩種方法

一、ALTER USER (USERNAME) IDENTIFIED BY 「密碼」
二、CREATE USER (USERNAME) IDENTIFIED BY "密碼";。


1.在 CMD下
 SQLPLUS /NOLOG

2.
 CONN /AS SYSDBA


  ALTER USER (USERNAME) IDENTIFIED BY 「密碼」;

( 可以改變USERNAME的密碼)

另一種是:

CREATE USER (USERNAME) IDENTIFIED BY "密碼";


PS 改變用戶權限的命令是:

GRANT ROLES TO (USERNAME);

判斷DB欄位非數字

先作一個Function:
FUNCTION IS_NUMBER (p_str IN VARCHAR2)
RETURN INTEGER
IS
v_num NUMBER;
BEGIN
v_num := TO_NUMBER (p_str);
RETURN 1;
EXCEPTION
WHEN OTHERS
THEN
RETURN 0;
END;

可以用了:
select * from your_table where is_number(your_field)=0

ORACLE的保留字

ACCESS DECIMAL INITIAL ON START ADD NOT INSERT ONLINE SUCCESSFUL ALL DEFAULT INTEGER OPTION SYNONYM ALTER DELETE INTERSECT OR SYSDATE AND DESC INTO ORDER TABLE ANY DISTINCT IS PCTFREE THEN AS DROP LEVEL PRIOR TO ASC ELSE LIKE PRIVILEGES TRIGGER AUDIT EXCLUSIVE LOCK PUBLIC UID BETWEEN EXISTS LONG RAW UNION BY FILE MAXEXTENTS RENAME UNIQUE FROM FLOAT MINUS RESOURCE UPDATE CHAR FOR MLSLABEL REVOKE USER CHECK SHARE MODE ROW VALIDATE CLUSTER GRANT MODIFY ROWID VALUES COLUMN GROUP NOAUDIT ROWNUM VARCHAR COMMENT HAVING NOCOMPRESS ROWS VARCHAR2 COMPRESS IDENTIFIED NOWAIT SELECT VIEW CONNECT IMMEDIATE NULL SESSION WHENEVER CREATE IN NUMBER SET WHERE CURRENT INCREMENT OF SIZE WITH DATE INDEX OFFLINE SMALLINT CHAR VARHCAR VARCHAR2 NUMBER DATE LONG CLOB BLOB BFILE INTEGER DECIMAL SUM COUNT GROUPING AVERAGE TYPE

無條件進位/ 無條件捨去/四捨五入

CEIL(n) 無條件進位的整數
SELECT ceil(3.12) FROM DUAL; 執行結果:4

FLOOR(n)   無條件捨去的整數
SELECT floor(3.6) FROM DUAL; 執行結果:3

ROUND (m[,n]) m四捨五入,取到小數點第n位[n default=0]
SELECT round(3.16,1) FROM DUAL; 執行結果:3.2

找出重覆的資料

SELECT f1,COUNT(*)/*重複出現的次數*/ FROM tabl1 GROUP BY f1 HAVING COUNT(*) > 1

取得所有table名稱(非系統預設table)

select table_name from user_tables

手動insert資料需要sequence

INSERT INTO MarsTest (ID_, Content)
VALUES (Seq_MarsTest.NEXTVAL, 'MarsTest');


這也表示說Sequence 不只是提供給特定 Table 使用,也能給其他任一個 Table 共用。

隨機亂數取得資料

Select *
From ( Select *
?????? From 表格名稱
?????? Order By dbms_random.random )
Where Rownum <= 10;

顯示 < 10 > 5資料

SELECT * FROM (SELECT ROWNUMAS rn, FORT.* FROM FORT  WHERE <10 ORDER BY ID) WHERE rn > 5 ORDER BY  ID
--顯示 ID 11 12 13 15資料

ORACLE 中ROWNUM用法總結!(精華)
bbs.linuxpk.com/thread-10595-1-1.html

ROWNUM 是一個序列,是oracle數據庫從數據文件或緩衝區中讀取數據的順序。它取得第一條記錄則rownum值為1,第二條為2,依次類推。如果 你用>,>=,=,between...and這些條件,因為從緩衝區或數據文件中得到的第一條記錄的rownum為1,則被刪除,接著取下 條,可是它的rownum還是1,又被刪除,依次類推,便沒有了數據。

有了以上從不同方面建立起來的對 rownum 的概念,那我們可以來認識使用 rownum 的幾種現像

1. select rownum,c1 from t1 where rownum != 10 為何是返回前9條數據呢?它與 select rownum,c1 from tablename where rownum < 10 返回的結果集是一樣的呢?
因 為是在查詢到結果集後,顯示完第 9 條記錄後,之後的記錄也都是 != 10,或者 >=10,所以只顯示前面9條記錄。也可以這樣理解,rownum 為9後的記錄的 rownum為10,因條件為 !=10,所以去掉,其後記錄補上,rownum又是10,也去掉,如果下去也就只會顯示前面9條記錄了

2. 為什麼 rownum >1 時查不到一條記錄,而 rownum >0 或 rownum >=1 卻總顯示所以的記錄
因為 rownum 是在查詢到的結果集後加上去的,它總是從1開始

3. 為什麼 between 1 and 10 或者 between 0 and 10 能查到結果,而用 between 2 and 10 卻得不到結果
原因同上一樣,因為 rownum 總是從 1 開始

從上可以看出,任何時候想把 rownum = 1 這條記錄拋棄是不對的,它在結果集中是不可或缺的,少了rownum=1 就像空中樓閣一般不能存在,所以你的 rownum 條件要包含到 1

但如果就是想要用 rownum > 10 這種條件的話話就要用嵌套語句,把 rownum 先生成,然後對他進行查詢。
select *
from (selet rownum as rn,t1.* from a where ...)
where rn >10


SQL>select * from(select rownum no ,id,name from student) where no>2;
        NO ID     NAME
---------- ------ ---------------------------------------------------
         3 200003 李三
         4 200004 趙四

(+) outer join

DECODE

DECODE(欄位,xx,oo,**)
如果欄位=xx 會變oo
預設欄位=**

DECODE(cen.Rate,null,'0',cen.Rate)


decode(條件,值1,翻譯值1,值2,翻譯值2,...值n,翻譯值n,缺省值)
該函數的含義如下:
IF 條件=值1 THEN
RETURN(翻譯值1)
ELSIF 條件=值2 THEN
RETURN(翻譯值2)
......
ELSIF 條件=值n THEN
RETURN(翻譯值n)
ELSE
RETURN(缺省值)
END IF

· 使用方法:
1、比較大小
select decode(sign(變量1-變量2),-1,變量1,變量2) from dual; --取較小值
sign()函數根據某個值是0、正數還是負數,分別返回0、1、-1
例如:
變量1=10,變量2=20
則sign(變量1-變量2)返回-1,decode解碼結果為「變量1」,達到了取較小值的目的。

2、表、視圖結構轉化
現有一個商品銷售表sale,表結構為:
month    char(6)      --月份
sell    number(10,2)   --月銷售金額

現有數據為:
200001  1000
200002  1100
200003  1200
200004  1300
200005  1400
200006  1500
200007  1600
200101  1100
200202  1200
200301  1300
想要轉化為以下結構的數據:
year   char(4)      --年份
month1  number(10,2)   --1月銷售金額
month2  number(10,2)   --2月銷售金額
month3  number(10,2)   --3月銷售金額
month4  number(10,2)   --4月銷售金額
month5  number(10,2)   --5月銷售金額
month6  number(10,2)   --6月銷售金額
month7  number(10,2)   --7月銷售金額
month8  number(10,2)   --8月銷售金額
month9  number(10,2)   --9月銷售金額
month10  number(10,2)   --10月銷售金額
month11  number(10,2)   --11月銷售金額
month12  number(10,2)   --12月銷售金額

結構轉化的SQL語句為:
create or replace view
v_sale(year,month1,month2,month3,month4,month5,month6,month7,month8,month9,month10,month11,month12)
as
select
substrb(month,1,4),
sum(decode(substrb(month,5,2),'01',sell,0)),
sum(decode(substrb(month,5,2),'02',sell,0)),
sum(decode(substrb(month,5,2),'03',sell,0)),
sum(decode(substrb(month,5,2),'04',sell,0)),

如何用SQL insert 語句插入一「日期/時間」的值

insert   into   tablename   (datetime)   values   (to_date('2001-12-05','YYYY-MM-DD'));  

NVL :轉換 Null 值函數

NVL(expr1, expr2) 拿expr1來判斷,是null就用expr2取代
NVL2(expr1, expr2, expr3) 拿expr1判斷,不是null填expr2,是null填expr3
NULLIF(expr1, expr2) 如果expr1=expr2就塞null,不相等就填expr1
COALESCE (expr1, expr2,…,exprn) 從expr1開始找,不是null就回傳

顯示的時間格式

alter session set nls_date_format = 'yyyy/mm/dd hh24:mi:ss'

網站ICON



<link rel="shortcut icon" href="favicon.ico" type="image/x-icon" />

↑↑要放在<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="EN" lang="EN" dir="ltr">前

A4大小

A4紙:pageWith=”595” pageHeight=”842”   單位PX

Java預設每英吋72點

@SkipValidation

@SkipValidation用來放在不要驗證的方法前

用javascript驗證

<!--用javascript驗證 >
 <s:if test="hasFieldErrors()">
  <script language="JavaScript">
   var msg = 'xxxxx';
   alert(msg);
  </script>
 </s:if>
<用javascript驗證  -->

< s:fielderror

直覺上可能會寫成:

<s:fielderror value="startYear.val" />

但這樣是無效的

有效寫法是:
<s:fielderror  cssClass="error-message"><s:param>startYear</s:param> </s:fielderror>

@InputConfig

@InputConfig(methodName="inputMethod", resultName="someInputResultName") methodName 

resultName 可分開用
methodName:指定要去run哪一個method
resultName:對應struts裡的result

同時都有 會以methodName為主

< s: TAG裡 的theme

theme=xhtml時:會默認額外生成tr,td。
them=simple時:就生成標籤所對應的html標籤形式。

< s:property 的換行

平常寫法是
<s:property value="memo.note"/>
但發現 如果裡面文字本身有換行時  用這方式 他不會換行 !!!!