最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Oracle在PL/SQL中使用存儲過程

 更新時間:2022年05月06日 10:36:09   作者:springsnow  
這篇文章介紹了Oracle在PL/SQL中使用存儲過程的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

一、概述

過程和函數(shù)統(tǒng)稱為PL/SQL子程序,他們是被命名的PL/SQL塊,均存儲于數(shù)據(jù)庫中。

并通過輸入、輸出和輸入輸出參數(shù)與其調(diào)用者交換信息。唯一區(qū)別是函數(shù)總向調(diào)用者返回數(shù)據(jù)。

二、存儲過程詳解

1、創(chuàng)建過程語法:

CREATE [ OR REPLACE ] PROCEDURE [ schema. ] procedure_name
    [ ( parameter_declaration [, parameter_declaration ]... ) ]
    [ invoker_rights_clause ]
    { IS | AS }
    { [ declare_section ] body | call_spec | EXTERNAL} ;

說明:

  • procedure_name:過程名稱。
  • parameter_declaration:參數(shù)聲明,格式如下:
parameter_name [ [ IN ] datatype [ { := | DEFAULT } expression ]
          | { OUT | IN OUT } [ NOCOPY ] datatype
  • IN:輸入?yún)?shù)。
  • OUT:輸出參數(shù)。
  • IN OUT:輸入輸出參數(shù)。
  • invoker_rights_clause:這個過程使用誰的權(quán)限運行,格式:
AUTHID { CURRENT_USER | DEFINER }
  • declare_section:聲明部分。
  • body:過程塊主體,執(zhí)行部分

2、創(chuàng)建存儲過程

帶有輸入、輸出參數(shù)的過程

CREATE OR REPLACE PROCEDURE proc_demo
(
    dept_no NUMBER DEFAULT 10,
    sal_sum OUT NUMBER,
    emp_count OUT NUMBER
  )
IS
BEGIN
    SELECT SUM(salary), COUNT(*) INTO sal_sum, emp_count
  FROM employees WHERE department_id = dept_no;
EXCEPTION
   WHEN NO_DATA_FOUND THEN
      DBMS_OUTPUT.PUT_LINE('溫馨提示:你需要的數(shù)據(jù)不存在!');
   WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);
END proc_demo;

3、調(diào)用存儲過程

調(diào)用方式: 
1)、當在SQL*PLUS中調(diào)用過程時,需要使用CALL或者EXECUTE命令,而在PL/SQL塊中過程可以直接引用。

-- 調(diào)用刪除員工的過程
EXEC remove_emp(1);
  
-- 調(diào)用插入員工的過程
EXECUTE insert_emp(1, 'tommy', 'lin', 2);

2)、在PL/SQL語句塊中直接調(diào)用。

DECLARE
V_num NUMBER;
V_sum NUMBER(8, 2);
BEGIN
  Proc_demo(30, v_sum, v_num);
     DBMS_OUTPUT.PUT_LINE('溫馨提示:30號部門工資總和:'||v_sum||',人數(shù):'||v_num);
  Proc_demo(sal_sum => v_sum, emp_count => v_num);
     DBMS_OUTPUT.PUT_LINE('溫馨提示:10號部門工資總和:'||v_sum||',人數(shù):'||v_num);
END;

4、C# 調(diào)用:

OracleCommand cmd = new OracleCommand("prroc_demo", myOracleConnection);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("v_companycode", OracleType.Char); 
cmd.Parameters["v_companycode"].Value = "aa";
cmd.Parameters.Add("v_returnvalue", OracleType.Float).Direction = ParameterDirection.Output;
cmd.ExecuteNoQuery();
string eval = cmd.Parameters["v_returnvalue"].Value.ToString();

三、存儲過程返回記錄集SYS_REFCURSOR

cursor與REF cursor大致有以下幾點區(qū)別:

  • 靜態(tài)游標不能返回到客戶端,只有PL/SQL才能利用它。ref游標則可以,是從Oracle的存儲過站返回結(jié)果集的方式。
  • PL/SQL靜態(tài)游標可以是全局的,而ref游標只能在定義它的過程中使用,但ref游標可以從子例程傳遞到子例程,而普通游標則不能。
  • 靜態(tài)光標比ref游標效率要高。
  • sys_refcursor在oracle9i以后系統(tǒng)定義的一個refcursor,主要用于在過程中返回結(jié)果集。

1、返回單行語法

