1. 程式人生 > >Sql Developer 除錯函式和過程 Sql window Command window Program window Test window 區別

Sql Developer 除錯函式和過程 Sql window Command window Program window Test window 區別

plsql的命令(command)視窗與sql視窗有什麼區別

2017年09月07日 09:22:55 236004 閱讀數:10597 標籤: command視窗與sql視窗 更多

個人分類: Oracle資料庫工具使用

版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/QQ578473688/article/details/77877092

PW(程式視窗): 
可以執行 sql,sqlplus 相關的語句,例如儲存過程,方法,一般用來開發程式用的。
TW(測試視窗): 
一般是用來測試儲存過程等的debug。
SW(SQL視窗): 
執行的是dml,ddl語句,主要使用者語句的查詢、顯示、執行統計資訊等(應用最多的一個視窗)。例如 desc table不能在SQL 
window中執行,必須在Command window中才能執行。
RW(報告視窗): 
方便用於展示有聚合查詢的用圖表形式展示的視窗,例如sum(),count()等,有x,y軸的。
CW(command

命令視窗): 
除了可以執行sql/sqlplus 相關的命令、sql指令碼,還可以執行更多的命令,例如call 等。
EPW(解釋計劃視窗): 
解釋執行計劃的,調優時,經常用到。
DW(圖表視窗): 

command視窗是命令視窗,即為sqplus視窗,有命令提示符,識別sqlplus命令,基本的命令都可以執行
sql視窗僅可執行DDL、select、DML等
DML(data manipulation language)是資料操縱語言:它們是SELECT、UPDATE、INSERT、DELETE,就象它的名字一樣,這4條命令是用來對資料庫裡的資料進行操作的語言。
DDL(data definition language)
是資料定義語言:DDL比DML要多,主要的命令有CREATE、ALTER、DROP等,DDL主要是用在定義或改變表(TABLE)的結構,資料型別,表之間的連結和約束等初始化工作上,他們大多在建立表時使用。

DCL(DataControlLanguage)是資料庫控制語言:是用來設定或更改資料庫使用者或角色許可權的語句,包括(grant,deny,revoke等)語句。

 

SQL語言16種基本命令:

DDL命令:CREATE,ALTER,DROP,RENAME,TRUNCATE,COMMENT

DML命令:SELECT,INSERT,UPDATE,DELETE,MERGE

TCL命令:SAVEPOINT,ROLLBACK,COMMIT,GRANT,REVOKE

參考:http://blog.csdn.net/ape55/article/details/73530419 http://blog.csdn.net/qq_24452475/article/details/53352458

https://blog.csdn.net/qq578473688/article/details/77877092

 

 

 

pl/sql關於新建不同的視窗

2017年11月09日 10:05:28 墨跡世界 閱讀數:661 標籤: plsql儲存程式設計除錯測試 更多

個人分類: oracle

版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/qq_26489817/article/details/78486175

使用pl/sql。用的最多的就是 new sql window.

但是pl/sql,除了提供新建sql查詢視窗,還提供了其他的window

1.new sql window:sql視窗主要用於查插刪改。還可以管理使用者

2.new command window:命令視窗。使用起來更像sqlplus,功能比sql視窗多,比如匯入,匯出。在這個視窗下操作,等同於在cmd下操作(自我感覺)

3.new report window:報表視窗。將查詢結果生成報表。可以儲存為HTML,PDF。還可以根據資料,生成柱狀圖,餅圖,折線圖。

4.new Explain plan window:解釋計劃視窗。分析所執行的SQL語句。把SQL執行的過程,一步一步展現出來。

5.new Test window.測試視窗。debug,按F9,單步除錯。

6.new Diagram window:圖表視窗。沒明白怎麼用的。

7.new Program window.程式視窗。建立觸發器,儲存過程,包頭(package:宣告),包體(package body:具體實現),當然也可以建立一個空白的程式視窗。

使用Program window,更加方便(會幫你造好殼),但是,用sql window寫程式也是可以的。

https://blog.csdn.net/qq_26489817/article/details/78486175

 

 

 

PL/SQL如何除錯Oracle儲存過程

