oracle學習(上)

在第一學期我們已經接觸過關係型數據庫SQL Server,對數據庫、表、記錄、表的增刪改查操作等這些基本的概念已經瞭解。Oracle是基於對象的關係型數據庫,Oracle也是用表的形式對數據存儲和管理,並且在Oracle的操作中添加了一些面向對象的思想。

 

Oracle數據庫是Oracle(中文名稱叫甲骨文)公司的核心產品,Oracle數據庫是一個適合於大中型企業的數據庫管理系統。在所有的數據庫管理系統中(比如:微軟的SQL Server,IBM的DB2等),Oracle的主要用戶涉及面非常廣,包括:銀行、電信、移動通信、航空、保險、金融、電子商務和跨國公司等。Oracle產品是免費的,可以在Oracle官方網站上下載到安裝包,另一方面Oracle服務是收費的。

 

Oracle公司成立以來,從最初的數據庫版本到Oracle7、Oracle8i、Oracle9i,Oracle10g到Oracle11g,雖然每一個版本之間的操作都存在一定的差別,但是Oracle對數據的操作基本上都遵循SQL標準。因此對Oracle開發來說版本之間的差別不大。

 

很多人沒有學習Oracle就開始發怵,因爲人們在誤解Oracle,認爲Oracle太難學了,認爲Oracle不是一般人用的數據庫,其實任何數據庫對應用程序研發人員來說,都是大同小異,因爲目前多數數據庫都支持標準的SQL。在Oracle這本書中,我們能學習到:

Ø Oracle的安裝

Ø Oracle數據管理

Ø 常用子查詢及常用函數

Ø PL/SQL編程

Ø Oracle基本管理

 

由於在第一學期已經接觸了SQL Server,Oracle數據庫的概念不是很難,主要是實踐,因此在本書的學習中,認真的完成上機練習是學習好本書的關鍵。

 

接下來我們先從Oracle安裝開始,接觸一些Oracle中基本的概念。

 