create or replace procedure proc_query_rent (
  param_region varchar2,  --定義區(qū)
  param_room number,  --定義室
  param_hall number,  --定義廳
  param_rentMin number,  --定義租金上限
  param_rentMax number,  --定義租金下限
  param_resultSet OUT SYS_REFCURSOR --定義out參數(shù)返回結(jié)果集
) 
as 
begin 
open param_resultSet for select  * from tb_rent
 where region like case when param_region IS null then '%' else param_region end
  AND room like case when param_room IS null then '%' else to_char(param_room) end
  AND hall like case when param_hall IS null then '%' else to_char(param_hall) end
  AND rent between case when param_rentMin IS null then 0 else param_rentMin end
  AND case when param_rentMax IS null then 99999999 else param_rentMax end;
end;

調(diào)用:

declare 
  v_rent_rows SYS_REFCURSOR;
  v_rent_row tb_rent % rowType;
begin 
   proc_query_rent('山區(qū)', null, null, 1200, null, v_rent_rows);
   Dbms_output.put_line('所在區(qū) 室 廳 租金');
   loop 
      fetch v_rent_rows into v_rent_row;//單行
      exit when v_rent_rows % NOTFOUND;
      Dbms_output.put_line(v_rent_row.region || '  ' || v_rent_row.room || '  ' || v_rent_row.hall || '  ' || v_rent_row.rent);
   end loop;
   close v_rent_rows;
end;

2、返回多行語法

存儲過程:

create or replace procedure getEmpByDept(in_deptNo in emp.deptno%type,  out_curEmp out SYS_REFCURSOR) as 
begin 
 open out_curEmp for 
  SELECT * FROM emp WHERE deptno = in_deptNo ; 
EXCEPTION 
 WHEN OTHERS THEN 
 RAISE_APPLICATION_ERROR(-20101, 
  'Error in getEmpByDept' || SQLCODE ); 
end getEmpByDept;

調(diào)用(執(zhí)行存儲過程):

declare 
  cur_emp sys_refcursor;
  type emp emp_type is table of yemp%rowtype;
  vemps emp_type;
begin
   sp_getEmp(line=>'A5',curemp=>cur_emp);
   fetch cur_emp bulk collect into vemps;
   for i in v_emps.first..v_emps.last loop
      dbms_output.putline(v_emps(i).empid);
   end loop;
   close cur_emp;
end;

C# 調(diào)用:

OracleCommand cmd = new OracleCommand("prroc_demo", myOracleConnection);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("v_companycode", OracleType.Char).Value = "aa";
cmd.Parameters.Add("curEmp", OracleType.Cursor).Direction = ParameterDirection.Output;
OracleDataAdapter da = new OracleDataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds);
this.dataGridView1.DataSource = ds.Tables[0];

四、維護存儲過程

1、刪除過程

可以使用DROP PROCEDURE命令對不需要的過程進行刪除

DROP PROCEDURE logexecution;

2、顯示過程代碼

select text from user_source where name='存儲過程名(大寫)' and type='PROCEDURE';

3、查看過程狀態(tài)

select  object_type ,object_name ,status from user_objects where  object_name  = 'procedure';

4、重新編譯過程

alter procedure pro_backup compile;

五. 過程與函數(shù)比較

1、相同點:

  • 都使用IN模式的參數(shù)傳入數(shù)據(jù)、OUT模式的參數(shù)返回數(shù)據(jù)。
  • 輸入?yún)?shù)都可以接受默認值,都可以傳值或傳引導。
  • 調(diào)用時的實際參數(shù)都可以使用位置表示法、名稱表示法或組合方法。
  • 都有聲明部分、執(zhí)行部分和異常處理部分。
  • 其管理過程都有創(chuàng)建、編譯、授權(quán)、刪除、顯示依賴關(guān)系等。

2、不同點:

  • 過程:作為PL/SQL語句執(zhí)行;函數(shù):作為表達式的一部分執(zhí)行
  • 過程:在規(guī)范中不包含RETURN子句;函數(shù):必須在規(guī)范中包含RETURN子句
  • 過程:不返回任何值;函數(shù):必須返回單個值
  • 過程:可以RETURN語句,但是與函數(shù)不同,它不能用于返回值;函數(shù):必須包含至少一條RETURN語句

六、 與過程相關(guān)數(shù)據(jù)字典

USER_SOURCE, ALL_SOURCE, DBA_SOURCE, USER_ERRORS,

ALL_PROCEDURES,USER_OBJECTS,ALL_OBJECTS,DBA_OBJECTS

相關(guān)的權(quán)限:

CREATE ANY PROCEDURE

DROP ANY PROCEDURE

SQL*PLUS 中,可以用DESCRIBE 命令查看過程的名字及其參數(shù)表。

DESC[RIBE] Procedure_name;