from:http://jingyan.baidu.com/article/3a2f7c2e144d2826aed61167.html

除錯過程對找到一個存過的bug或錯誤是非常重要的,Oracle作為一款強大的商業資料庫,其上面的存過少則10幾行,多則上千行,免不了bug的存在,存過上千行的話,找bug也很費力,通過除錯可以大大減輕這種負擔。

工具/原料

 

  • PL\SQL

  • Oracle

方法/步驟

 

  1.  

    首先在PL/SQL的左側資源欄中展開Procedures項(圖中位置1),然後再其上面的搜尋框中(圖中位置2)輸入存過名稱的關鍵詞,按回車鍵搜尋要除錯的存過,不停的回車,直到找到想要除錯的存過。

    PL/SQL如何除錯Oracle儲存過程

  2.  

    找到想要除錯的存過,左鍵單擊選中該存過(圖中位置1),然後右鍵單擊該存過,從彈出選單中選擇“Test”項(圖中位置2)。

    PL/SQL如何除錯Oracle儲存過程

  3.  

    單擊“Test”後,PL\SQL會開啟除錯介面,圖中位置1的按鈕就是開始除錯的按鈕,在除錯之前要填寫存過的引數,位置2就是填寫引數的地方,如果有多個引數,會有多行引數框,按引數名填寫相應的引數即可。

    PL/SQL如何除錯Oracle儲存過程

  4.  

    填寫完引數,單擊開始除錯按鈕後,除錯的介面會發生一些變化。圖中位置1的變化,說明存過已經處於執行狀態,別人不能再編譯或者執行。位置2的按鈕就是執行按鈕,單擊這個按鈕存過會執行完成或者遇到bug跳出,否則是不會停下來的,除錯時不會用這個按鈕的。位置3的按鈕才是關鍵——單步執行,就是讓程式碼一行一行的執行,位置4的按鈕是跳出單步執行,等待下一個指令。

    PL/SQL如何除錯Oracle儲存過程

  5.  

    單擊“單步執行”,存過開始單步執行。介面中每一次執行的程式碼會高亮顯示(圖中位置1),如果想要看某個變數具體的值,就在位置2的地方輸入該變數名,然後變數的值會顯示在位置3的地方。

    PL/SQL如何除錯Oracle儲存過程

  6.  

    除錯的時候,每一次單步執行的時候要記一下執行程式碼的行數,圖中位置3的數字就是當前執行程式碼的行數,就是第幾行。如果過程單步執行到某行後,再單步執行的時候,存過就退出,那麼錯誤就在該行的下一行。

    PL/SQL如何除錯Oracle儲存過程

  7.  

    程式碼執行到24行,在往下執行時,直接轉到exception的地方,也就是異常處理的部分。

    PL/SQL如何除錯Oracle儲存過程

  8.  

    這說明我們程式碼中的錯誤在24和25行上,我們開啟存過,瀏覽到24行和25行附近,發現25行和24行使用了兩個變數,記住那兩個變數。重新開始除錯過程。

    PL/SQL如何除錯Oracle儲存過程

  9.  

    單步的執行時候把剛才那兩個變數名填寫到變數檢視框,一邊觀察變數值變化,一邊單步執行,執行到24行的時候,發現一個變數已經有值了,而另一個變數的值為null。錯誤原因明朗了吧?就是變數沒有賦值或者初始話,給該變數賦值後存過就不報錯了。

    PL/SQL如何除錯Oracle儲存過程

https://www.cnblogs.com/liuqiyun/p/6589814.html

 

 

PL/SQL Developer中除錯oracle的儲存過程

 

作者:iamlaosong

唉,真土,曾經用Toad。一直用dbms_output.put_line除錯儲存過程,僅僅認為不方便,用上PL/SQL Developer後,習慣性的還是用這種方法。人都是有惰性的。今天分析儲存過程生成的資料,實在認為不便,網上搜了一下,PL/SQL Developer中除錯oracle的儲存過程的方法,事實上非常easy。我知道學會使用PL/SQL Developer的除錯功能,對於編寫複雜的儲存過程,包,funtion...非常有幫助,對執行儲存過程形成的結果進行分析時也非常實用處,學習之後,果然、當真方便。現將相關步驟摘錄例如以下:

