1. 程式人生 > >PLSQL儲存過程及儲存函式

PLSQL儲存過程及儲存函式

關於Struts2 130529143交流。
有償技術支援Q群:
398162181 


1.儲存過程與儲存函式的區別:

儲存過程無返回值,儲存函式有返回值。

2.儲存過程:

demo1:

declare 
  --宣告一個記錄型別
  type emp_record is record(
    v_sal employees.salary%type,--動態的獲取變數的型別
    v_email varchar(20),
    v_hire_date date
    );
  --定義一個記錄型別的成員變數
  v_emp_record emp_record;

begin 
--程式的執行部分
select salary, email, hire_date into v_emp_record from employees where employee_id = 100;
dbms_output.put_line(v_emp_record.v_sal || ',' || v_emp_record.v_email || ',' || v_emp_record.v_hire_date);

--exception  
end;

demo2:

declare    type salary_record is record(        v_name varchar2(20),        v_salary number(10, 2)   );   v_sal_record salary_record; begin    v_sal_record.v_name := '老王';   v_sal_record.v_salary := 20000;   dbms_output.put_line(v_sal_record.v_name || ',' || v_sal_record.v_salary); --exception  end;
demo3:
declare 
  type salary_record is record(
       v_name varchar2(20),
       v_salary employees.salary%type
  );
  
  v_sal_record salary_record;


begin 
  v_sal_record.v_name := '老王';
  v_sal_record.v_salary := 20000;
  dbms_output.put_line(v_sal_record.v_name || ',' || v_sal_record.v_salary);
--exception 
end;
demo4:
declare 
  v_sal employees.salary%type;
  v_temp varchar2(30);


begin 
  select salary into v_sal from employees where employee_id = 150;
  v_temp := 
  case trunc(v_sal/5000) when 0 then 'salary<5000'
                         when 1 then '5000<=salary<10000'
                         else 'salary>=15000'
  end;
  dbms_output.put_line( v_temp );
--exception 
end;
demo5:
--流程控制
declare 
  v_sal employees.salary%type;
  v_temp varchar2(30);


begin 
  select salary into v_sal from employees where employee_id = 150;
  v_temp := 
  case trunc(v_sal/5000) when 0 then 'salary<5000'
                         when 1 then '5000<=salary<10000'
                         else 'salary>=15000'
  end;
  dbms_output.put_line( v_temp );
--exception 
end;
demo6:
--儲存過程開啟
set serveroutput on
--儲存過程無返回值
create or replace procedure salary_sum1(dept_id number, v_sumsal out number) 
is 
       cursor salary_cursor is select salary from employees where department_id = dept_id;
begin 
      v_sumsal := 0;
      for c in salary_cursor loop 
        v_sumsal := v_sumsal + c.salary; 
      end loop;
      dbms_output.put_line(v_sumsal);
end;
--呼叫儲存過程
declare 
  v_sumsal number(10) := 0;
begin
  salary_sum1(80, v_sumsal); 
end;
demo7:
--給指定部門的,按入職時間加薪,公司每月多支出多少
create or replace procedure add_sal(dept_id number, temp out number)
is 
       cursor sal_cursor is select employee_id, salary, hire_date  
              from employees where department_id = dept_id;
       v_i number(5,2) := 0;
begin 
       temp := 0;
       for c in sal_cursor loop
          if to_char(c.hire_date, 'yyyy') < '1995' then v_i := 0.05;
          elsif to_char(c.hire_date, 'yyyy') < '1998' then v_i := 0.03;
          else  v_i := 0.01;
          end if;
          
          --1.更新工資
          update employees set salary = salary + v_i * salary where employee_id = c.employee_id;
          
          --2.付出的成本
          temp :=  temp + c.salary * v_i;
        end loop;
end;

--呼叫儲存過程
declare 
  v_temp number(10) := 0;
begin 
  add_sal(80, v_temp);
  dbms_output.put_line(v_temp);
end;

2.儲存函式:

demo1:

--儲存函式:有返回值。
create or replace function func_name(dept_id number, salary number)
return number 
is 
       --函式使用過程中,需要宣告的變數、記錄型別、cursor
begin
       --函式的執行體    
exception 
       --處理函式執行過程中的異常   
end;  

demo2:

create or replace function hello_world  return varchar2  is     --函式使用過程中,需要宣告的變數、記錄型別、cursor begin        --函式的執行體        dbms_output.put_line('hello world!'); exception         --處理函式執行過程中的異常 end;   --呼叫上面儲存函式 begin    dbms_output.put_line(hello_world); end; --呼叫上面儲存函式 select hello_world from dual;
demo3:
--帶參函式
create or replace function hello_world1(v_name varchar2) 
return varchar2 
is 
begin 
  return ('hello! ' || v_name);
