日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

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

瀏覽:210日期:2023-03-12 15:25:09
目錄
  • 一、概述
  • 二、存儲過程詳解
    • 1、創建過程語法:
    • 2、創建存儲過程
    • 3、調用存儲過程
    • 4、C# 調用:
  • 三、存儲過程返回記錄集SYS_REFCURSOR
    • 1、返回單行語法
    • 2、返回多行語法
  • 四、維護存儲過程
    • 1、刪除過程
    • 2、顯示過程代碼
    • 3、查看過程狀態
    • 4、重新編譯過程
  • 五. 過程與函數比較
    • 1、相同點:
    • 2、不同點:
  • 六、 與過程相關數據字典

    一、概述

    過程和函數統稱為PL/SQL子程序,他們是被命名的PL/SQL塊,均存儲于數據庫中。

    并通過輸入、輸出和輸入輸出參數與其調用者交換信息。唯一區別是函數總向調用者返回數據。

    二、存儲過程詳解

    1、創建過程語法:

    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:參數聲明,格式如下:
    parameter_name [ [ IN ] datatype [ { := | DEFAULT } expression ]
      | { OUT | IN OUT } [ NOCOPY ] datatype
    • IN:輸入參數。
    • OUT:輸出參數。
    • IN OUT:輸入輸出參數。
    • invoker_rights_clause:這個過程使用誰的權限運行,格式:
    AUTHID { CURRENT_USER | DEFINER }
    • declare_section:聲明部分。
    • body:過程塊主體,執行部分

    2、創建存儲過程

    帶有輸入、輸出參數的過程

    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("溫馨提示:你需要的數據不存在!");
       WHEN OTHERS THEN
          DBMS_OUTPUT.PUT_LINE(SQLCODE||"---"||SQLERRM);
    END proc_demo;

    3、調用存儲過程

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

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

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

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

    4、C# 調用:

    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大致有以下幾點區別:

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

    1、返回單行語法

    create or replace procedure proc_query_rent (
      param_region varchar2,  --定義區
      param_room number,  --定義室
      param_hall number,  --定義廳
      param_rentMin number,  --定義租金上限
      param_rentMax number,  --定義租金下限
      param_resultSet OUT SYS_REFCURSOR --定義out參數返回結果集
    ) 
    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;

    調用:

    declare 
      v_rent_rows SYS_REFCURSOR;
      v_rent_row tb_rent % rowType;
    begin 
       proc_query_rent("山區", null, null, 1200, null, v_rent_rows);
       Dbms_output.put_line("所在區 室 廳 租金");
       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;

    調用(執行存儲過程):

    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# 調用:

    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、查看過程狀態

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

    4、重新編譯過程

    alter procedure pro_backup compile;

    五. 過程與函數比較

    1、相同點:

    • 都使用IN模式的參數傳入數據、OUT模式的參數返回數據。
    • 輸入參數都可以接受默認值,都可以傳值或傳引導。
    • 調用時的實際參數都可以使用位置表示法、名稱表示法或組合方法。
    • 都有聲明部分、執行部分和異常處理部分。
    • 其管理過程都有創建、編譯、授權、刪除、顯示依賴關系等。

    2、不同點:

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

    六、 與過程相關數據字典

    USER_SOURCE, ALL_SOURCE, DBA_SOURCE, USER_ERRORS,

    ALL_PROCEDURES,USER_OBJECTS,ALL_OBJECTS,DBA_OBJECTS

    相關的權限:

    CREATE ANY PROCEDURE
    
    DROP ANY PROCEDURE

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

    DESC[RIBE] Procedure_name;

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

    標簽: Oracle
    相關文章:
    日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
    亚洲高清av| 中文一区一区三区免费在线观 | 日本精品一区二区三区在线观看视频| 亚洲成人精选| av一区在线| 久久亚洲专区| 91久久中文| 亚洲综合图色| 国产欧美日韩免费观看| 国产欧美视频在线| 精品国产欧美日韩| 欧美精品高清| 亚洲激情五月| 亚洲精品美女| 美女视频黄久久| av中文资源在线资源免费观看| 鲁鲁在线中文| 亚洲激精日韩激精欧美精品| 午夜宅男久久久| 亚洲另类av| 91亚洲精品在看在线观看高清| 国产精品一卡| av一区在线| 亚洲精品在线国产| 久久久精品国产**网站| av中文字幕在线观看第一页| 亚洲精品电影| 在线一区视频| 久久亚洲道色| 99成人超碰| 亚洲狼人精品一区二区三区| 国产亚洲精品美女久久| 麻豆高清免费国产一区| 桃色av一区二区| 欧美高清一区| 视频一区中文字幕精品| 欧美激情精品| 亚洲天堂久久| 91成人精品在线| 高清一区二区| 免费人成在线不卡| 国产精品17p| 1024精品一区二区三区| 亚洲精品一级| www.九色在线| 日本中文字幕不卡| 日韩欧美在线中字| 日本一区二区三区中文字幕| 国产精品久久久久久久免费观看| 久久久久久久久99精品大| 色综合视频一区二区三区日韩 | 欧美精品一卡| 91精品美女| 激情欧美一区| 精品国内亚洲2022精品成人| 男人操女人的视频在线观看欧美| 国产调教一区二区三区| 久久精品国产大片免费观看| 久久超碰99| 一区二区不卡| 精品一区欧美| 最新中文字幕在线播放 | 麻豆一区在线| 日本成人在线不卡视频| 久久国产毛片| 91日韩免费| 狂野欧美性猛交xxxx| 日韩区一区二| 在线亚洲激情| 色婷婷久久久| 国产精品欧美三级在线观看| 日韩视频免费| 欧美日韩国产v| 日韩精品a在线观看91| 婷婷亚洲综合| 欧美激情视频一区二区三区免费 | 五月天激情综合网| 日韩成人午夜精品| 免费视频亚洲| 久久精品国产亚洲一区二区三区| 国产精品免费看| 国产精选在线| 国产区精品区| 蜜桃av一区二区| 欧美日韩激情| 成人福利av| 亚洲精品黄色| 91久久午夜| 成人三级高清视频在线看| 日韩和欧美一区二区三区| 精品一区在线| 国产精品magnet| 日本中文字幕不卡| 中文日韩欧美| 91一区二区| 欧美亚洲三级| 最新国产精品| 亚洲欧美久久| 日韩精品一二三| 欧美激情一区| 日韩国产欧美在线播放| 999在线观看精品免费不卡网站| 老鸭窝一区二区久久精品| 日本午夜精品一区二区三区电影| 亚洲欧美日韩国产一区二区| 丝袜美腿一区| 欧美日韩一区二区三区不卡视频 | 亚洲va在线| 麻豆免费精品视频| 精品一区二区三区四区五区| 国产精品视频一区二区三区| 日本久久二区| 91午夜精品| 日精品一区二区三区| 国产精品试看| 亚洲一区二区三区免费在线观看| 国产探花一区二区| 日韩视频精品在线观看| 免费的成人av| 免费看精品久久片| 中文字幕av一区二区三区四区| 国产亚洲在线| 欧美专区一区二区三区| 欧美+亚洲+精品+三区| 久久精品国语| 欧美日韩国产一区二区三区不卡| 日韩一级精品| 蜜桃视频一区二区| 日韩精品高清不卡| 久久精品72免费观看| 国产欧美日韩亚洲一区二区三区| 日韩精品视频在线看| 欧美一区不卡| 国产精久久久| 伊人网在线播放| 久久精品电影| 蜜臀久久99精品久久久久宅男| 97久久亚洲| 国产精品白浆| 精品视频网站| 丝袜美腿诱惑一区二区三区| 欧美中文一区二区| 国产精品日本| 日韩精品五月天| 久久精品三级| 国产视频一区欧美| 免费不卡在线观看| 国产精区一区二区| 亚洲综合在线电影| 青青草国产成人99久久| 国产精品7m凸凹视频分类| 日韩综合小视频| 国产欧美另类| 麻豆视频在线观看免费网站黄 | 欧美视频精品全部免费观看| 久久久久伊人| 久久麻豆视频| 成人精品国产亚洲| 色综合视频一区二区三区日韩 | 999久久久精品国产| 视频一区二区中文字幕| 国产欧美另类| 午夜影院欧美| 精品国产不卡| 99久久夜色精品国产亚洲1000部| 在线亚洲激情| 国产午夜久久av| 99久久精品国产亚洲精品| 亚洲综合色婷婷在线观看| 欧美日韩a区| 欧美成人精品三级网站| 99久精品视频在线观看视频| 超碰99在线| 国产精品调教| 一区福利视频| 国产精品啊啊啊| 不卡中文字幕| 91精品麻豆| 亚洲无线一线二线三线区别av| 日韩精品1区2区3区| 日韩一区二区久久| 福利一区二区免费视频 | 日韩国产欧美在线视频| 亚洲风情在线资源| 欧美久久一区二区三区| 免费观看久久av| 国产精品红桃| 久久一二三区| 成人日韩av| 高潮久久久久久久久久久久久久| 亚洲天堂日韩在线| 久久精品高清| 国产精品成人a在线观看| 午夜精品福利影院| 日韩精品网站| 国产欧美日韩精品一区二区免费 | 国产精品www994| 视频一区二区国产| 神马日本精品| 国际精品欧美精品|