1、首先是編寫儲存過程,編譯無誤;
2、加入debug資訊。為了可以單步跟蹤儲存過程,須要為其所在的包加入debug資訊,右鍵點選須要除錯的儲存過程名稱。在彈出選單中選中[add debug information],這樣就為包體加入了除錯資訊;

3、選擇須要除錯的儲存過程名稱。點選右鍵,在彈出選單中 選擇[Test]。進去測試窗體,測試窗體中有為了測試該儲存過程自己主動所產生的程式碼。當然你也能夠自己另外增加和改動程式碼。自己主動生成的程式碼已經足夠了。

 

begin
  -- Call the procedure
  sxjk_sn_jsgfl(pinput => :pinput);
end;


4、有引數的儲存過程須要在以下的引數輸入表格中輸入引數值,見下圖中的引數值“n”。

 

5、開始除錯。點選工具條上Start圖示或者按F9進入除錯模式。以後的除錯過程跟我們熟悉的的除錯過程就一樣了(以下是選單或者工具條上的部分除錯功能):
Run(Ctrl+R)全速執行,到斷點停下。
Step into(Ctrl+N)執行一步。假設是呼叫過程。進入子過程。
Step over(Ctrl+O)執行一步,不管什麼語句。
Step out(Ctrl+T)執行完過程,直到從過程中退出到上一級。
。。

 

。。。


6、除錯過程中能夠設定斷點(點選斷點語句的左側灰色空白處,出現一個紅色的叉就是斷點,再次點選能夠取消),能夠檢視過程中的變數值(滑鼠指向變數時,系統自己主動顯示這個變數的值)。


假設無法單步執行或者無法設定斷點。可能是上面第二步[add debug information]沒有做。

https://www.cnblogs.com/mfrbuaa/p/5406802.html

 

 

pl/sql command window 初步接觸

pl/sql command window基本操作

PL/SQL Developer應用兩年了,今天第一次應用command window。

command window類似於sqlplus視窗:

1、用Esc鍵退出到SQL行。

2、呼叫儲存過程:Begin  procedure xxx(); end; 時,先回車到下一行,再/ ,再按enter鍵,才能執行出結果。

3、呼叫儲存過程前,需要先開啟 set serveroutput on 否則執行不出結果。

4、SQL window中呼叫完儲存過程之後,點選SQL旁邊的Output小視窗也可以看到輸出結果。

5、在Test window中呼叫也可以看到,底下可以輸入變數的值。旁邊也有一個DBMS Output可以看到結果。

6、例子:

 

create table BOOK(編號 number(10),書名 varchar2(20),價格 varchar2(20))

insert into BOOK values(100,'aa','88.77')

 

create or replace procedure query_BOOK(name IN OUT NUMBER,MY_BOOK OUT VARCHAR2,MY_BOOK2 OUT VARCHAR2) is

begin

select 編號 ,書名,價格 INTO name,MY_BOOK,MY_BOOK2 from BOOK where 編號=name;  

end query_BOOK;

 

declare v_name number(10);

 v_my_book varchar2(50);

 v_my_book2 varchar2(20);

begin

  v_name := 100;

  query_BOOK(v_name,v_my_book,v_my_book2); --呼叫儲存過程

  dbms_output.put_line('v_name is: '||v_name);

  dbms_output.put_line('v_my_book is: '||v_my_book);  

  dbms_output.put_line('v_my_book2 is: '||v_my_book2);  

exception

  when others then

  dbms_output.put_line(sqlerrm);

end;

 

 

標籤: pl/sqlcommand window

https://www.cnblogs.com/yayazi/p/5156612.html

 

 

 

關於在PLSQL中實現DEBUG除錯功能的方法

2017年04月07日 14:27:52 samt007 閱讀數:2179 標籤: oracle除錯plsql 更多

個人分類: Oracle PL/SQL技巧

