1. 程式人生 > >Oracle儲存過程學習筆記(一)

Oracle儲存過程學習筆記(一)

SQL是一種語言!

一、先看一部分基礎:

也可參考該文章:https://www.cnblogs.com/Singleorb/p/6217268.html;
1、語法 
 CREATE OR REPLACE PROCEDURE 儲存過程名字
    (
        引數1 IN NUMBER,
        引數2 IN NUMBER
    ) IS
    變數1 INTEGER :=0;
    變數2 DATE;
    BEGIN

    END 儲存過程名字;

  這裡的is也可以用as替代!
例子:
create        -- 儲存過程頭部區域開始 
or replace    --可選表示如果資料庫中已經存在一條相同名稱的儲存過程就把它替換掉
procedure
proc_emp_create --儲存過程名稱 procedure_name
(
empno number, ename varchar2, job varchar2, mgr number, hiredate date, sal number, comm number, deptno number
) -- parameter_declaration 宣告引數(注意不需要寫長度),儲存過程頭部區域結束
as
--宣告區域,不需要宣告變數可以不寫
begin -- PL/SQL標準執行語句
--執行區域
  insert into emp values(empno, ename, job, mgr, hiredate, sal, comm, deptno);
end;


一個儲存過程可以分成三個區域
頭部區域
用於編寫最基本的儲存過程頭部標記,定義是否要建立一個替代原有儲存過程的儲存過程;決定是否定義引數;定義引數的型別(in out inout);定義執行許可權(Schema)。

宣告區域
用於宣告變數(要定義長度)包括cursor;

執行區域
用於執行業務邏輯程式碼,可以使用條件語句(選擇、判斷、迴圈。。。)來進行一些業務邏輯CRUD的處理

2.SELECT INTO STATEMENT
將select查詢的結果存入到變數中,可以同時將多個列儲存多個變數中,必須有一條
記錄,否則丟擲異常(如果沒有記錄丟擲NO_DATA_FOUND)
例子: 
BEGIN
   SELECT col1,col2 into 變數1,變數2 FROM typestruct where xxx;
EXCEPTION
WHEN NO_DATA_FOUND THEN
  xxxx;
END;

在利用select...into...語法時,必須先確保資料庫中有該條記錄,否則會報出"no data found"異常。
可以在該語法之前,先利用select count(*) from 檢視資料庫中是否存在該記錄,如果存在,再利用select...into...


注意事項在oracle中,資料表別名不能加as,如:
select a.appname from appinfo a;-- 正確
select a.appname from appinfo as a;-- 錯誤
也許,是怕和oracle中的儲存過程中的關鍵字as衝突的問題吧;

 

二、再看一個例子來熟悉建立和呼叫(自己操作看結果)

create table mytest(
    name varchar2(50),
    age number(10)
);


--迴圈往表中插入資料
DECLARE
   X number; --宣告變數
BEGIN
   x := 1; --給初值
   FOR X IN REVERSE 1 .. 10 LOOP
     insert into mytest  values ('張三',10);
   END LOOP;
   COMMIT;
END;


--建立儲存過程
create or replace procedure AutoUpdateName(
v_oldName in VARCHAR2,/*舊名稱*/
v_newName in VARCHAR2/*新名稱*/
)
 is
begin
  
  UPDATE mytest SET name=REPLACE(name,v_oldName,v_newName) WHERE  name LIKE '%'||v_oldName||'%';
  COMMIT;

end AutoUpdateName;


--呼叫該儲存過程
begin
AutoUpdateName('張三','李四');
commit;
end;

 結果會看到,呼叫該儲存過程後將表中的資料張三全部替換成為了李四;