Oracle數據庫產品是免費的,我們可以從Oracle的官方網站(http://www.oracle.com)下載到程序安裝包,Oracle在Windows下的安裝非常方便,安裝開始後,一直點擊安裝程序的“下一步”即可。

 

1.      下載Oracle10g後,解壓到一個文件夾下,單擊“setup.exe”文件即可啓動安裝界面。如下圖:

 

圖1  Oracle安裝啓動界面

 

Oracle主目錄位置就是Oracle準備安裝的位置,稱爲“Oracle_Home”,一般Oracle根據當前計算機的硬盤大小默認給出一個合適的位置。Oracle安裝時可以只安裝Oracle軟件,然後單獨創建數據庫,也可以在上圖中選中“創建啓動數據庫”複選框,在安裝Oracle產品時,同時創建一個數據庫,對初學者來說,推薦這樣安裝。填寫全局數據庫名,以及管理員的密碼。全局數據庫名是數據庫在服務器網絡中的唯一標識。

 

2.      點擊“下一步”,就會出現如下圖內容,開始對Oracle服務器進行環境檢查,主要查看服務器是否符合Oracle安裝的條件,比如操作系統是否支持、系統內存是否符合Oracle安裝的最低要求等。

 

圖2  Oracle安裝前環境檢查

 

3.      Oracle檢查通過後,單擊“下一步”,就會列出所有安裝Oracle過程中的默認選項。

 

圖3  Oracle默認安裝設置

 

4.      單擊“安裝”按鈕,進入安裝界面,這一過程經歷時間比較長,根據計算機的性能不同有很大差別。

 

圖4  Oracle安裝

 

5.      上圖完成後,進入了各種Oracle工具的安裝階段,包括網絡配置嚮導,iSQL*plus等(後面課程中講解)。如下圖所示:

 

圖5  Oracle各種工具的安裝

 

6.      接下來自動啓動DBCA(Database Configuration Assistant)進入創建默認數據庫階段。

 

圖6  DBCA下安裝數據庫

 

         Oracle中的數據庫主要是指存放數據的文件,這些文件在Oracle安裝完成後,在計算機硬盤上都能找到,包括數據文件、控制文件和數據庫日誌文件。

 

數據庫創建後會有一系列爲該數據庫提供服務的內存空間和後臺進程,稱爲該數據庫的實例。每一個數據庫至少會有一個實例爲其服務。實例中的內存結構稱爲系統全局區(SGA),系統會根據當前計算機系統的性能給SGA分配非常可觀的內存空間。

 

Oracle創建數據庫不能像SQL Server那樣用一個簡單的CREATEDATABASE命令就能完成,在創建數據庫的過程中還需要配置各種參數。雖然有DBCA工具嚮導,但是仍然需要進行比較麻煩的配置。

        

雖然一個Oracle數據庫服務器中可以安裝多個數據庫,但是一個數據庫需要佔用非常大的內存空間,因此一般一個服務器只安裝一個數據庫。每一個數據庫可以有很多用戶,不同的用戶擁有自己的數據庫對象(比如:數據庫表),一個用戶如果訪問其他用戶的數據庫對象,必須由對方用戶授予一定的權限。不同的用戶創建的表,只能被當前用戶訪問。因此在Oracle開發中,不同的應用程序只需使用不同的用戶訪問即可。

 

7.      數據庫創建完畢後,需要設置數據庫的默認用戶。Oracle中爲管理員預置了兩個用戶分別是SYS和SYSTEM。同時Oracle爲程序測試提供了一個普通用戶scott,口令管理中,可以對數據庫用戶設置密碼,設置是否鎖定。 Oracle客戶端使用用戶名和密碼登錄Oracle系統後才能對數據庫操作。

 

圖7  DBCA下的口令管理

圖8  爲system,sys,scott用戶設置密碼

 

         默認的用戶中,SYS和SYSTEM用戶是沒有鎖定的,安裝成功後可以直接使用,SCOTT用戶默認爲鎖定狀態,因此不能直接使用,需要把SCOTT用戶設定爲非鎖定狀態才能正常使用。

 

         這一步完成後,Oracle系統安裝成功。

 

Oracle數據庫中,默認情況下,所有系統的數據,SQL關鍵字等都是大寫的,在操作過程中,Oracle會自動把這些內容轉換爲大寫,因此用戶操作時不需考慮大小寫問題,一般情況下,爲了良好的程序風格,程序中建議關鍵字用大寫,非關鍵字可以使用小寫。

 

Oracle服務器安裝成功後,就可以通過客戶端工具連接Oracle服務器了,可以到Oracle官方下載Oracle專用的客戶端軟件,大多客戶端工具都是基於Oracle客戶端軟件的。接下來介紹幾種常用的Oracle客戶端工具。

 

²  SQL*Plus工具

 

該工具是Oracle系統默認安裝下,自帶的一個客戶端工具。在Windows命令行中輸入“sqlplusw”命令,就能夠啓動該工具了。

 

圖9  SQL*Plus工具

 

輸入用戶名和密碼後,如果SQL*Plus與數據庫服務器在同一臺計算機上,並且當前服務器下只有一個數據庫實例,那麼“主機字符串”可以不用填寫。

 

SQL*Plus工具雖然是Oracle自帶的工具,但是在現實開發中,基於該環境對開發不方便,因此很少使用。

 

SQL*Plus連接成功後就如圖所示:

 

圖10  SQL*Plus工具登錄後

 

²  SQL*Plus命令行工具

 

該命令行工具,提供了與數據庫交互的能力和維護數據庫的能力,包括了Oracle自帶的SQL*Plus工具的全部功能,在Oracle管理中經常使用。在命令行中輸入:“sqlplus/nolog”即可啓動該工具。如下圖:

 

圖11  啓動SQL*Plus命令行工具

 

         輸入“sqlplus /nolog”命令後,只是啓動了一個客戶端進程,並沒有與服務器連接,連接到Oracle服務器的命令是:

 

conn 用戶名/密碼 as 連接身份@服務器連接字符串

 

說明:

1.      連接身份:表示該用戶連接後擁有的權限。

Ø sysdba:即數據庫管理員,權限包括:打開數據庫服務器、關閉數據庫服務器、備份數據庫、恢復數據庫、日誌歸檔、會話限制、管理功能、創建數據庫。sys用戶必須用sysdba身份才能登錄,system用戶可以用普通身份登錄。

Ø sysyoper:即數據庫操作員,權限包括:打開數據庫服務器、關閉數據庫服務器、備份數據庫、恢復數據庫、日誌歸檔、會話限制。

Ø normal:即普通用戶,權限只有查詢某些數據表的數據。默認的身份是normal用戶。

 

2.      客戶端工具可以根據“服務器連接字符串”對服務器進行連接,有了連接字符串後客戶端就可以像操作本機一樣操作遠程數據庫,因此“服務器連接字符串”的配置也叫本地網絡服務配置,如果SQL*Plus工具啓動在服務器上,並且服務器上只有一個數據庫實例的情況下,連接字符串可以缺省,在連接字符串中包括連接服務器的協議,服務器的地址,服務器的端口等設置,Oracle服務名等,該配置文件在Oracle安裝目錄下的: network/ADMIN/ tnsnames.ora。該文件是一個文本文件,用記事本打開後如下所示:

 

圖12  服務器連接字符串配置

 

²  配置本地網絡服務名

 

         本地網絡服務名,即客戶端與服務器的連接字符串,本地網絡服務名是客戶端的配置,Oracle客戶端安裝後,可以使用客戶端自帶的網絡配置嚮導(NetConfiguration Assistant)進行配置:

 

1.      啓動NetConfiguration Assistant。選擇“本地Net服務名配置”選項。如下圖所示:

 

圖13  啓動Net Configuration Assistant

 

2.      選擇“下一步”,本步驟可以對本地網絡服務名進行添加,刪除,測試是否正常連接等操作,選擇“添加”選項。

 

圖14  Net Configuration Assistant

 

3.      點擊“下一步”,填寫服務名,該服務名就是Oracle安裝時(圖1),爲數據庫取的全局數據庫名。

 

圖15  服務名配置

 

4.      點擊“下一步”,選擇服務需要的協議,默認是TCP協議。推薦使用默認的TCP協議。

 

圖16  選擇協議

 

5.      點擊“下一步”,輸入主機名,主機名可以是計算機名稱,也可以是一個IP地址,主機如果是本機,可以使用本機計算機名稱、“localhost”、“127.0.0.1”、或者本機的IP地址。

 

圖17  輸入主機名和端口

 

6.      單擊“下一步”,選擇“是,進行測試”選項。進入下圖界面。

 

圖18  測試成功

 

在測試時,默認採用的用戶名和密碼是system/manager進行測試,如果用戶system的密碼不是“manager”,有可能測試通不過,更改登錄後,輸入正確的用戶名和密碼後再進行測試即可。

7.      測試成功後,單擊“下一步”,出現如下界面,這一步是爲本地網絡服務命名,即圖12中的服務器連接字符串名。

 

圖19  爲網絡服務名命名

 

         點擊“下一步”,配置就完成了,進入tnsnames.ora文件中查看,就出現瞭如圖12中的內容。

 

²  PL/SQL Developer工具

 

在實際Oracle開發中,經常使用一個功能強大的第三方工具:“PL/SQLDeveloper”工具。PL/SQL Developer基本上可以實現Oracle開發中的任何操作。它運行在客戶端時必須先安裝Oracle客戶端,並且通過網絡配置嚮導配置網絡服務名後才能正常與服務器連接。

 

圖20 PL/SQL Developer

 

Oracle在windows中安裝完成後,會安裝很多服務,下面介紹幾個主要的服務。

 

圖21 Oracle服務

 

Ø OracleService+服務名,該服務是數據庫啓動的基礎,只有該服務啓動了,Oracle數據庫才能正常啓動。這是必須啓動的服務。

Ø OracleOraDb10g_home1TNSListener,該服務是服務器端爲客戶端提供的監聽服務,只有該服務在服務器上正常啓動,客戶端才能連接到服務器。該監聽服務接收客戶端發出的請求,然後將請求傳遞給數據庫服務器。一旦建立了連接,客戶端和數據庫服務器就能直接通信了。

Ø OracleOraDb10g_home1iSQL*Plus,該服務提供了用瀏覽器對數據庫中數據操作的方式。該服務啓動後,就可以使用瀏覽器進行遠程登錄並進行數據庫操作了。如下圖所示:

 

圖22 iSQL*Plus

 

Ø OracleDBConsole+服務名,Oracle10g中的一個新服務。在Oracle9i之前,Oracle官方提供了一個基於圖形界面的企業管理器(EM),從Oracle10g開始,Oracle提供了一個基於B/S的企業管理器,在操作系統的命令行中輸入命令:emctlstart dbconsole,就可以啓動OracleDbConsole服務,如下圖所示:

 

圖23 EM服務的啓動

 

         服務啓動之後,就可以在瀏覽器中輸入上圖中進入EM的地址,使用B/S方式管理Oracle服務器。

 

OracleService啓動動後,就可以對數據庫進行管理了,Oracle的啓動和關閉是最基本的命令,在SQL*Plus中,啓動Oracle必須是sys用戶,命令格式是:

 

startup open

 

圖24 Oracle服務啓動

 

         Oracle服務關閉用命令:shutdown immediate

 

圖25 Oracle服務關閉

 

Oracle中,一般不會輕易在一個服務器上創建多個數據庫,在一個數據庫中,不同的項目由不同的用戶訪問,每一個用戶擁有自身創建的數據庫對象,因此用戶的概念在Oracle中非常重要。Oracle的用戶可以用CREATE USER命令來創建。其語法是:

 

語法結構:創建用戶

CREATE USER 用戶名 IDENTIFIED BY 口令 [ACCOUNT LOCK|UNLOCK]

語法解析:

CREATE USER jerry IDENTIFIED BY tom ACCOUNT UNLOCK

         LOCK|UNLOCK創建用戶時是否鎖定,默認爲鎖定狀態。鎖定的用戶無法正常的登錄進行數據庫操作。

 

代碼演示:創建用戶

SQL> CREATE USER jerry

2  IDENTIFIED BY tom

3  ACCOUNT UNLOCK;

        

Oracle在SQL*Plus中的命令以分號(;)結尾,代表命令完畢並執行,系統同時會把該命令保存在緩存中,緩存中只保存最近執行過的命令,如果重新執行緩存中的命令,直接使用左斜槓符號(/)。如果命令不以分號結尾,該命令只是寫入緩存保存起來,但並不執行。

 

         儘管用戶成功創建,但是還不能正常的登錄Oracle數據庫系統,因爲該用戶還沒有任何權限。如果用戶能夠正常登錄,至少需要CREATE SESSION系統權限。

 

         Oracle用戶對數據庫管理或對象操作的權利,分爲系統權限和數據庫對象權限。系統權限比如:CREATE SESSION,CREATE TABLE等,擁有系統權限的用戶,允許擁有相應的系統操作。數據庫對象權限,比如對錶中的數據進行增刪改操作等,擁有數據庫對象權限的用戶可以對所擁有的對象進行對應的操作。

 

         還有一個概念就是數據庫角色(role),數據庫角色就是若干個系統權限的集合。下面介紹幾個常用角色:

Ø CONNECT角色,主要應用在臨時用戶,特別是那些不需要建表的用戶,通常只賦予他們CONNECT role。CONNECT是使用Oracle的簡單權限,擁有CONNECT角色的用戶,可以與服務器建立連接會話(session,客戶端對服務器連接,稱爲會話)。

Ø RESOURCE角色更可靠和正式的數據庫用戶可以授予RESOURCErole。RESOURCE提供給用戶另外的權限以創建他們自己的表、序列、過程(procedure)、觸發器(trigger)、索引(index)等。

Ø DBA角色,DBA role擁有所有的系統權限----包括無限制的空間限額和給其他用戶授予各種權限的能力。用戶SYSTEM擁有DBA角色。

 

一般情況下,一個普通的用戶(如SCOTT),擁有CONNECT和RESOURCE兩個角色即可進行常規的數據庫開發工作。

 

         可以把某個權限授予某個角色,可以把權限、角色授予某個用戶。系統權限只能由DBA用戶授權,對象權限由擁有該對象的用戶授權,授權語法是:

 

語法結構:授權

GRANT角色|權限 TO 用戶(角色)

 

代碼演示:授權

SQL> GRANT CONNECT TO jerry;

授權成功。

SQL> GRANT RESOURCE TO jerry;

授權成功。

SQL>

        

語法結構:其他操作

//回收權限

REVOKE 角色|權限 FROM 用戶(角色)

//修改用戶的密碼

ALTER USER 用戶名 IDENTIFIED BY 新密碼

//修改用戶處於鎖定(非鎖定)狀態

ALTER USER 用戶名 ACCOUNT LOCK|UNLOCK

 


 

Ø  Oracle是基於對象的關係型數據庫,Oracle產品免費,服務收費。

Ø  Oracle安裝後默認會有兩個管理員用戶(system,sys)和一個普通用戶Scott。

Ø  Sql*plus是Oracle管理和數據操作的客戶端工具。

Ø  客戶端鏈接服務器前,服務器要啓動監聽服務,並且客戶端工具要安裝Oracle客戶端,並且在客戶端要建立本地網絡服務名。

Ø  Oracle服務和監聽啓動後才能對數據庫進行操作。

Ø  用startup命令啓動數據庫,用shutdown命令關閉數據庫。

Ø  Oracle的角色包括了一系列系統權限和普通對象權限,可以把權限授權給角色,把權限或者角色授權給用戶。


 

1.      描述Oracle安裝過程中的關鍵點。

2.      描述創建本地網絡服務名的步驟。

3.      描述Oracle主要服務的作用。

4.      Oracle使用什麼命令才能啓動和關閉。

5.      什麼是Oracle權限和角色?他們的關係是什麼?

6.      創建一個用戶,並授權CONNECT和RESOURCE。


章節知識結構圖

 

 


 


 

 

第2章

 

SQL數據操作和查詢

 

 

 

                                           

 

 

 

主要內容

 

ü  Oracle數據類型

ü  SQL建表和約束

ü  SQL對數據增刪改

ü  SQL查詢

ü  Oracle僞列

 

 


 

在第一學期的SQL Server學習中,已經知道,SQL是結構化查詢語言(Structured Query Language),專門用於數據存取、數據更新及數據庫管理等操作。並且已經學習了用SQL語句對數據庫的表進行增刪改查的操作。

 

在Oracle開發中,客戶端把SQL語句發送給服務器,服務器對SQL語句進行編譯、執行,把執行的結果返回給客戶端。OracleSQL語句由如下命令組成:

Ø 數據定義語言(DDL),包括CREATE(創建)命令、ALTER(修改)命令、DROP(刪除)命令等。

Ø 數據操縱語言(DML),包括INSERT(插入)命令、UPDATE(更新)命令、DELETE(刪除)命令、SELECT … FORUPDATE(查詢)等。

Ø 數據查詢語言(DQL),包括基本查詢語句、Order By子句、Group By子句等。

Ø 事務控制語言(TCL),包括COMMIT(提交)命令、SAVEPOINT(保存點)命令、ROLLBACK(回滾)命令。

Ø 數據控制語言(DCL),GRANT(授權)命令、REVOKE(撤銷)命令。

 

目前主流的數據庫產品(比如:SQL Server、Oracle)都支持標準的SQL語句。數據定義語言,表的增刪改操作,數據的簡單查詢,事務的提交和回滾,權限的授權和撤銷等,Oracle與SQL Server在操作上基本一致。

 

Oracle數據庫的核心是表,表中的列使用到的常見數據類型如下:

 

類型

含義

CHAR(length)

存儲固定長度的字符串。參數length指定了長度,如果存儲的字符串長度小於length,用空格填充。默認長度是1,最長不超過2000字節。

VARCHAR2(length)

存儲可變長度的字符串。length指定了該字符串的最大長度。默認長度是1,最長不超過4000字符。

NUMBER(p,s)

既可以存儲浮點數,也可以存儲整數,p表示數字的最大位數(如果是小數包括整數部分和小數部分和小數點,p默認是38爲),s是指小數位數。

DATE

存儲日期和時間,存儲紀元、4位年、月、日、時、分、秒,存儲時間從公元前4712年1月1日到公元后4712年12月31日。

TIMESTAMP

不但存儲日期的年月日,時分秒,以及秒後6位,同時包含時區。

CLOB

存儲大的文本,比如存儲非結構化的XML文檔

BLOB

存儲二進制對象,如圖形、視頻、聲音等。

表1  Oracle的部分數據類型

 

         對應NUMBER類型的示例:

 

格式

輸入的數字

實際的存儲

NUMBER

1234.567

1234.567

NUMBER(6,2)

123.4567

123.46

NUMBER(4,2)

12345.67

輸入的數字超過了所指定的精度,數據庫不能存儲

表2  Number示例

 

         對於日期類型,可以使用sysdate內置函數可以獲取當前的系統日期和時間,返回DATE類型,用systimestamp函數可以返回當前日期、時間和時區。

 

圖1  sysdate和sysTimestamp

 

         Oracle的查詢中,必須使用“select 列… from 表”的完整語法,當查詢單行函數的時候,from後面使用DUAL表,dual表在系統中只有一行一列,該表在輸出單行函數時爲了select…from的語法完整性而使用。

 

Oracle創建表同SQL Server一樣,使用CREATE TABLE命令來完成。創建約束則使用如下命令:

語法格式:ALTER TABLE命令

   ALTER TABLE 表名 ADD CONSTRAINT 約束名 約束內容。

 

不論創建表還是約束,與SQL Server基本相同,注意:在Oracle中default是一個值,而SQL Server中default是一個約束,因此Oracle的default設置可以在建表的時候創建。

 

案例1:創建一個學生信息(INFOS)表和約束

 

代碼演示:Oracle創建表和約束

CREATE TABLE INFOS

(

  STUID VARCHAR2(7) NOT NULL,    --學號 學號=‘S’+班號+2位序號

  STUNAME VARCHAR2(10) NOT NULL,  --姓名

  GENDER VARCHAR2(2) NOT NULL,    --性別 

  AGE NUMBER(2) NOT NULL,        --年齡

  SEAT NUMBER(2) NOT NULL,        --座號

  ENROLLDATE DATE,      --入學時間

  STUADDRESS VARCHAR2(50) DEFAULT '地址不詳',      --住址

  CLASSNO VARCHAR2(4) NOT NULL    --班號班號=學期序號+班級序號 

)

/  ①

ALTER TABLE INFOS ADD CONSTRAINT PK_INFOS PRIMARY KEY(STUID) 

/

ALTER TABLE INFOS ADD CONSTRAINT CK_INFOS_GENDER 

CHECK(GENDER = '男' OR GENDER = '女') 

/

ALTER TABLE INFOS ADD CONSTRAINT CK_INFOS_SEAT

CHECK(SEAT >=0 AND SEAT <=50) 

/

ALTER TABLE INFOS ADD CONSTRAINT CK_INFOS_AGE 

CHECK(AGE >=0 AND AGE<=100) 

/

ALTER TABLE INFOS ADD CONSTRAINT CK_INFOS_CLASSNO 

CHECK((CLASSNO >='1001' AND CLASSNO<='1999') OR

(CLASSNO >='2001' AND CLASSNO<='2999')) 

/

ALTER TABLE INFOS ADD CONSTRAINTS UN_STUNAME UNIQUE(STUNAME)  ⑦

/

代碼解析:

①  在Oracle代碼中,“/”執行緩存區中的語句,由於緩衝區中只存儲一條剛剛保存過語句,由於每條語句沒有用分號結尾,只是保存在緩衝區,因此每條語句後面都有單獨一行“/”。

②  創建一個主鍵約束。

③  與 ④ ⑤ ⑥ ⑦一起創建各種check約束。其中⑦是唯一約束,表示該列值是唯一的,列中的值不能重複。

 

Oracle中創建外鍵約束與SQL Server相同。比如:現有成績表定義如下:

 

案例2:創建一個成績表(SCORES)表和約束

 

代碼演示:Oracle創建表和約束

CREATE TABLE SCORES

(

     ID NUMBER ,        --ID 

     TERM VARCHAR2(2),                                   --學期 S1或S2

      STUID VARCHAR2(7) NOT NULL,                   --學號

      EXAMNO VARCHAR2(7) NOT NULL,               --考號 E+班號+序號     

      WRITTENSCORE NUMBER(4,1) NOT NULL,    --筆試成績

      LABSCORE NUMBER(4,1) NOT NULL             --機試成績

)

ALTER TABLE SCORES

    ADD CONSTRAINT CK_SCORES_TERM CHECK(TERM = 'S1' OR TERM ='S2')

/

ALTER TABLE SCORES

    ADD CONSTRAINT FK_SCORES_INFOS_STUID FOREIGN KEY(STUID) REFERENCES INFOS(STUID) 

/

代碼解析:

①  SQL Server中可以使用identify創建自動增長列,但是Oracle中的自動增長需要藉助序列(Sequence)完成,在後面章節中講解。

②  Oracle中的外鍵約束定義。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章