前言 
一個健康的PLSQL,應該都帶有一套完整的除錯邏輯。特別是那些功能很複雜的PLSQL,就更加有必要具備除錯功能了。否則,當PLSQL處理資料出現問題的時候,分析(處理)起來會相當的困難。 
舉個例子,Oracle EBS標準功能的PLSQL(特別是API),如果Oracle沒有自帶除錯功能給我們做看每一步驟的除錯結果,單單通過看程式碼模擬其執行邏輯來找問題,基本上是不可能處理問題的! 
當然,我們編寫的程式碼,實際上大部分的都並沒有很複雜,所以對除錯部分沒太高的要求。這裡也建議按照實際情況來做。但是一些重要的並且是複雜的功能,還是必須要考慮如何新增除錯! 
實現除錯的辦法 
現在根據這幾年寫PLSQL的經驗,得出的一套如何在PLSQL中實現除錯的方法,特意分享一下。如果有更加好的方法,也可以一起討論一下!

具體實現辦法: 
1 首先,統一新建3個客戶化的Profile配置來實現除錯功能的開關: 
CUX:程式除錯級別 
設定除錯的級別。這裡是仿照標準功能的除錯邏輯來做的一個設定。作用就是是否啟用除錯,以及除錯的資料輸出的明細級別! 
具體: 
XYG_ALD_DEBUG_LEVEL:設定檢視除錯訊息的級別 
0:不檢視除錯(預設值) 
1:檢視除錯程式主要訊息級別=1的訊息 
2:檢視訊息的除錯級別<=2的資訊 
3:檢視訊息的除錯級別<=3的資訊 
4:檢視訊息的除錯級別<=4的資訊 
5:檢視訊息的除錯級別<=5的資訊

舉個例子,如果我的除錯訊息設定是:除錯級別3,除錯顯示3的資訊。 
則當XYG_ALD_DEBUG_LEVEL級別是2的時候,這個3的除錯資訊是不會顯示的。 
當XYG_ALD_DEBUG_LEVEL級別大於等於3的時候,這個訊息才會顯示出來! 
具體可以自己寫一個例子來理解。

CUX:程式除錯方式 
就是除錯結果顯示的方式。 
一般來說有下面幾種方式: 
除錯方式XYG_ALD_DEBUG_TYPE: 
DBMS_OUTPUT直接輸出 
FILE_DEBUGLOG文件輸出 
REQUEST_DEBUGLOG請求日誌輸出 
DATA_DEBUGLOG表格資料輸出 
DBMS_OUTPUT:這個不用多說了,實際上就是呼叫DBMS_OUTPUT.PUT_LINE在開發工具直接顯示訊息。 
FILE_DEBUGLOG:這個很重要!不過要配合一些額外的定義,才可以看到這種輸出的結果。這種方式的除錯結果以檔案的形式存在伺服器裡面。適合那種超大資料量輸出的除錯資訊。 
REQUEST_DEBUGLOG:如果PLSQL是在請求中呼叫的話,可以考慮用這種方式檢視除錯資訊。除錯資訊會直接顯示在請求的日誌裡面。 
DATA_DEBUGLOG表格資料輸出:就是將除錯的結果輸出在fnd_log_messages表。和標準功能的保持一致!

CUX:程式除錯檔案 
結合除錯方式= FILE_DEBUGLOG文件輸出使用。 
就是定義除錯結果產生的檔案是什麼。 
注意:如果這個設定為空,則預設檔案= XYG_PUB_AUTOMAIL_PKG.XYG_DF_UTL_FILE_DIR||’/’||userenv(‘SESSIONID’)||’.log’

2 PLSQL裡面如何使用除錯的方法: 
首先,在要新增除錯邏輯的PKG包體裡面,建議直接新增下面這些指令碼,二次簡單封裝一下公用的除錯處理包,方便呼叫: 
例如:

