數據庫學習12-存儲過程

子程序和程序包
  1.1子程序
    1.1.1 過程
     1.1.2 函數 形參只能in,必須return,形參和返回值只能是sql類型;

  1.2程序包


/*
  命名塊: 1存儲過程 2函數
*/
/*
 過程 的格式:
CREATE OR REPLACE PROCEDURE pro_test(形參列表)
  
IS|AS
  --聲明部分
BEGIN
EXCEPTION 
END pro_test;
*/
CREATE OR REPLACE PROCEDURE pro_print 
IS
BEGIN
  dbms_output.put_line('第一個存儲過程...');
END pro_print;
--查看用戶創建的存儲過程
SELECT * FROM user_objects 
  WHERE object_type=upper('procedure');
BEGIN
  pro_print;
END;
--創建一個存儲過程,輸入工號,打印名字,
--沒找員工,就打印‘該員工不存在’
CREATE OR REPLACE PROCEDURE pro_a(e_id NUMBER)  
IS
 e_name emp.ename%TYPE;
BEGIN
 SELECT ename INTO e_name FROM emp
   WHERE empno= e_id;
 dbms_output.put_line(e_name);
EXCEPTION
 WHEN OTHERS THEN
   dbms_output.put_line('該員工不存在');
END pro_a; 

BEGIN
  pro_a(&ii);
END;

--in 參數 只能傳遞進來,不能發生變化
CREATE OR REPLACE PROCEDURE pro_in_parm(a IN NUMBER)
IS 
BEGIN
  dbms_output.put_line(a);
END pro_in_parm;

BEGIN
  pro_in_parm(6);
END;

--out 參數 不能傳遞進來,但是可以發生變化,而且可以輸出
CREATE OR REPLACE PROCEDURE 
    pro_out_parm(a OUT NUMBER)
IS 
BEGIN
  dbms_output.put_line(a);
  a:=111;
END pro_out_parm;

DECLARE
  v NUMBER DEFAULT 6;
BEGIN
  pro_out_parm(v);
  dbms_output.put_line('外部:'||v);
END;
    
--in out 參數
CREATE PROCEDURE 
  pro_in_out(a IN OUT NUMBER) 
IS
BEGIN
  dbms_output.put_line('傳遞進來的是:'||a);
  a:=a**3;  --三次方
END pro_in_out;
 
DECLARE
  i NUMBER;
BEGIN
  i:= 4;
  pro_in_out(i);
  dbms_output.put_line('外部:'||i);
END;

CREATE OR REPLACE PROCEDURE 
   pro_swap(a IN OUT NUMBER,b IN OUT NUMBER)
IS 
  temp NUMBER;
BEGIN
  temp:=b;
  b:= a;
  a:= temp;
END pro_swap;


DECLARE
  t1 NUMBER;
  t2 NUMBER;
BEGIN
  t1 := 111;
  t2 := 222;
  pro_swap(t1,t2);
  dbms_output.put_line('t1:'||t1);
  dbms_output.put_line('t2:'||t2);
END;

/*
   函數的格式:
CREATE OR REPLACE FUNCTION 函數名字 
   RETURN 數據類型
IS|AS
BEGIN
EXCEPTION 
END 函數名字;
*/
CREATE OR REPLACE FUNCTION yao
   RETURN VARCHAR2
IS 
BEGIN
   RETURN 'yao';
END yao; 
SELECT * FROM user_objects 
  WHERE object_type = 'FUNCTION';
BEGIN
  dbms_output.put_line(yao);
END;
SELECT yao FROM dual;
--寫一個函數,根據員工編號,返回工作年限
--select 語句調用函數
CREATE OR REPLACE FUNCTION fun_a(e_id IN OUT NUMBER)
  RETURN NUMBER
IS
 h DATE;
BEGIN
  SELECT hiredate INTO h FROM emp
    WHERE empno=e_id;
  e_id := 100;
  RETURN trunc((SYSDATE-h)/365);
END fun_a;

SELECT fun_a(7839) FROM dual;
DECLARE
  i NUMBER DEFAULT 7839;
BEGIN
  dbms_output.put_line(fun_a(i));
  dbms_output.put_line(i);
END;

CREATE OR REPLACE FUNCTION f 
 RETURN NUMBER
IS
BEGIN
  EXECUTE IMMEDIATE 
    'create table tt(t number)';
  RETURN 3;  
END;
--存儲過程和函數的區別 :
-- 1. 函數必須有return語句,而過程裏面可以有也可以沒有
-- 2. 函數必須返回一個值,而過程即使return也不會返回值
-- 3. 過程可以像其他所有的pl/sql程序一樣使用,而函數是有特定目的程序塊



--?在jdbc或其他的持久方案裏怎麼調用存儲過程


發佈了108 篇原創文章 · 獲贊 22 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章