end;
--
--呼叫帶參函式
select hello_world1('lixuan') from dual;
demo4:
--建立儲存函式返回當前系統時間
create or replace function get_sysdate 
return date 
is 
       v_date date;
begin 
  v_date := sysdate;
  return v_date;
end;

--呼叫上面這個函式
begin 
  dbms_output.put_line(get_sysdate);
end; 
demo5:
--指定部門的工資總和
create or replace function salary_sum(dept_id number) 
return number 
is 
       v_sumsal number(10) := 0;
       cursor salary_cursor is select salary from employees where department_id = dept_id;
begin 
  for c in salary_cursor loop 
    v_sumsal := v_sumsal + c.salary;  
  end loop;
  return v_sumsal;
end;

--呼叫
select salary_sum(80) from dual;
demo6:
--含有out 引數的函式:傳入的out引數值會被改變,in引數不能改變
create or replace function salary_sum(dept_id number, total_count out number) 
return number 
is 
       v_sumsal number(10) := 0;
       cursor salary_cursor is select salary from employees where department_id = dept_id;
begin 
  total_count := 0;
  for c in salary_cursor loop 
    v_sumsal := v_sumsal + c.salary;
    total_count := total_count + 1;  
  end loop;
  return v_sumsal;
end;

--呼叫函式
declare 
  v_num number(5) := 0;
begin 
  dbms_output.put_line(salary_sum(80, v_num)); 
  dbms_output.put_line(v_num); 
end;

關於Struts2 130529143交流。 有償技術支援Q群:398162181 

相關推薦

PLSQL儲存過程儲存函式

關於Struts2 130529143交流。 有償技術支援Q群:398162181  1.儲存過程與儲存函式的區別: 儲存過程無返回值,儲存函式有返回值。 2.儲存過程:demo1: declare    --宣告一個記錄型別   type emp_record i

資料庫儲存過程儲存函式

儲存過程 在java中經常用封裝的思想來提高程式碼的重用性,在java中為什麼要定義方法?原因是有一個功能是需要在不同的地方多次使用的,如果在每一個需要呼叫的地方都寫一遍會造成程式碼量很大,所以我們把他抽取成單獨的方法,在需要使用的時候呼叫這個方法。同樣的道理,如果同一個資料庫操作需要被多次使用

mysql儲存過程部分函式

