如何使用SQL Developer執行SQL語句
在執行一條SQL語句之后,你可能想要保存它。這樣你可以在以后打開并運行它或基于它來寫一條新的SQL語句。要保存一條SQL語句,你可以使用在$2-11中描述的標準窗口技術。
打開一個已保存的文件,你可以用Open命令。例如,在這一節中,文件打開對話框顯示了在第三章保存的SQL語句。它們被保存在目錄scriptsch03下,這個目錄在你下載并安裝本書的源碼時創建。本節中的截屏顯示了本章中打開的三個文件頁簽。注意這些文件的擴展名都是sql。
在你找開兩個或多個SQL工作表后,你可以通過點擊合適的選項卡來切換SQL語句。或者,你也可以從連接列表下邊的文件列表中選擇SQL語句。這樣,你可以從一個SQL語句向另一個SQL語句中進行代碼的剪切,復制,粘貼。當你打開一個SQL文件,SQL Developer不會為此文件中的SQL語句設置連接。結果是你必須通過連接列表為此文件中的SQL語句指定一個連接。如果你不那樣做的話,當你執行SQL語句時,SQL Developer將會提示你選擇一個連接。
要將一條新的SQL語句保存到文件,你可以使用Save命令。要保存一條修改過的SQL語句到它原來所在的文件,你也只需用Save命令。如果要將一條修改過的SQL語句到一個新的文件,你就需要用Save As命令。
要設置用來保存新的SQL語句的默認目錄,你可以按照本書所描述的那樣選擇Tools?Preferences命令。但是要注意,對于已經打開的文件是無法設置默認目錄的。
對于打開對話框和保存對話框,你可以通過點擊圖標來指定一個最近使用的目錄。例如在本節中,打開對話框顯示目錄ch02,ch03,db-setup都是最近使用過的。因此,你可以點擊其中的一個,輕而易舉地將其指定為最近使用的目錄。
轉載僅供參考,版權屬于原作者。祝你愉快,滿意請采納哦
如何直接執行SQL語句
using (SqlConnection con = new SqlConnection(*tionStrings["default"].ConnectionString))
{ SqlCommand cmd = new SqlCommand();
*tion = con;
sqlStr = @"";
*dText = sqlStr ;
*dType = *;
gs = *eNonQuery(); }
這個就是直接執行sql語句的代碼!
如何獲得執行后的SQL語句
如果sql是在程序中直接寫的,那就簡單,全局變量就好
如果sql實在數據庫中的,那么可以考慮將sql存入表中,并存儲相應的需要的信息,生成一個類似的日志表,在程序中讀取就行,此方式在程序中也適用
如:
declare @sql varchar(2000) = 'select * from tb'
exec(@sql)
insert into [日志表](sql_text)
values(@sql)
怎么獲取執行的sql語句
1、select *,*,*#,*e from v$session a,v$process b where * = * and *e='yz';
PID SID SERIAL# MACHINE
9497 49 3406 yz
2、利用10046事件開始跟蹤
SQL>execute *_*_ev(49, 3406,10046,1,'');
PL/SQL procedure successfully completed.
、這時候你可以運行應用程序,對于web 應用你就可以打開你認為性能比較差頁面。
4、如果你要查看這段時間執行了哪些sql語句,可以執行下面的語句結束跟蹤
SQL>execute *_*_ev(49,3406,10046,0,'');
PL/SQL procedure successfully completed.
5、SQL trace 工具會收集這個過程中執行的SQL的性能狀態數據,記錄到一個跟蹤文件中.這個跟蹤文件提供了許多有用的信息,例如解析次數.執行次數,CPU使用時間等。
6、這時候你可以通過下面的語句獲得產生的跟蹤文件所在的目錄
SQL> select value from v$parameter where name = 'user_dump_dest';
VALUE
--------------------------------------------------------------------------------
/opt/oracle/admin/ocn/udump
7、在/opt/oracle/admin/ocn/udump下找到yzoracle_ora_*。9497是你當前應用的spid。
8、注意yzoracle_ora_*是不可讀的,我們需要執行oracle的tkprof命令,將yzoracle_ora_*轉化為我們可讀的文本文件。
tkprof yzoracle_ora_* yzoracle_ora_*
這樣你就可以在yzoracle_ora_*文件中看到所有的sql語句執行次數,CPU使用時間等數據。
怎樣優化SQL語句的執行
環境:oracle 817 + linux + 陣列柜 swd_billdetail 表5000萬條數據 SUPER_USER 表2800條數據 連接列上都有索引,而且super_user中的一條對應于swd_billdetail表中的很多條記錄表與索引都做了分析。
實際應用的查詢為: select a。CHANNEL, B。
user_class from swd_billdetail B, SUPER_USER A where A。cn = B。
cn; 這樣在分析時導致查詢出的數據過多,不方便,所以用count(a。 CHANNEL||B。
user_class)來代替,而且count(a。CHANNEL||B。
user_class)操作本身并不占用過多的時間,所以可以接受此種替代。 利用索引查詢出SWD_BILLDETAIL表中所有記錄的方法 SQL> select count(id) from SWD_BILLDETAIL; COUNT(ID) ---------- 53923574 Elapsed: 00:02:166。
00 Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=18051 Card=1) 1 0 SORT (AGGREGATE) 2 1 INDEX (FAST FULL SCAN) OF 'SYS_C001851' (UNIQUE) (Cost=18051 Card=54863946) Statistics ---------------------------------------------------------- 0 recursive calls 1952 db block gets 158776 consistent gets 158779 physical reads 1004 redo size 295 bytes sent via SQL*Net to client 421 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 1 sorts (memory) 0 sorts (disk) 1 rows processed 利用全表掃描從SWD_BILLDETAIL表中取出全部數據的方法。 SQL> select count(user_class) from swd_billdetail; COUNT(USER_CLASS) ----------------- 53923574 Elapsed: 00:11:703。
07 Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=165412 Card=1 Bytes=2) 1 0 SORT (AGGREGATE) 2 1 TABLE ACCESS (FULL) OF 'SWD_BILLDETAIL' (Cost=165412 Card=54863946 Bytes=109727892) Statistics ---------------------------------------------------------- 0 recursive calls 8823 db block gets 1431070 consistent gets 1419520 physical reads 0 redo size 303 bytes sent via SQL*Net to client 421 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 1 sorts (memory) 0 sorts (disk) 1 rows processed select count(a。 CHANNEL||B。
user_class) from swd_billdetail B, SUPER_USER A where A。cn = B。
cn; EXEC_ORDER PLANLINE ---------- ----------------------------------------------------------------------------------------------------------- 6 SELECT STATEMENT OPT_MODE:CHOOSE (COST=108968,CARD=1,BYTES=21) 5 SORT (AGGREGATE) (COST=,CARD=1,BYTES=21) 4 NESTED LOOPS (COST=108968,CARD=1213745,BYTES=25488645) 1 TABLE ACCESS (FULL) OF 'SWORD。 SUPER_USER' (COST=2,CARD=2794,BYTES=27940) 3 TABLE ACCESS (BY INDEX ROWID) OF 'SWORD。
SWD_BILLDETAIL' (COST=39,CARD=54863946,BYTES=603503406) 2 INDEX (RANGE SCAN) OF 'SWORD。 IDX_DETAIL_CN' (NON-UNIQUE) (COST=3,CARD=54863946,BYTES=) 這個查詢耗費的時間很長,需要1個多小時。
運行后的信息如下: COUNT(A。CHANNEL||B。
USER_CLASS) ------------------------------ 1186387 Elapsed: 01:107:6429。 87 Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=108968 Card=1 Bytes=21) 1 0 SORT (AGGREGATE) 2 1 NESTED LOOPS (Cost=108968 Card=1213745 Bytes=25488645) 3 2 TABLE ACCESS (FULL) OF 'SUPER_USER' (Cost=2 Card=2794Bytes=27940) 4 2 TABLE ACCESS (BY INDEX ROWID) OF 'SWD_BILLDETAIL' (Cost=39 Card=54863946 Bytes=603503406) 5 4 INDEX (RANGE SCAN) OF 'IDX_DETAIL_CN' (NON-UNIQUE) (Cost=3 Card=54863946) Statistics ---------------------------------------------------------- 0 recursive calls 4 db block gets 1196954 consistent gets 1165726 physical reads 0 redo size 316 bytes sent via SQL*Net to client 421 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 2 sorts (memory) 0 sorts (disk) 1 rows processed 將語句中加入hints,讓oracle的優化器使用嵌套循環,并且大表作為驅動表,生成新的執行計劃: select /*+ ORDERED USE_NL(A) */ count(a。
CHANNEL||B。user_class) from swd_billdetail B, SUPER_USER A where A。
cn = B。cn; EXEC_ORDER PLANLINE ---------- ----------------------------------------------------------------------------------------------------- 6 SELECT STATEMENT OPT_MODE:CHOOSE (COST=109893304,CARD=1,BYTES=21) 5 SORT (AGGREGATE) (COST=,CARD=1,BYTES=21) 4 NESTED LOOPS (COST=109893304,CARD=1213745,BYTES=25488645) 1 TABLE ACCESS (FULL) OF 'SWORD。
SWD_BILLDETAIL' (COST=165412,CARD=54863946,BYTES=603503406) 3 TABLE ACCESS (BY INDEX ROWID) OF 'SWORD。SUPER_USER。
SQL語句是按什么順序執行的
分析器會先看語句的第一個詞,當它發現第一個詞是SELECT關鍵字的時候,它會跳到FROM關鍵字,然后通過FROM關鍵字找到表名并把表裝入內存。
接著是找WHERE關鍵字,如果找不到則返回到SELECT找字段解析,如果找到WHERE,則分析其中的條件,完成后再回到SELECT分析字段。 最后形成一張我們要的虛表。
其它的先不說了,只說WHERE。 WHERE關鍵字后面的是條件表達式。
如果學過C語言等編程語言就會知道,條件表達式計算完成后,會有一個返回值,即非0或0,非0即為真(true),0即為假(false)。同理WHERE后面的條件也有一個返回值,真或假,來確定接下來執不執行SELECT。
例: SELECT * FROM STUDENT WHERE SNO = '1'; 分析器先找到關鍵字SELECT,然后跳到FROM關鍵字將STUDENT表導入內存,并通過指針p1找到第一條記錄,接著找到WHERE關鍵字計算它的條件表達式,如果為真那么把這條記錄裝到一個虛表當中,p1再指向下一條記錄。 如果為假那么p1直接指向下一條記錄,而不進行其它操作。
一直檢索完整個表,關把虛表返回給用戶。 再說EXISTS謂詞,EXISTS謂詞也是條件表達式的一部分。
當然它也有一個返回值(true或false)。 例: SELECT Sname FROM Student WHERE EXISTS (SELECT * FROM SC WHERE SC。
Sno = Student。Sno AND SC。
Cno = '1'); 這是一個SQL語句的嵌套使用,但和上面說的SQL語句的執行過程也是相同的。嵌套的意思也就是說當分析主SQL語句(外面的那個SELECT,我們權且先這么叫它)到WHERE關鍵字的時候,又進入了另一個SQL語句中。
那么也就是說,分析器先找到表Student并裝入內存,一個指針(例如p1)指向Student表中的第一條記錄。然后進入WHERE里分析里面的SQL語句,再把SC表裝入內存,另一個指針(例如p2)指向SC表中的第一條記錄,分析WHERE后面的條件表達式,依次進行分析,最后分析出一個虛表2,也就變成 SELECT Sname FROM Student WHERE EXISTS 虛表2 如果虛表為空表,EXISTS 虛表2 也就為false,不返回到SELECT,而p1指向下一條記錄。
如果虛表2不為空也就是有記錄,那么EXISTS 虛表2 為true同,返回到SELECT并把p1指向的記錄添加到主SQL語句的虛表1當中。
如何動態執行sql語句
這里只介紹動態SQL的使用。
關于動態SQL語句的語法,參見:http://**chiclewu/article/details/160971331.什么是時候需要使用動態SQL?SQL文本在編譯時是未知的。例如,SELECT語句包含的標識符(如表名)在編譯時是未知的,或者WHERE子句的條件數量在編譯時是未知。
靜態SQL不支持例如,在PL/SQL中用靜態SQL只能執行查詢以及DML語句。如果想要執行DDL語句,只能使用動態SQL。
當讓使用靜態SQL,也有它的好處:編譯成功驗證了靜態SQL語句引用有效的數據庫對象和訪問這些對象的權限編譯成功創建了模式對象的依賴關系*E IMMEDIATE語句EXECUTE IMMEDIATE語句的意思是使用本地動態SQL處理大多數動態SQL語句。如果動態SQL語句是自包含的(也就是說,它的綁定參數沒有占位符,并且結果不可能返回錯誤),則EXECUTE IMMEDIATE語句不需要子句。
如果動態SQL語句包行占位符綁定參數,每個占位符在EXECUTE IMMEDIATE語句的子句中必須有一個相應的綁定參數,具體如下:如果動態SQL語句是一個最多只能返回一行的SELECT語句,OUT綁定參數放置在INTO子句,IN綁定參數放置在USING子句。如果動態SQL語句是一個可以返回多行的SELECT語句,OUT綁定參數放置在BULK COLLECT INTO子句,IN綁定參數放置在USING子句。
如果動態SQL語句是一個除了SELECT以外的其他DML語句,且沒有RETURNING INTO子句,所有的綁定參數放置在USING子句中。如果動態SQL還語句一個匿名PL/SQL塊或CALL語句,把所有的綁定參數放置在USING子句中。
如果動態SQL語句調用一個子程序,請確保:每個對應子程序參數占位符的綁定參數與子程序參數具有相同的參數模式和兼容的數據類型。綁定參數不要有SQL不支持的數據類型(例如,布爾類型,關聯數組,以及用戶自定的記錄類型)USING子句不能包含NULL字面量。
如果想要在USING子句中使用NULL值,可以使用位初始化的變量或者函數顯示將NULL轉換成一個有類型的值。2.1動態SQL語句是一個最多只能返回一行的SELECT語句使用動態SQL語句返回單列,查詢SCOTT的薪水:declare v_sql_text varchar2(1000); v_sal number; v_ename *%type := 'SCOTT'; begin v_sql_text := 'select * from emp e where * = :ename'; execute immediate v_sql_text into v_sal using v_ename; dbms_*_line(v_ename || ':' || v_sal);end;使用動態SQL返回一條記錄,查詢SCOTT的基本信息:declare v_sql_text varchar2(1000); v_ename *%type := 'SCOTT'; vrt_emp emp%rowtype; begin v_sql_text := 'select * from emp e where * = :ename'; execute immediate v_sql_text into vrt_emp using v_ename; dbms_*_line(v_ename || '的基本信息:'); dbms_*_line('工號:' || vrt_*); dbms_*_line('工資:' || vrt_*); dbms_*_line('入職日期:' || vrt_*te);end;2.2動態SQL語句是一個可以返回多行的SELECT語句2.2.1只有一個占位符使用動態SQL語句返回多行記錄,查詢30部門的員工基本信息:declare v_sql_text varchar2(1000); v_deptno *%type := 30; type nt_emp is table of emp%rowtype; vnt_emp nt_emp; begin v_sql_text := 'select * from emp e where * = :deptno'; execute immediate v_sql_text bulk collect into vnt_emp using v_deptno; for i in 1 .. vnt_* loop dbms_*_line(vnt_emp(i).ename || '的基本信息:'); dbms_*_line('工號:' || vnt_emp(i).empno); dbms_*_line('工資:' || vnt_emp(i).sal); dbms_*_line('入職日期:' || vnt_emp(i).hiredate); dbms_*_line(''); end loop;end2.2.2多個占位符查詢20部門工資大于2000的員工基本信息:declare v_sql_text varchar2(1000); v_deptno *%type := 20; v_sal number := 2000; type nt_emp is table of emp%rowtype; vnt_emp nt_emp; begin v_sql_text := 'select * from emp e where *>:sal and * = :deptno'; execute immediate v_sql_text bulk collect into vnt_emp using v_sal, v_deptno; --注意綁定多個變量時,綁定變量只與占位符位置有關,與占位符名稱無關, for i in 1 .. vnt_* loop dbms_*_line(vnt_emp(i).ename || '的基本信息:'); dbms_*_line('工號:' || vnt_emp(i).empno); dbms_*_line('工資:' || vnt_emp(i).sal); dbms_*_line('入職日期:' || vnt_emp(i).hiredate); dbms_*_line(''); end loop;注意:對于SQL文本,占位符名稱是沒有意義的,綁定變量與占位符名稱無關,只與占位符的配置有關。
即使有多個相同名稱占位符,也需要每個占位符對應一個綁定變量。對于PL/SQL塊,占位符名稱是有意義的,相同名稱的占位符,只需要第一個占位符綁定變量。
2.3動態SQL語句是一個帶有RETURNING子句的DML語句KING的工資增長20%,返回增長后的工資:eclare v_sql_text varchar2(1000); v_sal 。
MYSQL數據庫如何執行SQL語句
select @a=DRClass1, @b=DRClass2, @c=DRClass3, @d=DRClass4, @e=DRClass5 from Teacher Where TeacherID = @TeacherID create table classname(classname char(50)) insert into classname (classname) values (@a) if (@b is not null) begin insert into classname (classname) values (@b) if (@c is not null) begin insert into classname (classname) values (@c) if (@d is not null) begin insert into classname (classname) values (@d) if (@e is not null) begin insert into classname (classname) values (@e) end end end end select * from classname 以上這些SQL語句能不能轉成一個存儲過程?我自己試了下 ALTER PROCEDURE Pr_GetClass @TeacherID int, @a char(50), @b char(50), @c char(50), @d char(50), @e char(50) as select @a=DRClass1, @b=DRClass2, @c=DRClass3, @d=DRClass4, @e=DRClass5 from Teacher Where TeacherID = @TeacherID DROP TABLE classname create table classname(classname char(50)) insert into classname (classname) values (@a) if (@b is not null) begin insert into classname (classname) values (@b) if (@c is not null) begin insert into classname (classname) values (@c) if (@d is not null) begin insert into classname (classname) values (@d) if (@e is not null) begin insert into classname (classname) values (@e) end end end end select * from classname 但是這樣的話,這個存儲過程就有6個變量,實際上應該只提供一個變量就可以了 主要的問題就是自己沒搞清楚 @a,@b,@C,@d 等是臨時變量,是放在as后面重新做一些申明的,而不是放在開頭整個存儲過程的變量定義。
(標準化越來越近了):namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> 實戰SQL語句收集(不斷更新中--) 前言:這里將我編程實踐中遇到的有價值的sql語句一路記下來,一方面方便自己查用,一方面也夯實下即將遺忘的回憶。整個過程中我會不斷更新,直到不能再加為止,同時,這里只記錄最實用的咚咚,不效仿學院派的那一套。
轉載請注明出處華閱文章網 » 怎么執行sql語句.