1. 程式人生 > 實用技巧 >Stream流中常用的方法limit

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模式的引數,則實際引數必須是一個預先已經賦值的變數。執行完過程後,該變數被重新賦值,可以輸出此變數的值來測試過程執行結果