版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、Oracle 存儲過程總結1、創(chuàng)建存儲過程create or replace procedure test(var_name_1 in type,var_name_2 out ty pe) as- 聲明變量 ( 變量名 變量類型 )begin- 存儲過程的執(zhí)行體end test;打印出輸入的時間信息E.g:create or replace procedure test(workDate in Date) isbegindbms_output.putline(The input date is:|to_date(workDate, yyyy-mm-d d);end test;2、變量賦值變量名
2、 := 值;E.g:create or replace procedure test(workDate in Date) isx number(4,2);beginx := 1;end test;3、判斷語句 :if 比較式 then begin end; end if;E.gcreate or replace procedure test(x in number) isbeginif x >0 thenbeginx := 0 - x;end;end if;if x = 0 thenbegin x: = 1;end;end if; end test;4、For 循環(huán)For . in .
3、LOOP- 執(zhí)行語句 end LOOP;(1) 循環(huán)遍歷游標create or replace procedure test() asCursor cursor is select name from student;name varchar(20);beginfor name in cursor LOOPbegindbms_output.putline(name);end; end LOOP; end test;(2) 循環(huán)遍歷數組create or replace procedure test(varArray in myPackage.TestArray) as-( 輸入參數 varAr
4、ray 是自定義的數組類型,定義方式見標題 6)i number;begini := 1;-存儲過程數組是起始位置是從1開始的,與java、C、C+等語言不同。因為在 Oracle 中本是沒有數組的概念的,數組其實就是一張-表(Table),每個數組元素就是表中的一個記錄,所以遍歷數組時就相當于從表 中的第一條記錄開始遍歷for i in 1.varArray.count LOOP dbms_output.putline(The No. | i |record in varArray is: |varArray(i);end LOOP;end test;5、While 循環(huán)while 條件語句
5、 LOOPbeginend;end LOOP;E.gcreate or replace procedure test(i in number) asbeginwhile i < 10 LOOPbegini:= i + 1;end;end LOOP;end test;6、數組首先明確一個概念: Oracle 中本是沒有數組的概念的,數組其實就是一張表 (Ta ble), 每個數組元素就是表中的一個記錄。使用數組時,用戶可以使用 Oracle 已經定義好的數組類型,或可根據自己的需 要定義數組類型。(1) 使用 Oracle 自帶的數組類型x array; - 使用時需要需要進行初始化e.g
6、:create or replace procedure test(y out array) isx array;beginx := new array();y := x;end test;(2) 自定義的數組類型 ( 自定義數據類型時, 建議通過創(chuàng)建 Package 的方式實現, 以便于管理 )E.g ( 自定義使用參見標題 4.2) create or replace package myPackage is- Public type declarations type info is record( name varchar(20), y number);type TestArray i
7、s table of info index by binary_integer; - 此處聲 明了一個 TestArray 的類型數據,其實其為一張存儲 Info 數據類型的 Table 而 已,及 TestArray 就是一張表,有兩個字段,一個是name 一個是y。需要注意的是此處使用了 Index by binary_integer編制該Table 的索引項,也可以不寫,直接寫成: type TestArray istable of info ,如果不寫的話使用數組時就需要進行初始化: varArray myPackage.TestArray; varArray := new myPac
8、kage.TestArray();end TestArray;7. 游標的使用 Oracle 中 Cursor 是非常有用的, 用于遍歷臨時表中的查詢結果。 其相關方法和屬性也很多,現僅就常用的用法做一二介紹:(1)Cursor 型游標( 不能用于參數傳遞 )create or replace procedure test() iscusor_1 Cursor is select std_name from student where .; -Cursor的使用方式 1 cursor_2 Cursor;beginselect class_name into cursor_2 from clas
9、s where .; -Cursor的使用方式 2可使用 For x in cursor LOOP end LOOP; 來實現對 Cursor 的遍歷end test;SYS_REFCURS型游標,該游標是Oracle以預先定義的游標,可作出參數進行傳遞create or replace procedure test(rsCursor out SYS_REFCURSOR) iscursor SYS_REFCURSOR; name varhcar(20);beginOPEN cursor FOR select name from student where . -SYS_REFCURSOR只能通
10、過OPEN方法來打開和賦值LOOPfetch cursor into name -SYS_REFCURSOR 只能通過 fetch into 來打開和 遍歷 exit when cursor%NOTFOUND;-SYS_REFCURSOR中可使用三個狀態(tài)屬性:-%NOTFOUND(未找到記錄信息)FOUND找到記錄信息)-%ROWCOUNT(然后當前游標所指向的行位置 )dbms_output.putline(name);end LOOP;rsCursor := cursor;end test;下面寫一個簡單的例子來對以上所說的存儲過程的用法做一個應用: 現假設存在兩張表,一張是學生成績表 (
11、studnet) ,字段為: stdId,math,artic le,language,music,sport,total,average,step 一張是學 生課外成績表 (out_school), 字段為 :stdId,parctice,comment 通過存儲過程自動計算出每位學生的總成績和平均成績, 同時,如果學生在課外 課程中獲得的評價為A,就在總成績上加20分。create or replace procedure autocomputer(step in number) isrsCursor SYS_REFCURSOR;commentArray myPackage.myArray
12、;math number;article number;language number;music number;sport number;total number;average number;stdId varchar(30);record myPackage.stdInfo;i number;begini := 1;get_comment(commentArray); - 調用名為 get_comment() 的存儲過程獲取學生 課外評分信息OPEN rsCursor for select stdId,math,article,language,music,sport from stud
13、ent t where t.step = step;LOOPfetch rsCursor into stdId,math,article,language,music,sport; exit whe n rsCursor%NOTFOUND;total := math + article + language + music + sport;for i in mentArray.count LOOPrecord := commentArray(i);if stdId = record.stdId thenbeginif ment = 'A' thenbegin
14、total := total + 20;go to next; -使用 go to 跳出 for 循環(huán)end;end if;end;end if;end LOOP;<<continue>> average := total / 5;update student t set t.total=total and t.average = average where t.s tdId = stdId;end LOOP;end;end autocomputer;- 取得學生評論信息的存儲過程create or replace procedure get_comment(comme
15、ntArray out myPackage.my Array) isrs SYS_REFCURSO;Rrecord myPackage.stdInfo;stdId varchar(30);comment varchar(1);i number;beginopen rs for select stdId,comment from out_schooli := 1;LOOPfetch rs into stdId,comment; exit when rs%NOTFOUND; record.stdId := stdId;ment := comment; recommentArray(i) := re
16、cord; i:=i + 1;end LOOP; end get_comment;- 定義數組類型 myArraycreate or replace package myPackage is begin type stdInfo is record(stdId varchar(30),comment varchar(1); type myArray is table of stdInfo index by binary_integer; end myPackage;項目中有涉及存儲過程對字符串的處理, 所以就將在網上查找到的資料匯總, 做一個信 息拼接式的總結。以下信息均來自互聯(lián)網,貼出來一則
17、自己保存以待以后使用,一則供大家分享。 字符函數返回字符值這些函數全都接收的是字符族類型的參數(CHR除外)并且返回字符值.除了特別說明的之外,這些函數大部分返回 VARCHAR類型的數值. 字符函數的返回類型所受的限制和基本數據庫類型所受的限制是相同的。 字符型變量存儲的最大值:VARCHAR鐵值被限制為 2000字符(ORACLE 8中為4000字符)CHAR數值被限制為 255字符(在ORACLE中是2000)long 類型為 2GBClob 類型為 4GB1、CHR語法 : chr(x)功能:返回在數據庫字符集中與X擁有等價數值的字符。CHR和ASCII是一對反函數。經過CHR轉換后的
18、字符再經過 ASCII轉換又得到了原來的字符。使用位置:過程性語句和 SQL語句。2、CONCAT語法: CONCAT( string1,string2)功能:返回 string1 ,并且在后面連接 string2 。使用位置:過程性語句和SQL語句。3、INITCAP語法: INITCAP( string )功能:返回字符串的每個單詞的第一個字母大寫而單詞中的其他字母小寫的 string 。單詞 是用 . 空格或給字母數字字符進行分隔。不是字母的字符不變動。使用位置:過程性語句和SQL語句。4、LTRIM語法: LTRIM( string1,string2)功能:返回刪除從左邊算起出現在 s
19、tring2 中的字符的 string1 。 String2 被缺省設置為單 個的空格。數據庫將掃描 string1 ,從最左邊開始。當遇到不在string2 中的第一個字符,結果就被返回了。LTRIM的行為方式與RTRIM很相似。使用位置:過程性語句和SQL語句。5、NLS_INITCAP語法: NLS_INITCAP( string,nlsparams)功能:返回字符串每個單詞第一個字母大寫而單詞中的其他字母小寫的string , nlsparams指定了不同于該會話缺省值的不同排序序列。如果不指定參數,則功能和INITCAP 相同。 Nlsparams 可以使用的形式是:NLS_SORT
20、=sort'這里 sort 制訂了一個語言排序序列。使用位置:過程性語句和SQL語句。6、NLS_LOWER語法: NLS_LOWE(Rstring,nlsparams)功能:返回字符串中的所有字母都是小寫形式的 string 。不是字母的字符不變。Nlsparams參數的形式與用途和 NLS_INITCAP中的nIsparams參數是相同的。如果 nIsparams沒有被包含,那么 NLS_LOWE所作的處理和LOWER目同。使用位置;過程性語句和SQL語句。7、NLS_UPPER語法: nls_upper ( string,nlsparams)功能:返回字符串中的所有字母都是大寫的
21、形式的 string 。不是字母的字符不變。 nlspara ms參數的形式與用途和 NLS_INITCAP中的相同。如果沒有設定參數,則 NLS_UPPE功能和UPPER相同。使用位置:過程性語句和SQL語句。8、REPLACE語法: REPLAC(E string , search_str,replace_str )功能: 把 string 中的所有的子字符串 search_str 用可選的 replace_str 替換, 如果沒有指 定 replace_str ,所有的 string 中的子字符串search_str都將被刪除。REPLACED TRANSLAT所提供的功能的一個子集。使
22、用位置:過程性語句和SQL語句。9、RPAD語法: RPAD(string1,x,string2)功能:返回在 X字符長度的位置上插入一個string2 中的字符的stringl 。如果string2 的長度要比 X 字符少,就按照需要進行復制。如果 string2多于 X 字符,則僅 string1 前面的 X 各字符被使用。如果沒有指定 string2 ,那么使用空格 進行填充。 X 是使用顯示長度可以比字符串的實際長度要長。RPAD的行為方式與LPAD很相似,除了它是在右邊而不是在左邊進行填充。使用位置:過程性語句和SQL語句。10、RTRIM語法: RTRIM (string1,str
23、ing2)功能 : 返回刪除從右邊算起出現在 string1 中出現的字符 string2. string2 被缺省設置為 單個的空格 .數據庫將掃描 string1, 從右邊開始 . 當遇到不在string2 中的第一個字符,結果就被返回了 RTRIM的行為方式與LTRIM很相似. 使用位置:過程性語句和SQL語句。11、SOUNDEX語法 : SOUNDEX( string )功能 : 返回 string 的聲音表示形式 . 這對于比較兩個拼寫不同但是發(fā)音類似的單詞而言很 有幫助 .使用位置:過程性語句和SQL語句。12、SUBSTR 語法 : SUBSTR (string,a,b )功能
24、:返回從字母為值 a開始b個字符長的string的一個子字符串.如果a是0,那么它就 被認為從第一個字符開始 . 如果是正數 , 返回字符是從左邊向右邊進行計算的 . 如果 b 是負數 , 那么返回的字符是從 string 的末尾開始從右向左進行 計算的 . 如果 b 不存在 , 那么它將缺省的設置為整個字符串.如果b小于1,那么將返回NULL.如果a或b使用了浮點數,那么該數值將在處理進行以前 首先被卻為一個整數 .使用位置:過程性語句和SQL語句。13、TRANSLA TE語法 : TRANSLATE(string,from_str,to_str)功能 : 返回將所出現的 from_str
25、 中的每個字符替換為 to_str 中的相應字符以后的 str ing. TRANSLATE是REPLACE所提供的功能的一個超集 如果 from_str 比 to_str 長, 那么在 from_str 中而不在 to_str 中而外的字符將從 string 中被刪除 , 因為它們沒有相應的替換字符 . to_str 不能為空.Oracle把空字符串認為是 NULL,并且如果TRANSLATE的任何參數為 NULL,那么結果也是 N ULL.使用位置:過程性語句和SQL語句。14、UPPER語法 : UPPER(string )功能:返回大寫的string.不是字母的字符不變.如果strin
26、g 是CHAR數據類型的,那么結果 也是CHAR類型的.如果string 是VARCHAR類型的,那么結果也是VARCHAR類型的.使用位置:過程性語句和 SQL語句。字符函數返回數字這些函數接受字符參數回數字結果.參數可以是CHAR或者是VARCHAR型的.盡管實際下許 多結果都是整數值 , 但是返回結果都是簡單的 NUMBER類型的 , 沒有定義任何的精度或刻度范圍 .16、ASCII語法 : ASCII ( string )功能 : 數據庫字符集返回 string 的第一個字節(jié)的十進制表示 . 請注意該函數仍然稱作為 ASCII. 盡管許多字符集不是 7 位 ASCII.CHR 和 AS
27、CII 是互為相反的函數.CHR得到給定字符編碼的響應字符.ASCII得到給定字符的字符編碼.使用位置:過程性語句和 SQL語句。17、INSTR語法 : INSTR ( string1, string2a,b)功能 : 得到在 string1 中包含 string2 的位置 . string1 時從左邊開始檢查的 , 開始的位置 為 a, 如果 a 是一個負數 , 那么 string1 是從右邊開始進行掃描的.第b次出現的位置將被返回.a和b都缺省設置為1,這將會返回在string1中第一 次出現 string2 的位置 . 如果 string2 在 a 和 b 的規(guī)定下沒有找到,那么返回0
28、.位置的計算是相對于 string1 的開始位置的,不管a和b的取值是多少. 使用位置:過程性語句和 SQL語句。18、INSTRB語法: INSTRB (string1, string2a,b)功能:和INSTR相同,只是操作的對參數字符使用的位置的是字節(jié)使用位置:過程性語句和 SQL語句。19、LENGTH語法 : LENGTH (string )功能:返回string的字節(jié)單位的長度.CHAR數值是填充空格類型的,如果string 由數據類 型CHAR它的結尾的空格都被計算到字符串長度中間如果string 是NULL,返回結果是NULL,而不是0.使用位置:過程性語句和 SQL語句。20
29、、LENGTHB語法 : LENGTHB( string )功能:返回以字節(jié)為單位的 string的長度.對于單字節(jié)字符集 LENGTH岳口 LENGTH1樣的.使用位置:過程性語句和 SQL語句。21、NLSSORT語法 : NLSSORT(string,nlsparams)功能: 得到用于排序 string 的字符串字節(jié) .所有的數值都被轉換為字節(jié)字符串 , 這樣在不同 數據庫之間就保持了一致性 . Nlsparams 的作用和NLS_INITCAP中的相同.如果忽略參數,會話使用缺省排序.使用位置:過程性語句和 SQL語句。oracle 存儲過程的基本語法1. 基本結構CREATE OR
30、 REPLACE PROCEDURE存儲過程名字(參數 1 IN NUMBER,參數 2 IN NUMBER) IS變量 1 INTEGER :=0;變量 2 DATE;BEGINEND 存儲過程名字2.SELECT INTO STATEMENT將 select 查詢的結果存入到變量中,可以同時將多個列存儲多個變量中,必須有一條 記錄,否則拋出異常 ( 如果沒有記錄拋出 NO_DATA_FOUND)例子:BEGINSELECT col1,col2 into 變量 1, 變量 2 FROM typestruct where xxx;EXCEPTIONWHEN NO_DATA_FOUND THEN
31、xxxx;END;3.IF 判斷IF V_TEST= 1 THENBEGINdo som ethingEND;END IF;4. while 循環(huán)WHILE V_TEST =1 LOOPBEGINXXXXEND;END LOOP;5. 變量賦值V_TEST := 123;6. 用 for in 使用 cursorISCURSOR cur IS SELECT * FROM xxx;BEGINFOR cur_result in cur LOOPBEGINV_SUM := cur_result. 列名 1+ c ur_result. 列名 2END;END LOOP;END;7. 帶參數的 curs
32、orCURSOR C_USER(C_ID NUMBER) IS SELECT NAME FROM USER WHERETYPEID=C_ID;OPEN C_USER(變量值);LOOPFETCH C_USER INTO V_NAME;EXIT FETCH C_USER%NOTFOUND;do som ethingEND LOOP;CLOSE C_USER;8. 用 pl/sql developer debug連接數據庫后建立一個 Test WINDOW在窗口輸入調用 SP的代碼,F9開始debug,CT RL+N單步調試關于oracle存儲過程的若干問題備忘1. 在oracle中,數據表別名不
33、能加as,如:select a.appnam e from appinfo a; -正確select a.appnam e from appinfo as a;- 錯誤也許,是怕和oracle中的存儲過程中的關鍵字as沖突的問題吧2. 在存儲過程中,select某一字段時,后面必須緊跟into,如果select整個記錄,利用游標的話就另當別論了。select af.keynode into kn from APPFOUNDATION af where af.appid = aid and af.foundationid= fid;- 有 into,正確編譯一 select af.keynode
34、from APPFOUNDATION af where af.appid = aid and af.foundationid = fid;-沒有 into,編譯報錯,提示: Compilation一 Error: PLS -00428 : an INTO clause is expected in this SELECT statem ent3. 在利用o.語法時,必須先確保數據庫中有該條記錄,否則會報岀"no datafound"異常。可以在該語法之前,先利用 select cou nt(*) from查看數據庫中是否存在該記錄,如果存在,再利用 se
35、o.4. 在存儲過程中,別名不能和字段名稱相同,否則雖然編譯可以通過,但在運行階段會報錯select key nodeinto kn from APPFOUNDATION where appid = aid and foun datio nid=fid;-正確運行select af.keynodeinto kn from APPFOUNDATION af where af.appid=appid and af.foundationid=foundationid;-運行階段報錯,提示ORA -01422 :exact fetch returns m ore than reques
36、tednumberof rows);如果在存儲過程中,使用如下語句:select sum (vcount) into fcount fromA where bid='xxxxxx'如果A表中不存在 bid="xxxxxx"的記錄,則fcount =null(即使fcount定義時設置了默認值,end if;這樣就一切ok 了6.Hibernate 調用oracle 存儲過程this .pnumberManager.getHibernateTemplate().execute(new HibernateCallback() public Object doln
37、Hibernate(Session session)throwsHiber nateExceptio n, SQLExcepti on CallableStatement cs = sessi on.conn ecti on().prepareCall("call modifyappp number_rema in( ?)");cs.setString(1, foundationid);cs.execute();return null ;);oracle存儲過程語法總結及練習-1.存儲過程之ifclear;create or replace procedure mydel(
38、 in_a in in teger)asbeginif in_a<100 then dbms_output.put_line(' elsif in_a<200 then dbms_output.put_line(' else dbms_output.put_line(' end if;end;/set serveroutput on; begin mydel(1102); end;/小于 100.');大于 100 小于 200.')大于 200.');-2. 存儲過程之 case1 clear;create or replace p
39、rocedure mydel( in_a in integer)asbegincase in_a when 1 then dbms_output.put_line(' when 2 then dbms_output.put_line(' else dbms_output.put_line(' end case;end;/小于 100.');大于 100 小于 200.')大于 200.');set serveroutput on; begin mydel(2);end;/-1. 存儲過程之 loop1 clear;create or replac
40、e procedure mydel(in_a in integer) as a integer;begina:=0;loopdbms_output.put_line(a); a:=a+1;exit when a>301;end loop;end;/set serveroutput on; begin mydel(2);end;/ -1. 存儲過程之 loop2 clear;create or replace procedure mydel( in_a in integer)asa integer; begin a:=0;while a<300 loop dbms_output.pu
41、t_line(a); a:=a+1;end loop; end;/set serveroutput on; begin mydel(2);end;-1. 存儲過程之 loop3 clear;create or replace procedure mydel( in_a in integer) as a integer;beginfor a in 0.300loopdbms_output.put_line(a);end loop;end;/set serveroutput on;begin mydel(2);end;/clear;select ename,cc:=(case when comm=
42、null then sal*12;else (sal+comm)*12;end case from emp order by salpersal;clear;create or replace procedure getstudentcomments( i_studentid in int,o_comments out varchar) asexams_sat int;avg_mark int;tmp_comments varchar(100);beginselect count(examid) into exams_sat from studentexam where studentid=i
43、_studentid;if exams_sat=0 thentmp_comments:='n/a-this student did not attend the exam!' elseselect avg(mark) into avg_mark from studentexamwhere studentid=i_studentid;casewhen avg_mark<50 then tmp_comments:='very bad' when avg_mark<60 then tmp_comments:='bad'when avg_ma
44、rk<70 then tmp_comments:='good'end case;end if;o_comments:=tmp_comments; end;/ set serveroutput on;declarepp ments%type; begingetstudentcomments(8,pp);dbms_output.put_line(pp);end;/ delete from emp where empno<6000;clear;create or replace procedure insertdata(in_num in integer)asmyNum
45、int default 0;emp_no emp.empno%type:=1000;beginwhile myNum<in_num loop insert into emp values(emp_no,'hui'|myNum,'coder',7555,current_date,8000,6258,30); emp_no:=emp_no+1;myNum:=myNum+1;end loop;end;/set serveroutput on;begininsertdata(10);end;/select * from emp;clear;select stude
46、ntname,averageMark,casewhen averageMark<60 then ' 不及格 'when averageMark<70 then ' 考得好 'when averageMark<80 then ' 考得很好 ' end case from (select (select from student b where b.studentid=a.studentid) as studentname, round(avg(mark),2) as averageMark from studente
47、xam a group by a.studentid);ORACLE查詢練習emp員工表(empno員工號/ename員工姓名/job工作/mgr上級編號/hiredate受雇日期/sal薪金 /comm 傭金 /deptno 部門編號 )dept部門表(deptno部門編號/dname部門名稱/loc地點)工資=薪金+傭金1列出至少有一個員工的所有部門。2列出薪金比“ SMITH ”多的所有員工。3列出所有員工的姓名及其直接上級的姓名。4列出受雇日期早于其直接上級的所有員工。5列出部門名稱和這些部門的員工信息,同時列出那些沒有員工的部門6列出所有“ CLERK ”(辦事員)的姓名及其部門名稱
48、。7列出最低薪金大于 1500 的各種工作。&列出在部門“ SALES”(銷售部)工作的員工的姓名,假定不知道銷售部的部門編號。9列出薪金高于公司平均薪金的所有員工。10列出與“ SCOTT ”從事相同工作的所有員工。11列出薪金等于部門 30 中員工的薪金的所有員工的姓名和薪金。12列出薪金高于在部門 30 工作的所有員工的薪金的員工姓名和薪金。13列出在每個部門工作的員工數量、平均工資和平均服務期限。14列出所有員工的姓名、部門名稱和工資。15列出所有部門的詳細信息和部門人數。16列出各種工作的最低工資。17列出各個部門的 MANAGER (經理)的最低薪金。18列出所有員工的年工
49、資 ,按年薪從低到高排序。1select dname from dept where deptno in(select deptno from emp);2select * from emp where sal>(select sal from emp where ename='SMITH');3select a.ename,(select ename from emp b where b.empno=a.mgr) as bossname from emp a;4select a.ename from emp a where a.hiredate<(select h
50、iredate from emp b where b.empno=a.mgr);5select a.dname,b.empno,b.ename,b.job,b.mgr,b.hiredate,b.sal,m,b.deptno from dept a left join emp b on a.deptno=b.deptno;6select a.ename,b.dname from emp a join dept b on a.deptno=b.deptno and a.job='CLERK'7select distinct job as HighSalJob from emp gr
51、oup by job having min(sal)>1500;8select ename from emp where deptno=(select deptno from dept where dname='SALES');9select ename from emp where sal>(select avg(sal) from emp);10select ename from emp where job=(select job from emp where ename='SCOTT');11select a.ename,a.sal from
52、emp a where a.sal in (select b.sal from emp b where b.deptno=30) and a.deptno<>30;12select ename,sal from emp where sal>(select max(sal) from emp where deptno=30);13select(select b.dname from dept b where a.deptno=b.deptno) as deptname , count(deptno) as deptcount, avg(sal) as deptavgsalfro
53、m emp a group by deptno;14selecta. ename,(select b.dname from dept b where b.deptno=a.deptno) as deptname, salfrom emp a;15 selecta. deptno,a.dname,a.loc,(select count(deptno) from emp b where b.deptno=a.deptno group by b.deptno) as deptcount from dept a;16select job,avg(sal) from emp group by job;1
54、7select deptno,min(sal) from emp where job='MANAGER' group by deptno;18select ename,(sal+nvl(comm,0)*12 as salpersal from emp order by salpersal;ORACL子句查詢,分組等A.同表子查詢作為條件a. 給出人口多于 Russia( 俄國)的國家名稱 SELECT name FROM bbcWHERE population>(SELECT population FROM bbcWHERE name='Russia')b
55、. 給出'India'(印度),'lran'(伊朗)所在地區(qū)的所有國家的所有信息SELECT * FROM bbcWHERE region IN(SELECT region FROM bbcWHERE name IN ('India','Iran')c. 給出人均 GDP超過'United Kingdom'(英國)的歐洲國家.SELECT name FROM bbcWHERE region='Europe' AND gdp/population >(SELECT gdp/population
56、FROM bbcWHERE name='United Kingdom')d. 這個查詢實際上等同于以下這個 :select e1.ename from emp e1,(select empno from emp where ename = 'KING') e2 whe re e1.mgr = e2.empno;你可以用EXISTS寫同樣的查詢,你只要把外部查詢一欄移到一個像下面這樣的子查詢環(huán)境 中就可以了:select ename from emp ewhere exists (select 0 from emp where e.mgr = empno and ename = 'KING');當你在一個 WHERE?句中寫EXISTS時,又等于向最優(yōu)化傳達了這樣一條信息,即你想讓外 部查詢先運行,使用每一個值來從內部查詢(假定:EXISTS=由外而內)中得到一個值。B.異表子查詢作為條件a. sel
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 單位管理制度呈現匯編職員管理篇
- 單位管理制度呈現大全人員管理篇
- 藝術節(jié)主持詞
- 70MW光伏發(fā)電項目工程(EPC)總承包投標文件 承包人實施計劃
- 《市場營銷學導言》課件
- 《天貓規(guī)則學習》課件
- 空調維修公司保安工作總結
- 財務工作品質提升總結
- 兒童新媒體編輯工作總結
- 2003年廣東高考語文真題及答案
- 腦病科中醫(yī)健康宣教課件
- 江蘇省常州市教育學會2023-2024學年八年級上學期期末學業(yè)水平檢測英語試題(無答案)
- 物業(yè)管理服務領域:保利物業(yè)企業(yè)組織架構及部門職責
- 如何在地震演練中應對火災和燃氣泄漏
- 融媒體專題報道方案
- 工作失誤匯報
- 呼吸科主任述職報告
- 旅游法規(guī)期末試卷與參考答案匯編
- 11054-國家開放大學2023年春期末統(tǒng)一考試《流通概論》答案
- 晉江物流行業(yè)分析
- 編譯原理考試題及答案匯總
評論
0/150
提交評論