Oracle預存程序入門

來源:互聯網
上載者:User

 

學習的時候要靜下心去學習,不要心浮氣躁。其中找了一些網上的資料和自己的理解,再做以實踐,由於預存程序內容是比較多的,我這裡只能做個入門,希望大家能自己深入學習。

 

--  文中這個符號,等於注釋的意思

 

1.基本結構
  CREATE OR REPLACE PROCEDURE 預存程序名字
  (
  參數1 IN 資料類型,
  參數2 IN 資料類型
  ) IS
  變數1 資料類型;
  變數2 資料類型;
  BEGIN

         ********* --預存程序的業務,也就是你想要做的事
  END 預存程序名字

 

      上面的大寫字母是保留字,資料類型有很多,說幾個基本的,以後靠大家自己去學習,比如:NUMBER,VARCHAR,VARCHAR2,這裡的等於符號是 :=    這裡定義變數的方式比較獨特採用的是

      變數  資料類型;

      eg

      t_name VARCHAR2(100);

      t_age    NUMBER;

 

     如何給變數賦值

     t_name := 'aaaaaaa';

     t_age := 10;

 

 

  2.SELECT INTO STATEMENT

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

  3.IF 判斷

  IF V_TEST=1 THEN
    BEGIN
     do something --這句是你要處理的自己業務
    END;
  END IF;

  4.WHILE迴圈

  WHILE V_TEST=1 LOOP
     BEGIN
          XXXX
     END;
    END LOOP;

  5.變數賦值

  V_TEST := 123;

  6.用for in 使用cursor

      CREATE OR REPLACE PROCEDURE TEST(name in number)
    IS
  CURSOR cur IS select * FROM xxx; --這裡是定義一個遊標,把查詢結果放入遊標中,

      --遊標就象指標,大家可以這麼去理解

     
    BEGIN
       FOR cur_result in cur LOOP
          BEGIN
           V_SUM :=cur_result.列名;
          END;
       END LOOP;
  END;

 

      看看下面的例子

 

      CREATE OR REPLACE PROCEDURE TEST(name in number)
      is  
      V_SUM varchar2(200);
      cursor cur is select * from LAD_USER;
      BEGIN
         for V_RESULT in cur LOOP
             BEGIN
                   V_SUM := V_RESULT.User_Name;
             END;
         end LOOP;
         DBMS_OUTPUT.put_line(V_SUM); --輸出命令
      END TEST;

 

  7.帶參數的cursor

    CURSOR C_USER(C_ID NUMBER) IS select NAME FROM USER where TYPEID=C_ID;

    OPEN C_USER(變數值);

  LOOP
  FETCH C_USER INTO V_NAME;
    EXIT FETCH C_USER%NOTFOUND;
     do something
    END LOOP;

  CLOSE C_USER;

 

  8.用pl/sql developer debug
  串連資料庫後建立一個Test WINDOW
  在視窗輸入調用SP的代碼,F9開始debug,CTRL+N單步調試

 

      9.運行

      我第一次學習的時候很苯,連預存程序都沒建立就去執行調用命令,請大家別和我一樣。

 

      有2種方式去執行

      1.首先dos環境串連到oracle資料庫

 

       sqlplus 使用者名稱/密碼@資料庫地址,通過這個命令可以串連到資料庫。

 

       比如:sqlplus TEST_ZJ/111111@192.168.10.10_ORCL     

 

      

       這樣接串連上資料庫了,下面把要建立的預存程序複製到一個txt文字檔,然後把文字檔修改為TEST.sql 這樣類型的檔案。

      這裡我直接把EST.sql存在了E:/根目錄

 

     串連上以後,接著執行命令  @TEST

                                            /

   

    執行完這2個命令,預存程序就被建立了。

 

    調用預存程序  call TEST(1); 

 

    這樣dos的建立和調用就結束了,我感覺還是挺麻煩的,不過這是基礎,還是瞭解的好。

 

 

    另一種辦法,就是用工具了,就是第8點說的辦法,下一個PLSQL Developer ,推薦,非常好用,串連上後,直接建立一個預存程序,通過執行,才能把預存程序寫進資料庫,再用Test WinDow進行測試,命令直接寫call TEST(1) 然後點左上方的執行,就可以看到了結果了

 

  

 

 

 

 

 

 

 

 

 

 

 

1.命令格式

 
預存程序是一個PL/SQL程式塊,接受零個或多個參數作為輸入(INPUT)或輸出(OUTPUT)、或既作輸入又作輸出(INOUT),與函數不同,
預存程序沒有傳回值,預存程序不能由SQL語句直接使用,只能通過EXECUT命令或PL/SQL程式塊內部調用,定義預存程序的文法如下:PROCEDURE
 Name 
[
(Parameter[,Parameter,
]
)]

IS
|
AS

  
[
Local Declarations
]


BEGIN

  
Execute
 statements;
  
[
EXCEPTION Exception Handlers
]


END
 
[
Name
]
;

2.調用

  預存程序可以直接用EXECUT命令調用或PL/SQL程式塊內部調用。用EXECUT命令調用預存程序的格式如下:SQL
>
EXCUTE  Proc_Name(par1, par2…);  預存程序也可以被另外的PL/SQL塊調用,調用的語句是:DECLARE
 par1, par2;

BEGIN

  Proc_Name(par1, par2…);

END
;

3.釋放

  當某個預存程序不再需要時,應將其從記憶體中刪除,以釋放它佔用的記憶體資源。釋放過程的語句格式如下:SQL
>
DROP
 
PROCEDURE
 Proc_Name;4.執行個體:


  編寫預存程序,顯示所指定僱員名所在的部門名和位置。CREATE
 
OR
 
REPLACE
 
PROCEDURE
 DeptMesg(pename emp.ename
%
TYPE,
                                     pdname OUT dept.dname
%
TYPE,
                                     ploc   OUT dept.loc
%
TYPE) 
AS


BEGIN

  
SELECT
 dname, loc
    
INTO
 pdname, ploc
    
FROM
 emp, dept
   
WHERE
 emp.deptno 
=
 dept.deptno
     
AND
 emp.ename 
=
 pename;

END
;  調用:VARIABLE vdname 
VARCHAR2
(
14
);
VARIABLE vloc 
VARCHAR2
(
13
);

EXECUTE
 DeptMesg(
'
SMITH
'
, :vdname£? :vloc);

PRINT
 vdname vloc;

 

 

看完後,我自己學習寫的demo

 

 

CREATE OR REPLACE PROCEDURE DeptMesg(peid OUT LAD_USER.USER_ID%TYPE,pename OUT LAD_USER.USER_NAME%TYPE) IS
BEGIN
  SELECT USER_ID, USER_NAME INTO peid,pename
    FROM LAD_USER
   WHERE USER_ID = 1;
END DeptMesg;

 

 

測試代碼

 

-- Created on 2009-7-22 by ADMINISTRATOR
declare
  -- Local variables here
  id integer;
  names varchar2(100);
begin
  -- Test statements here 
  Dbms_Output.put_line('sssssssssssssss');
  DeptMesg(peid => id, pename => names);
  Dbms_Output.put_line('id:'||id);
  Dbms_Output.put_line('names:'||names);
end;

 

 

希望大家能看明白

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.