Sql Developer 除錯函式和過程 Sql window Command window Program window Test window 區別
plsql的命令(command)視窗與sql視窗有什麼區別
2017年09月07日 09:22:55 236004 閱讀數:10597 標籤: command視窗與sql視窗 更多
版權宣告:本文為博主原創文章,未經博主允許不得轉載。 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)
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
方法/步驟
-
首先在PL/SQL的左側資源欄中展開Procedures項(圖中位置1),然後再其上面的搜尋框中(圖中位置2)輸入存過名稱的關鍵詞,按回車鍵搜尋要除錯的存過,不停的回車,直到找到想要除錯的存過。
-
找到想要除錯的存過,左鍵單擊選中該存過(圖中位置1),然後右鍵單擊該存過,從彈出選單中選擇“Test”項(圖中位置2)。
-
單擊“Test”後,PL\SQL會開啟除錯介面,圖中位置1的按鈕就是開始除錯的按鈕,在除錯之前要填寫存過的引數,位置2就是填寫引數的地方,如果有多個引數,會有多行引數框,按引數名填寫相應的引數即可。
-
填寫完引數,單擊開始除錯按鈕後,除錯的介面會發生一些變化。圖中位置1的變化,說明存過已經處於執行狀態,別人不能再編譯或者執行。位置2的按鈕就是執行按鈕,單擊這個按鈕存過會執行完成或者遇到bug跳出,否則是不會停下來的,除錯時不會用這個按鈕的。位置3的按鈕才是關鍵——單步執行,就是讓程式碼一行一行的執行,位置4的按鈕是跳出單步執行,等待下一個指令。
-
單擊“單步執行”,存過開始單步執行。介面中每一次執行的程式碼會高亮顯示(圖中位置1),如果想要看某個變數具體的值,就在位置2的地方輸入該變數名,然後變數的值會顯示在位置3的地方。
-
除錯的時候,每一次單步執行的時候要記一下執行程式碼的行數,圖中位置3的數字就是當前執行程式碼的行數,就是第幾行。如果過程單步執行到某行後,再單步執行的時候,存過就退出,那麼錯誤就在該行的下一行。
-
程式碼執行到24行,在往下執行時,直接轉到exception的地方,也就是異常處理的部分。
-
這說明我們程式碼中的錯誤在24和25行上,我們開啟存過,瀏覽到24行和25行附近,發現25行和24行使用了兩個變數,記住那兩個變數。重新開始除錯過程。
-
單步的執行時候把剛才那兩個變數名填寫到變數檢視框,一邊觀察變數值變化,一邊單步執行,執行到24行的時候,發現一個變數已經有值了,而另一個變數的值為null。錯誤原因明朗了吧?就是變數沒有賦值或者初始話,給該變數賦值後存過就不報錯了。
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/sql, command 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
https://www.cnblogs.com/sumsen/archive/2012/06/13/2547512.html