CREATE OR REPLACE PACKAGE BODY APPS.XYG_ALBND_PACK_PKG
AS
   --===============================================================
   -- Debug 處理
   --===============================================================
   --P_DEBUG_LEVEL:該除錯資訊的級別
   PROCEDURE DEBUGLOG (P_DEBUG_LEVEL IN NUMBER,P_DEBUG_MSG IN VARCHAR2)
   IS
   BEGIN
      XYG_ALD_DEBUG_PKG.DEBUGLOG(' XYG_ALBND_PACK_PKG ',P_DEBUG_LEVEL,P_DEBUG_MSG);
   END DEBUGLOG;
   --簡化版本,預設該訊息的是level=1的
   PROCEDURE DEBUGLOG1 (P_DEBUG_MSG IN VARCHAR2)
   IS
   BEGIN
      XYG_ALD_DEBUG_PKG.DEBUGLOG(' XYG_ALBND_PACK_PKG ',1,P_DEBUG_MSG);
   END DEBUGLOG1;
….
接著,在需要顯示除錯訊息的地方,直接呼叫這個函式即可:
DEBUGLOG(1,'GENERATE_XXXXXXXXXXXXX(+)');   或者:DEBUGLOG1('GENERATE_XXXXXXXXXXXXX(+)');
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

需要注意的是,DEBUGLOG的第一個引數是該訊息的顯示級別。換句話說,就是你希望這個訊息在什麼級別顯示它! 
舉個例子,如果設定為3,則訊息基本是3級,當設定顯示的訊息級別大於等於3的時候,該訊息會顯示。

3 程式如何檢視除錯的結果:

------------------------------
---1 普通在Toad的output除錯樣例:
DECLARE
   L_RETCODE NUMBER;
   L_ERRBUF VARCHAR2(4000);
BEGIN
   FND_PROFILE.PUT('XYG_ALD_DEBUG_LEVEL',1);
   FND_PROFILE.PUT('XYG_ALD_DEBUG_TYPE','DBMS_OUTPUT');
   XYG_ALBND_PACK_PKG.AUTO_CREATE_PACK(
          'PO_HEADERS_ALL'
         ,2579287
         ,SYSDATE
         ,5954
         ,'NORMAL'
         ,l_retcode
         ,l_errbuf
       );
   DBMS_OUTPUT.PUT_LINE(L_RETCODE||'-'||L_ERRBUF);
END;

------------------------------
---2 除錯結果檔案輸出樣例:
DECLARE
   L_RETCODE NUMBER;
   L_ERRBUF VARCHAR2(4000);
BEGIN
   FND_PROFILE.PUT('XYG_ALD_DEBUG_LEVEL',2);
   FND_PROFILE.PUT('XYG_ALD_DEBUG_TYPE','FILE_DEBUGLOG');
   FND_PROFILE.PUT('XYG_ALD_DEBUG_FILE'
,'/oracle/vis/apps/apps_st/appl/attchment/12.0.0/BATCH_UPLOAD_TEMP/SAMT_TEST001.log');
   XYG_ALBND_PACK_PKG.AUTO_CREATE_PACK(
          'PO_HEADERS_ALL'
         ,2579287
         ,SYSDATE
         ,5954
         ,'NORMAL'
         ,l_retcode
         ,l_errbuf
       );
   DBMS_OUTPUT.PUT_LINE(L_RETCODE||'-'||L_ERRBUF);
END;

--檢視檔案的路徑
SELECT FND_PROFILE.VALUE('XYG_ALD_DEBUG_FILE') FROM DUAL

------------------------------
--3 如果用資料輸出的
DECLARE
   L_RETCODE NUMBER;
   L_ERRBUF VARCHAR2(4000);
BEGIN
   FND_PROFILE.PUT('XYG_ALD_DEBUG_LEVEL',2);
   FND_PROFILE.PUT('XYG_ALD_DEBUG_TYPE','DATA_DEBUGLOG');
   XYG_ALBND_PACK_PKG.AUTO_CREATE_PACK(
          'PO_HEADERS_ALL'
         ,2579287
         ,SYSDATE
         ,5954
         ,'NORMAL'
         ,l_retcode
         ,l_errbuf
       );
   DBMS_OUTPUT.PUT_LINE(L_RETCODE||'-'||L_ERRBUF);
