###### tags: `oracle`
# Oracle 雜記
最近更新日期20201101
取出表單最大值+1
```sql=
(SELECT NVL(MAX(UNIQUEID),0)+1 FROM TABLENAME)
```
INSERT 語法:
```sql=
INSERT INTO TABLENAME (CLNNUM1,CLNTXT2) VALUES (11,'TEXT')
/* 複製另外資料庫的相同架構資料表*/
INSERT INTO TABLENAME VALUE (SELECT* FROM TABLENAME@DB2 WHERE 1=1)
```
SELECT語法(列出部分欄位及全部爛位,列出前N筆資料)
```sql=
SELECT T1.NAME,T1.* FROM TABLENAME T1
--列出前N筆資料,並排序
SELECT ROWNUM, t.* FROM (
SELECT * FROM table_name ORDER BY column_name
) t WHERE ROWNUM < 10;
```
DELETE 資料、TRUNCATE、DROP語法
```sql=
DELETE FROM TABLENAME /*刪除資料表內所有資料(慎用)*/
TRUNCATE TABLE TABLENAME /* 截斷資料表 */
DROP TABLE TABLENAME /* 刪除資料表 */
```
CASE語法:
```sql=
SELECT T.ACCOUNTID, T.ATD_PW, T.ATD_TYPE,
CASE
WHEN TO_CHAR(T.ATD_TIME,'HH24MI')>='2259' AND ATD_TYPE='B'
THEN TO_DATE((TO_CHAR(T.ATD_TIME,'YYYYMMDD')||' 22:59:00'),'YYYYMMDD HH24:MI:SS')
WHEN XXXX THEN XXX
ELSE T.ATD_TIME
END AS ATD_TIME
FROM FLOW.HR_ATD T
WHERE UNIQUEID =123
```
EXISTS用法:
```sql=
SELECT * FROM T1 WHERE EXISTS (SELECT NULL FROM T2 WHERE T2.Y=T1.X)
```
取字串語法:
SUBSTR(DEPT_ID,2,1) 從該欄位的第二個字元開始,取出1個字元
```sql=
SELECT ACCOUNT_ID,DEPT_ID,SUBSTR(DEPT_ID,2,1) AS SITE FROM MEMBERS
```
**比對相同資料表語法** 20201101
```sql=
--MINUS,去掉上方與下方相同資料後印出結果,如下:
/* 經測試B有的,A沒有的資料,不會列出。只會列出A有的與B不同的資料
若要列出B有的,A沒有的,要用下方UNION方式
*/
SELECT COLUMN1,COLUMN2
FROM TABLE_A
MINUS
SELECT COLUMN1,COLUMN2
FROM TABLE_B
--將兩個資料表,只要有差異就列出來,那可以再加入一個語法UNION
SELECT 'A' SOURCE,COLUMN1,COLUMN2
FROM TABLE_A
MINUS
SELECT 'A' SOURCE,COLUMN1,COLUMN2
FROM TABLE_B
UNION
SELECT 'B' SOURCE,COLUMN1,COLUMN2
FROM TABLE_B
MINUS
SELECT 'B' SOURCE,COLUMN1,COLUMN2
FROM TABLE_A
```
參考:[Oracle MINUS比較兩個資料表的資料](https://mika.i234.me/wordpress/2020/04/26/oracle-minus%E6%AF%94%E8%BC%83%E5%85%A9%E5%80%8B%E8%B3%87%E6%96%99%E8%A1%A8%E7%9A%84%E8%B3%87%E6%96%99/)
**查詢 oracle server端使用的字碼**
```sql=
select userenv('language') from dual;
```
#### 監聽器的啟動和關閉
查狀態:lsnrctl status 啟動:lsnrctl start 停止:lsnrctl stop 重新啟動:lsnrctl reload
S20200528 By YTC
M20200908
M20201101 加入minus比較兩個資料表的資料