最近利用業余時間一直在看Oracle g開發這方面資料 由於以前企業級項目對數據庫操作都是基於微軟的SQL與 版本偏多 所以這段時間也是一個轉換過程特意在網上訂購一本Oracle Database G SQL Master SQL and PL/SQL 這本書重新完整的 系統的進行梳理一遍總體給我感覺是其實我就是在重新梳理結構化查詢語言(Structured Query Language/SQL) SQL 雖然做了一遍重復性工作 但體會也是不同的 類似這本書並沒有費了我很大精力 但給我感覺它就是一條細線 把我以前遺留的片段全部關聯起來 視野上更加趨於開闊我慢慢才體會到 做程序開發的工作其實可粗可細 我們常常感慨一個技術大牛所作的創造性思維(類似Robert CMartin關於敏捷實踐) 其實殊不知他們也是在逐漸積累過程中才有了創造 就想一句話說的沒有任何事情是憑空而來那麼對於一個做技術出生的人一個完善的知識體系結構是相當重要的 所以我更願意傾向於一個科班出生的技術人員 目前情況是社會上關於軟件開發培訓的快餐打亂了行業內這種格局 格局我們沒法控制 無論這種格局亂還是沒亂但歸咎到底還是一個技術人員在實際工作自我完善自己知識體系這種能力和意識 對於他人的指導這種外力的鞭子抽的我們都有惰性 自覺的意識才能真正力量 這種並非一朝一夕的能夠成就的 它是一個長時間 同時具有一定量積累才能沉澱出來的 只有不斷完善自己知識體系 不斷學習才是一個真正技術人員發展上要走長遠子路 這也是我考察一個技術人員非常重要的標准
這也是很多經歷了入門級別痛苦後程序員 最為迷茫一個問題 以上最近這本書給我一點聯想 轉入正題
Oracle Database G SQL Master SQL and PL/SQL :書樣 隨便推薦給各位 內容雖然很簡單 但給我感覺細節上講的很全面 完全可以做為一個日常工作中查詢手冊也是沒有問題的一方面它詳細而通用講述了SQL標准每個細節 同時也有兩章是Oracle公司自己擴展語法詳細講解直接形成比對及時將來遇到與SQL標准不同變更 一眼就能看出來
(A)SQL標准與三層
又重新翻看這個結構化查詢語言(簡稱SQL)的來世於前生後期間不經讓我聯想到到以前項目中對於底層數據訪問層三層架構思想 他們之間聯系 先來看看SQL標准來歷:
年時有EFCold博士提出關系型數據庫這個概率 聽起來早就不新鮮了但是SQL就是在EFCold博士工作基礎自上發展而來 其第一個實現就是有IBM在世紀年代中期開發的當時IBM開展了一個成為System R的研究項目SQL 就是從這項目中誕生的 到了年底一家當時成為Relational Software INc的公司(其實大家應該都知道就是現在Oracle公司)發布了第一個商業版本的SQL 隨著發展SQL已經被完全標准化了而且獲得美國國家標准組織(American Standards Institute ANSI)認證SQL可以用來訪問Oracle SQL Server DB和MySQL 數據庫直至發展到現在
SQL在發展的實現標准化也為三層分工實現編碼與數據庫依賴關系解耦 編程語言不在依賴數據庫 主要歸功於SQL訪問數據庫的標准化 目前架設一下主流的數據Oracle SqlServer DBMySQL每個都有自己一套數據庫訪問方式規則 那是多麼可怕一件事當切換一個數據庫 我們就徹底扔掉了一個數據訪問層 那麼編碼應用程序就死死綁定數據庫上而從嚴格三層定義來說 拿掉任何一層都是可以重用 顯示層 業務邏輯層 與數據訪問層是沒有任何實際依賴的 層於層之間實現時一種獨立關系 如果沒有SQL語言標准化也就沒有實際意義上三層分工實現 現在項目中如果實現底層數據庫切換可以做一個簡單工廠模式 只需在修改簡單配置 代價極小 如果沒有SQL 這一切就無從談起了
(B)附Oracle G中關於表操作
附Oracle G下編碼: 內有詳細說明其中操作非常簡單 不做贅述 對於其他一些關於Oracle G特有屬性將在後續後有詳細說明
代碼
———————創建數據庫表成功—————————–
——–ChaRu數據操作詳細SQL記錄–
——–Author:chenkai Date:年月日::–
–oracle中顯示日期格式為:DDMONYY dd是代表日 mon是月份前三個字母大寫yy 年份最後兩位實際上存儲年是位 顯示的為位
select * from customers
insert into customers(customer_idfirst_namelast_namephone)
values(chenkaige′);
insert into customers(customer_idfirst_namelast_namephone)
values(marik陳凱′);
update customers set first_name=chenkaiunion where customer_id=
delete from customers where customer_id=
–如果誤刪除了數據庫記錄 可以回滾數據
rollback;
insert into customers(customer_id first_name last_namephone)
values(再次ChaRu數據fuck Again′)
–ChaRu數據進行單引號和雙引號
insert into customers(customer_id first_namelast_name)
values( 測試單引號BeiJing單引成功了)
insert into customers(customer_id first_namelast_name)
values( 測試雙引號The Great Wall LED)
select * from customers
–從一個表向另一個表復制行 (快速的植入數據注意修改了主鍵為) 能用select union 測試不成功 可以使用 i新增的merge語句來快速轉移
insert into customers(customer_idfirst_namelast_name)
select first_namelast_name from customers where customer_id=
–使用merger來合並行數據 Oracle i版本引入了Merge關鍵之來合並數據
–可以用來將一個表的行合並到另一個表中(如果在轉換中需要處理等等 在合並數據)
create table product_change
(
product_id integer constraint change_pk primary key
product_typeid integer constraint product_type_fkid references product_type(product_id)
name varchar() not null
description varchar()
price number()
);
–需求是這樣:對於Product 和product_change兩個表中product_id相同的行將Product中各列裡值修改成Product_change對應的值 如果product_id存在
–並匹配 進行更新修改 如果不存在則在Product表ChaRu記錄數據 即可 使用merge來操作
merge into products pro
using product_change pc on(
proproduct_id=pcproduct_id
)
–當匹配時修改
when matched then
update set
proproduct_typeid=pcproduct_typeid
proproduct_name=pcname
proproduct_content=pcdescription
proproduct_price=pcprice
–當不匹配是 ChaRu數據
when not matched then
insert(proproductidproproduct_typeidproproduct_nameproproduct_contentproproduct_price)
values
(
pcproduct_id
pcproduct_typeid
pcname
pcdescription
pcprice
);
–操作完成
–merger into 子句指明了合並操作的目標表(要合並到的表) 命名成一個別名 pro 下面都用這個來替代
–using on子句指定了一個表連接 上面指定的Product表中Product——id和Product——change表中Product_id建立連接
–when matched then 當一行數據滿足了Using…on條件時執行操作 同理而言下面操作
–使用update語句修改行
–定義一個變量
variable average_product_prices number
update products set price=prices* returning avg(price) into:average_product_prices;
–使用默認值 測試成功
create table userdefaultdemo
(
demo_id integer constraint demo_pk primary key
datestatus varchar() default no placed its take not null
last_modifieddate date default sysdate not null
);
drop table userdefaultdemo
insert into userdefaultdemo(demo_id)
values()
–在更新或ChaRu數據使用Default關鍵字來設置修改列的值
update userdefaultdemo
set datestatus=default where demo_id=
select * from userdefaultdemo
–Oracle g中創建指定用戶並連接數據到數據庫
–默認在chendb數據庫中創建一個用戶
create user testuser identified by testpass;
–testuser為創建用戶用戶名
–testpass為創建用戶登錄密碼
–對用戶授權限
–登錄數據庫 connect權限 創建類似一些諸如表結構的數據 resource權限 權限由特權用戶(例如DBA)使用Grant語句授予的
grant connectresource to testuser;
–to 指定為授權的用戶
–新用戶連接數據庫chendb
connect testuser/testpass–有語法錯誤
–新用戶創建表(完整的簡化版本的創建表語法)
create [global temporary] table table_name
(
colum_name type [constraint constraint_def default default_exp]
)
[on commit {delete | preserve} rows]–控制臨時表的有效期 delete說明這些行在事務的末尾就要被刪除 preserve說明要在會話末尾刪除這些行 默認值為Delete
tablespace tab_space;–設定數據庫占用空間大小
–global temporary 指定說明當前表的行都是臨時的 稱之為臨時表 臨時表對當前所有會話都是可見的但是這些行只是特定於某個會話
–在Oracle官方上真正完整語法遠遠比這個要復雜 簡化只是常用的設置 以上述語法創建表
create table order_status
(
id integer constraint order_status_pk primary key
status varchar()
last_modified date default sysdate
);
–下面創建一個臨時表
create global temporary table test_orderstatus
(
id integer constraint order_statustest_pk primary key
status varchar()
last_modifieddate date default sysdate
)
on commit preserve rows;–只針對臨時表設置當會話結束就刪除臨時表行數據(Oracle會話如何定義?)
–向臨時表ChaRu數據
insert into test_orderstatus(idstatus)
values(chenkaiunion 測試臨時表數據)
select * from test_orderstatus
–當我們斷開當前測試用戶Testuser 關於數據庫chendb連接時 會話就消失 那麼關於這個臨時表自動被刪除
disconnect –斷開
connect testuser/testpass–再次連接查看臨時表是否存在
select * from test_orderstatus
–獲得關於表自身一些信息
–查詢上面剛剛創建兩個表
select table_nametablespace_nametemporary from user_tables
where table_name in (order_statustest_orderstatus)
–上述查詢時一個系統字典表user_tables[其中列 table_name 表名 tablespace_name存儲該表的表空間(數據庫用來存儲諸如表子類對象的地方)名 ]
–[temporary 說明該表是否是臨時表 如果是則Y 不是則為N]
select * from user_tables
–獲取表中列的信息
–從user_tab_colums中獲取
select table_name column_namedata_typedata_lengthdata_precisiondata_scale from user_tab_columns where table_name=CHENTEST –[表名為全大寫]
–對User_tab_colums系統字典表中 Data_precision【如果為數字列指定了精度 該列就是查詢出精度】 datascale【數字列小數部分的位數】
–修改表信息
–alert table 主要用於 添加/刪除/修改列
–添加/刪除 約束
–啟用禁用約束
–查看對表或列建立的約束信息
–添加列
alter table test_orderstatus add operator_name varchar();–報錯【試圖訪問已經交由事務處理的臨時表】 臨時表不能別修改
alter table order_status add operator_name varchar();
select * from order_status–成功
–修改列【列長度/ 但前提是該列的長度是可以修改的例如 char/Varchar】
–【修改數字列的精度】
–【修改列數據類型】
–【修改列的默認值】
alter table order_status modify status varchar();–[長度由增加成] –成功
alter table order_status modify status varchar();–【長度由縮小成 注意當前表沒有任何數據】 –成功
–ChaRu數據
insert into order_status(id status) values(chenkai);
select * from order_status
–再次縮小列status長度
alter table order_status modify status varchar();–成功了 怪哉!
–【只有在表中沒有任何行貨所有列都為空值是才可以減少列的長度】 但成功了
alter table order_status add newnumber number();–添加新列
–【修改新添加數字列的精度】
alter table order_status modify newnumber number();–成功
–同上【只有在表中沒有任何行貨所有列都為空值是才可以減少數字列的精度】
–【修改列數據類型】
alter table order_status modify newnumber char();–【由number類型修改char】
–【如果表中還沒有任何行或列都為空值 就可以將列修改為任何一中數據類型【包括更短的數據類型】否則只能修改一種兼容的類型類似Varchar 修改成Varchar】
–【但前提是不能縮短列的長度 才能轉換 類似不能將date修改成number類型】
alter table order_status add newdefault varchar() default chenkaiunion 默認數據;–【如果第一次修改 新列中沒有值全部添加了默認值】
insert into order_status(idstatus) values(測試)
–【修改列默認值】
alter table order_status modify newdefault default ;–【修改後只對新添加的列 起了新的默認值作用】
select * from order_status
–【刪除列】
alter table order_status drop column operator_name ;–成功
–【添加約束】
–【表示出Oracle中所有約束控制如下:】
–check 【指定一列或一組列必須滿足的約束】
–primary key /foreign key /unique/readonly /not null
–check option 指定對視圖執行的DML操作必須滿足子查詢的條件 後有詳解
Aqizhong從Oracle i版本開始獨立引入了一個Merge語句用來快速簡單將一個表的合並到另外一個表中實現的是跨表間數據庫合並操作值得注意 Merge into子句指明了合並操作的目標表 Using……on子句其實實現的是一個表連接 上面例子能看出 而When Matched then 當匹配Using…on子句條件時操作 同理When not Matched then 實在不匹配是操作
B:Oracle G 數據庫基本同SQL 其中有個Check Option指定對視圖執行的DML操作必須滿足子查詢條件 詳細請查看官方的Oracle SQl手冊不在贅述
C:在表修改中默認值 數據類型 數字類的精度等 控制上有詳細說明 同SQL雷同出較多 Oracle G 注意已經注明 參考上編碼
From:http://tw.wingwit.com/Article/program/Oracle/201311/18088.html