轉載,很詳細,就極其不要臉的轉過來儲存一下。點選檢視原文 儲存過程簡介 SQL語句需要先編譯然後執行,而儲存過程(Stored Procedure)是一組為了完成特定功能的SQL語句集,經編譯後儲存在資料庫中,使用者通過指定儲存過程的名字並給定引數(如果該儲存過程帶有引數

Java中呼叫Oracle儲存過程儲存函式

一. 編寫測試所用儲存函式或函式 --1.建立一個帶引數的儲存過程,沒有返回值 --給指定的員工漲100元的工資,並且列印漲錢和漲後的工資 create or replace procedure raisesalary(eno in number) as

Oracle儲存過程函式的練習題

--儲存過程、函式練習題 --(1)建立一個儲存過程,以員工號為引數,輸出該員工的工資create or replace procedure p_sxt1(v_empno in emp.empno%type, v_sal out emp.sal%type) isbegin select sal into v_

SQL Server 只讀賬號/只讀登入名可檢視儲存過程函式許可權

公司為了收緊生產資料庫的登入名,目前我們公司生產資料庫登入名基本賦予了sa賬戶的許可權,這樣做是很危險的,所以領導要求給運維同事授予資料庫只讀查詢的賬號,但同時又需要讓運維同事可檢視儲存過程,因為儲存過程和函式中有很多攔截異常的判斷,當提示報錯內容時,運維同事可以通過報錯的關

資料庫學習之儲存過程函式

一、變數    1、定義:    DECLARE var_name type[DEFAULT value]    例如,定義一個DATE型別的變數last_month_start:    DECLARE last_month_start DATE    2、變數的賦值:   

Hive中建立和呼叫儲存過程自定義函式

前面的文章《在Hive中實現儲存過程–HQL/SQL》中介紹瞭如何使用HPL/SQL在Hive中實現儲存過程,執行類似Oracle PL/SQL的功能。 一般的業務場景是資料開發人員開發好一個儲存過程,然後週期性的呼叫,傳入不同的引數即可。 本文繼續介紹如何在Hive中利

oracle儲存過程自定義函式(儲存函式)初學

1.儲存過程和儲存函式的主要區別       儲存函式可以通過return返回函式值;儲存函式可以在SQL語句內部呼叫;儲存函式較儲存過程有諸多限制;儲存過程用select語句返回記錄集,儲存函式使用表變數返回記錄集。 2.儲存過程和儲存函式的建立        儲存過程的

SQL2000系統表、儲存過程函式的功能介紹應用2009年01月21日 星期三 11:38雖然使用系統儲存過程、系統函式與資訊架構檢視已經可以為我們提供了相當豐富的元資料資訊,但是對於某些特殊的元資料資訊,我們仍然需要直接對系統表進行查詢。因為SQL

雖然使用系統儲存過程、系統函式與資訊架構檢視已經可以為我們提供了相當豐富的元資料資訊,但是對於某些特殊的元資料資訊,我們仍然需要直接對系統表進行查詢。因為SQL Server 將所有資料庫物件的資訊均存放在系統表中,作為 SQL Server 的管理、開發人員,瞭解各個系統表的作用將有助於我們瞭解 SQL

除錯SQL Server的儲存過程使用者定義函式

1、在查詢分析器中除錯 查詢分析器中除錯的步驟如下:SQL 2000查詢分析器--左連的物件瀏覽器(沒有的話按F8)--物件項中--右鍵除錯的儲存過程--除錯--輸入引數(必須輸入所有的引數,包括預設值/輸出引數--點選執行--出現一個浮動工具條--上面有單步執行,斷點設定

MySQL優化---儲存過程儲存函式-1-轉自部落格園

轉自網際網路.mysql優化   當一個大型系統在建立時,會發現,很多的SQL操作是有重疊的,個別計算是相同的,比如:業務系統中,計算一張工單的計算方式。當遇到這些情況時,我們運用儲存過程就是一個非常棒的優化啦。那麼,什麼是儲存 過程和儲存函式呢? 一、MYSQL儲存過程簡介(技術

mysql儲存過程拼接字串的用法

DROP PROCEDURE IF EXISTS insert_historytable;DELIMITER //CREATE PROCEDURE insert_historytable()BEGIN ##定義判斷變數 DECLARE 1_id varchar(50); DECLARE 1_dissolved

MySQL - - 【檢視】【觸發器】【儲存過程】【函式】【事物】【資料庫鎖】【資料庫備份】

目錄 檢視 觸發器 儲存過程 函式 事物 資料庫鎖 資料庫備份 1 檢視 檢視:是一個虛擬表,其內容由查詢定義。同真實的表一樣,檢視包含一系列帶有名稱的列和行資料 檢視有如下特點; 1 檢視的列可以來自不同的表,是表的抽象和邏輯意義上建立的新關

從頭開始學MySQL-------儲存過程儲存函式(4)

儲存過程與儲存函式的補充 MySQL的儲存過程與儲存函式有什麼區別?         儲存函式只能通過return語句返回單個值或者表物件。         儲存過程不能用return,但是可

sqlserver 只有函式和擴充套件儲存過程才能從函式內部執行

一個SQLServer的自定義函式中呼叫一個自定義的儲存過程,執行此函式後發出如下提示:“只有函式和擴充套件儲存過程才能從函式內部執行"。原因:函式只能使用簡單的sql語句,邏輯控制語句,複雜一點的儲存過程是不能呼叫的,在函式裡也不能使用execute sp_executesql 或者execute 。解決方

MySQL-SQLyog執行儲存過程儲存函式

1.開啟SQLyog在目錄樹-函式(儲存過程)資料夾上右鍵,建立函式(建立儲存過程) 2.按照MySQL定義函式的規則,新定義一個函式:   3. 然後新建查詢編輯器,呼叫自定義的函式。 命令:SELECT function_name(params1, ...),函式名稱

實習複習--資料庫儲存過程儲存函式&&觸發器8

儲存過程: 1定義:就是為了適用於針對資料庫的某一個重複功能的開發。就是多條sql語句的集合, 2使用規則 建立儲存過程create procedure 儲存過程名(in/out/inout   引數名 資料型別) begin sql語句的集合 end  3儲存

MySQL5.7從入門到精通-------儲存過程儲存函式(2)

10.1.6  流程控制的使用         (1)IF語句的使用。 DROP PROCEDURE IF EXISTS testIf; DELIMITER // CREATE PROCEDURE

MySQL5.7從入門到精通-------儲存過程儲存函式(3)

10.2.1  呼叫儲存過程         儲存過程必須使用CALL語句來呼叫。如果要呼叫其它資料庫的儲存過程,需要指定資料庫名稱。例如 CALL dbname.spname DROP TABLE IF EXISTS t_student; CREATE TABLE t_