Stream流中常用的方法limit
1.儲存過程概念優點
1.概念
儲存過程(Stored Procedure)是在大型資料庫系統中,一組為了完成特定功能的SQL語句集,儲存在資料庫中,經過第一次編譯後再次呼叫不需要再次編譯,使用者通過指定儲存過程的名字並給出引數(如果該儲存過程帶有引數)來呼叫儲存過程。
簡單的說就是專門幹一件事一段sql語句。
可以由資料庫自己去呼叫,也可以由java程式去呼叫。
2.優點
使用儲存過程或函式的優點:
1、可重複呼叫;
2、由於其預編譯性,所以執行效率高;
3、由於其封裝性,安全性高
4、可對資料庫進行復雜操作,包括呼叫其他儲存過程或函式等。
2. 儲存過程語法格式
建立儲存過程的語法如下所示:
CREATE[OR REPLACE] PROCEDURE [schema.]procedure_name [ ( [{IN | OUT | IN OUT}] datatype [default|:=value], ...) ] {IS | AS} [description part 說明部分] BEGIN SQL STATEMENT 語句序列 [EXCEPTION 例外處理] END [procedure _Name 過程名];
過程引數說明:
- OR REPLACE 是一個可選的關鍵字,建議使用者使用此關鍵字。如果過程已經存在,該關鍵字將重新建立過程,這樣就不必刪除和重新建立過程。
- 關鍵字IS 和 AS均可,它們本身沒有區別。IS/AS後面是一個完整的PL/SQL塊,可以定義區域性變數,但不能以DECLARE開始。區域性變數在過程內部存放值。
- 形式引數可以有三種模式:IN、OUT、IN OUT。如果沒有為形式引數指定模式,那麼預設的模式是IN。
3.建立/呼叫無參儲存過程
例1:向產品表中插入一條新資訊
CREATE PROCEDURE Insertpro IS BEGIN INSERT INTO products(productid,productname) VALUES( 20,‘aa'); EXCEPTION WHEN DUP_VAL_ON_INDEX THEN dbms_output.put_line(‘產品編號已存在'); WHEN OTHERS THEN dbms_output.put_line('發生其他錯誤'); END;
注意:
- 不論編譯是否成功,建立過程/函式命令CREATE PROCEDURE或CREATE FUNCTION都將自動把其原始碼存入資料庫中,而編譯程式碼只有在編譯成功後才能存入資料庫中。
- 只有編譯程式碼被存入到資料庫的儲存過程和函式才能被呼叫。
4.建立/呼叫帶參儲存過程
IN、OUT、IN OUT三種模式的描述
模式 |
描述 |
IN引數(預設模式) (輸入引數) |
用來從呼叫環境中向儲存過程傳遞值,不能給IN引數賦值,給此引數傳遞的值可以是常量、有值的變數、表示式等。 |
OUT引數(輸出引數) |
用來從過程中返回值給呼叫者,不能將此引數的值賦給另一個變數,不能是常量或表示式。在過程體內,必須給OUT引數賦值。 |
INOUT引數 (輸入輸出引數) |
既可以從呼叫者向過程中傳遞值,執行過程後還可返回可能改變了的值給呼叫者。 |
例2:建立帶輸入引數的儲存過程,向產品表插入一個新的產品資訊,使用異常設定錯誤資訊(供應商編號或類別編號 不存在).
CREATE OR REPLACE PROCEDURE Para_InsertProd (prodid number,prodname nvarchar2,suppid number,cateid number default 1) IS e_noSuppCate EXCEPTION; Pragma EXCEPTION_INIT(e_noSuppCate,-2291); BEGIN INSERT INTO products(productid,productname, supplierid, categoryid) VALUES(prodid, prodname, suppid, cateid); commit; EXCEPTION WHEN DUP_VAL_ON_INDEX THEN dbms_output.put_line ('產品編號已存在'); WHEN e_noSuppCate THEN dbms_output.put_line(‘供應商編號或類別編號不存在'); END;
帶輸入引數儲存過程的呼叫格式:
1) 位置表示法
EXEC[UTE] procedure_name(引數值1,引數值2 …);
2) 名稱表示法
EXEC[UTE] procedure_name(引數名1=>引數值1,引數名2=>引數值2 …);
3) 混合表示法
當用戶使用名稱表示法後,後續的引數必須使用名稱表示法。
例3:建立帶輸出引數的儲存過程,用於查詢orderdetails表中某產品的總銷量和總銷售金額,並將其值返回,如記錄不存在產生異常即設定錯誤資訊(該產品不存在).
CREATE OR REPLACE PROCEDURE Paraout_orderDetail (prodid in number, t_quant out orderdetails.quantity%type, t_uprice out orderdetails.unitprice%type) IS BEGIN SELECT sum(quantity),sum(quantity*unitprice) INTO t_quant, t_uprice FROM orderdetails WHERE productid=prodid Group by productid; EXCEPTION WHEN no_data_found THEN Dbms_output.put_line(‘該產品資訊不存在’); END;
帶輸出引數儲存過程的呼叫格式:
1) SQL PLUS中繫結輸出引數值
variable 輸出引數變數1 資料型別,輸出引數變數2 資料型別 …;
呼叫儲存過程
EXEC[UTE] procedure_name(引數值1,…引數名n,:繫結變數1, :繫結變數2….);
1) SQL PLUS命令列中執行帶輸出引數的儲存過程
SQL>variable qt number;
SQL>variable tprice number;
SQL>EXEC Paraout_orderDetail(1,:qt,:tprice);
SQL>print qt;
SQL>print tprice;
2)SQL PLUS中在程式塊中呼叫儲存過程
DECLARE qt number; tprice number; BEGIN Paraout_orderDetail(1,qt,tprice); dbms_output.put_line(qt); dbms_output.put_line(tprice); END;
例4:建立帶輸入/輸出引數的儲存過程, 用於對兩個數進行交換.
CREATE OR REPLACE PROCEDURE swap(p_num1 IN OUT number, p_num2 IN OUT number) IS temp number; BEGIN temp:=p_num1 ; p_num1:=p_num2; p_num2:=temp; END; --過程內的區域性變數只能在過程內使用 --建立PL/SQL程式塊呼叫儲存過程: DECLARE V_max number:=20; V_min number:=29; BEGIN if v_max< V_min then swap(v_max, V_min); End if; dbms_output.put_line(‘v_max:’||v_max); dbms_output.put_line(‘v_min:’||v_min); END;
注意:
- 如果形式引數是IN模式的引數,實際引數可以是一個具體的值或一個有值的變數;
- 如果形式引數是OUT模式的引數,實際引數必須是一個變數,當呼叫過程後,此變數就被賦值了。可以輸出此變數的值來測試過程執行的結果。
- 如果形式引數是IN OUT模式的引數,則實際引數必須是一個預先已經賦值的變數。執行完過程後,該變數被重新賦值,可以輸出此變數的值來測試過程執行結果