END;
---檢視除錯資訊:
select to_char(systimestamp, 'yyyy-mm-dd hh24:mi:ss:ff3') debug_time,session_id,module||'[---]'||message_text
  from fnd_log_messages
 where timestamp > sysdate-1
   and session_id=userenv('SESSIONID')
 order by LOG_SEQUENCE;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71

完工!就是這麼的簡單,讓您寫的PLSQL就擁有了完整的而且有非常好擴充套件性的除錯功能!

文件下載以及原始碼下載的連結: 
http://download.csdn.net/detail/samt007/9806450

https://blog.csdn.net/samt007/article/details/69537289

 

 

 

試玩了plsql中test視窗declare宣告變數|lpad函式||plsql sql command test window區別|

在這裡先感謝一下itpub高手的帖子答覆

Q:

看到的oracle中的for迴圈or i in 1..100 loop,i都是從1,2,3這樣遞增的,可是我這裡需要i從01,02,03這樣遞增,9開始是09,10,11,12.
請問這樣的for迴圈怎麼寫。
具體問題可見http://www.itpub.net/thread-1620912-1-1.html,我想在觸發器中加入迴圈變數,精簡我的觸發器長度。
ps:我是新手,謝謝大家的幫助

A:

lpad('tech', 7);        would return ' tech'

lpad('tech', 2);        would return 'te'

lpad('tech', 8, '0');        would return '0000tech'

lpad('tech on the net', 15, 'z');        would return 'tech on the net'

lpad('tech on the net', 16, 'z');        would return 'ztech on the net'

每次看到itpub的答覆都很激動,一個恢復解決問題。

lpad函式說明

語法格式如下:

 

  lpad( string, padded_length, [ pad_string ] )

 

  string

 

  準備被填充的字串;

 

  padded_length

 

  填充之後的字串長度,也就是該函式返回的字串長度,如果這個數量比原字串的長度要短,lpad函式將會把字串擷取成從左到右的n個字元;

 

  pad_string

 

  填充字串,是個可選引數,這個字串是要貼上到string的左邊,如果這個引數未寫,lpad函式將會在string的左邊貼上空格。 

下面說plsq中的塊。

經常看到有人和書上直接寫declare,也不在觸發器或者儲存過程中,可是照樣使用,比如:http://zhidao.baidu.com/question/113921713.html

1,我剛開始直接在plsql中的查詢視窗sql window使用,報錯:

13:51更新:

sql windows視窗也是可以顯示的,在第二列就是output,僅僅select不行

 

 

2,想到在測試視窗test window,通過(需要點選左上角的start debugger按鈕,然後點選run)

複製程式碼

-- Created on 2012-6-13 by DELL 
declare 
  -- Local variables here
  i number;
begin
  -- Test statements here
  for i in 1..100 loop
    dbms_output.put_line(lpad(i,2,'0'));
    end loop;
end;

複製程式碼

 

下面是結果

 

 拓展:

1 Command window實現了SQL*Plus的所有功能,允許執行sql*plus命令,sql命令,sql指令碼。
2 SQL window用於執行sql語句,顯示sql輸出,執行統計資訊。(測試sql語句,查看錶中的資料,更新資料)
  例如 desc table(查看錶結構)不能在SQL window中執行,必須在Command window中才能執行。

3 Program window中建立一個儲存過程(或者直接在plsql左邊對應的procedures和trigger右鍵新建),如下:

create or replace procedure TEST is
begin
DBMS_SESSION.set_nls('NLS_DATE_FORMAT','''YYYY-MM-DD HH24:MI:SS''');
DBMS_OUTPUT.PUT_LINE('HelloWorld!');
DBMS_OUTPUT.put_line(SYSDATE);
end TEST;

需要注意,SET_NLS的第二個引數VALUE
輸入的值除了需要的格式外,還需要包含引號,否則會引發錯誤(選項缺失或無效)
在Command window中執行(或者在Test window中測試),如下:
set   serveroutput   on
exec TEST();
或者begin
  2  test();
  3  end;
  4  / ......

分類: ORACLE

好文要頂 關注我 收藏該文  

sumsen
關注 - 5
粉絲 - 21

+加關注

https://www.cnblogs.com/sumsen/archive/2012/06/13/2547512.html