到此這篇關(guān)于Oracle在PL/SQL中使用存儲過程的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 兩種oracle創(chuàng)建字段自增長的實現(xiàn)方式

    兩種oracle創(chuàng)建字段自增長的實現(xiàn)方式

    這篇文章介紹了兩種oracle創(chuàng)建字段自增長的實現(xiàn)方式,一是序列+觸發(fā)器,二是序列+顯示調(diào)用序列,需要的朋友可以參考下
    2015-07-07
  • 對于oracle對session進行跟蹤的分析

    對于oracle對session進行跟蹤的分析

    這篇文章主要介紹了對于oracle對session進行跟蹤的分析,涉及判斷SQL性能優(yōu)劣的信息等內(nèi)容,需要的朋友可以參考下。
    2017-09-09
  • oracle快速刪除重復的記錄

    oracle快速刪除重復的記錄

    oracle快速刪除重復的記錄...
    2007-03-03
  • oracle 中 sqlplus命令大全

    oracle 中 sqlplus命令大全

    Oracle的sql*plus是與oracle數(shù)據(jù)庫進行交互的客戶端工具,借助sql*plus可以查看、修改數(shù)據(jù)庫記錄。接下來通過本文給大家介紹oracle中sqlplus命令知識,非常不錯,感興趣的朋友一起看看吧
    2016-09-09
  • 解決Oracle RMAN刪除歸檔日志不釋放問題的方法

    解決Oracle RMAN刪除歸檔日志不釋放問題的方法

    RMAN清除方式會自動清除磁盤上的歸檔日志文件,同時會釋放控制文件中對應(yīng)的歸檔日志的歸檔信息,但最近在使用中就遇到了一個問題,下面這篇文章主要給大家介紹了關(guān)于解決Oracle RMAN刪除歸檔日志不釋放問題的方法,需要的朋友可以參考下。
    2017-07-07
  • Oracle數(shù)據(jù)庫賬號被鎖定解決方法

    Oracle數(shù)據(jù)庫賬號被鎖定解決方法

    在Oracle數(shù)據(jù)庫操縱中,登錄Oracle賬號時提示失敗,并且Oracle賬號頻繁被鎖定,本文將介紹如何解決此問題
    2012-11-11
  • Oracle集群 diagwait的問題記錄

    Oracle集群 diagwait的問題記錄

    這篇文章主要給大家介紹了關(guān)于Oracle集群diagwait的問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-01-01
  • Ubuntu?22.04或20.04安裝Oracle?SQL?Developer的圖文教程

    Ubuntu?22.04或20.04安裝Oracle?SQL?Developer的圖文教程

    Oracle?SQL?Developer?是一個免費平臺,為開發(fā)人員提供用于開發(fā)和管理?Oracle?數(shù)據(jù)庫的集成開發(fā)環(huán)境,這篇文章主要介紹了Ubuntu?22.04或20.04安裝Oracle?SQL?Developer圖文教程,需要的朋友可以參考下
    2024-08-08
  • Oracle數(shù)據(jù)庫服務(wù)器修改操作系統(tǒng)時間的注意事項詳解

    Oracle數(shù)據(jù)庫服務(wù)器修改操作系統(tǒng)時間的注意事項詳解

    在本篇文章里小編給大家整理的是一篇關(guān)于Oracle數(shù)據(jù)庫服務(wù)器修改操作系統(tǒng)時間的注意事項詳解,需要的朋友們可以參考下。
    2020-03-03
  • oracle使用存儲過程將表數(shù)據(jù)以excel格式導出的操作方法

    oracle使用存儲過程將表數(shù)據(jù)以excel格式導出的操作方法

    雖然目前pl/sql developer等數(shù)據(jù)庫客戶端軟件都支持將表數(shù)據(jù)以excel格式導出,但是如果數(shù)據(jù)量大,需要等客戶端加載表數(shù)據(jù)等待很久,這篇文章給大家分享oracle使用存儲過程將表數(shù)據(jù)以excel格式導出的操作方法,需要的朋友可以參考下
    2024-07-07

最新評論

米易县| 罗平县| 新竹市| 龙井市| 娄烦县| 上虞市| 峨边| 开鲁县| 襄垣县| 罗田县| 太谷县| 调兵山市| 正安县| 西畴县| 永城市| 溆浦县| 长治县| 探索| 都安| 临沧市| 蒙阴县| 平安县| 汝阳县| 赞皇县| 长宁县| 慈溪市| 泸水县| 舟山市| 邯郸市| 永川市| 和顺县| 广饶县| 上杭县| 平陆县| 临朐县| 德安县| 祥云县| 扶余县| 河南省| 威远县| 工布江达县|