開發PLSQL子程序

1. 子程序:

子程序是已命名的PL/SQL,可帶參數並可從調用環境中進行調用.與未命名或匿名PL/SQL塊一樣,

子程序具有聲明部分,可執行部分和可選的異常處理部分;

子程序的優點:

l        模塊化: 通過子程序,可以將程序分解爲可管理的,明確的邏輯模塊.

l        可重用性: 子程序在創建並執行後,就可以在任意數目的應用程序中使用;

l        可維護性: 子程序可以簡化維護操作,因爲如果一個子程序受到影響,則只需修改該子程序的定義

1.1開發存儲過程

1)建立帶參或者不帶參的存儲過程

例如:

create or replace procedure find(e_sal number)    --建立過程
is
    cursor cur_emp is select ename,sal fromscott.emp where sal<=e_sal;   --定義一個遊標
    row_emp cur_emp%rowtype;           --基於遊標定義一個記錄
begin
  open cur_emp;
  fetch cur_emp into row_emp;
  while cur_emp%found        --循環檢測遊標屬性,看是否到最後一行
  loop
    dbms_output.put_line(row_emp.ename||'--'||row_emp.sal);
  fetch cur_emp into row_emp;         --從遊標提取一行到記錄中
  end loop;
  close cur_emp;
end;
 
call find(1500);   --調用find過程


2)建立帶輸出參數的存儲過程

在過程中輸出數據用OUTIN OUT參數來完成的.

 

--建立帶OUT輸出參數的過程

create OR REPLACEPROCEDURE query_employee
(eno number,NAME OUTVARCHAR2,salary OUT NUMBER)
IS
BEGIN
    SELECT ename , sal INTO NAME,salary FROMscott.emp WHERE empno = eno;
    EXCEPTION
      WHEN NO_DATA_FOUND THEN
        RAISE_APPLICATION_ERROR(-20000,'該僱員不存在');
END;

以下是在SQL*PLUS中調用該過程的示例:

 

SQL> var namevarchar2(10)
SQL> var salarynumber
SQL> execquery_employee(7799,:name,:salary)
 
beginquery_employee(7799,:name,:salary); end;
 
ORA-20000: 該僱員不存在
ORA-06512: 在"SYS.QUERY_EMPLOYEE", line 8
ORA-06512: 在line 1
name
---------
 
salary
---------


1.2開發函數

函數是一段獨立的PL/SQL程序代碼,它執行某個特定的,明確的任務.通常,函數將處理從程序的調用部分傳遞給它的信息,然後返回單個值.信息通過稱爲參數的特殊標識符傳遞給函數,然後通過return語句返回.建立函數語法如下:

 

Create[or replace]function function_name
(argument1[model]datatype1,
Argument2[model]datatype2,
…
)
Return datetype
is|as
       PL/SQL Block;


建立函數時參數可帶可不帶,當定義參數是,如果不指定參數模式,則默認輸入參數,所以IN關鍵字既可以指定也可以不指定

示例如下:

--建立帶參的函數

create or replacefunction get_user(e_no in number)
return varchar2
is
  v_user scott.emp.ename%type;
begin
   select ename into v_user from scott.empwhere empno=e_no;
   return v_user;
end;
--調用函數
declare
 e_name scott.emp.ename%type;
begin
  e_name := GET_USER(7369);
  dbms_output.put_line(e_name);
end;


一般情況下,函數只需要返回單個數據.如果希望使用函數返回多個數據,就需要使用輸出參數了,以下爲建立帶OUT參數函數模式

--建立帶輸出參數的函數
create or replacefunction get_info
(NAME IN VARCHAR2,titleOUT VARCHAR2)
return varchar2
as
  deptname scott.dept.dname%type;
begin
    select a.job,b.dname into title,deptnamefrom scott.emp a, scott.dept b
     where a.deptno = b.deptno
     and upper(ename)=upper(name);
    return deptname;
EXCEPTION 
      WHEN NO_DATA_FOUND THEN
           raise_application_error(-20000,'該僱員不存在');
end;
 
SQL> var jobvarchar2(20)
SQL> var dnamevarchar2(20)
SQL> exec :dname:=get_info('scott',:job)
 
PL/SQL 過程成功完成
dname
---------
RESEARCH
job
---------
ANALYST


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