Oracle中的存儲過程簡單例子


--創建表
create table TESTTABLE
(
  id1  VARCHAR2(12),
  name VARCHAR2(32)
)
select t.id1,t.name from TESTTABLE t
insert into TESTTABLE (ID1, NAME)
values ('1', 'zhangsan');


insert into TESTTABLE (ID1, NAME)
values ('2', 'lisi');


insert into TESTTABLE (ID1, NAME)
values ('3', 'wangwu');


insert into TESTTABLE (ID1, NAME)
values ('4', 'xiaoliu');


insert into TESTTABLE (ID1, NAME)
values ('5', 'laowu');
---創建存儲過程
create or replace procedure test_count
as
v_total number(1);
begin
  select count(*) into v_total from TESTTABLE;
  DBMS_OUTPUT.put_line('總人數:'||v_total);
end;
--准備
--線對scott解鎖:alter user scott account unlock; 
--應為存儲過程是在scott用戶下。還要給scott賦予密碼
---alter user scott identified by tiger;
---去命令下執行
EXECUTE test_count;
----在ql/spl中的sql中執行
begin
  -- Call the procedure
  test_count;
end;



create or replace procedure TEST_LIST
      AS 
      ---是用游標
        CURSOR test_cursor IS select t.id1,t.name from TESTTABLE t;
      begin
        for Test_record IN test_cursor loop---遍歷游標,在打印出來
           DBMS_OUTPUT.put_line(Test_record.id1||Test_record.name);
           END LOOP;
            test_count;--同時執行另外一個存儲過程(TEST_LIST中包含存儲過程test_count)
            end;
      -----執行存儲過程TEST_LIST
      begin 
         TEST_LIST;
         END;
       ---存儲過程的參數
        ---IN  定義一個輸入參數變量,用於傳遞參數給存儲過程   
        --OUT 定義一個輸出參數變量,用於從存儲過程獲取數據   
        ---IN OUT  定義一個輸入、輸出參數變量,兼有以上兩者的功能  
        --這三種參數只能說明類型,不需要說明具體長度 比如 varchar2(12),defaul 可以不寫,但是作為一個程序員最好還是寫上。
        
      ---創建有參數的存儲過程
      create or replace procedure test_param(p_id1 in VARCHAR2 default '0')
        as v_name varchar2(32);
        begin
          select t.name into v_name from TESTTABLE t where t.id1=p_id1;
          DBMS_OUTPUT.put_line('name:'||v_name);
         end;
      ----執行存儲過程
      begin
         test_param('1');
       end;
       
       default '0'




      ---創建有參數的存儲過程
      create or replace procedure test_paramout(v_name OUT VARCHAR2 )
        as  
        begin
          select name into v_name from TESTTABLE where id1='1';
          DBMS_OUTPUT.put_line('name:'||v_name);
         end;
      ----執行存儲過程
    DECLARE  
        v_name VARCHAR2(32);   
        BEGIN  
        test_paramout(v_name);
        DBMS_OUTPUT.PUT_LINE('name:'||v_name);   
        END;  
    -------IN OUT
    ---創建存儲過程
    create or replace procedure test_paramINOUT(p_phonenumber in out varchar2)
    as  
    begin 
      p_phonenumber:='0571-'||p_phonenumber;
    end;
    
    ----
    DECLARE  
    p_phonenumber VARCHAR2(32);  
    BEGIN  
    p_phonenumber:='26731092';  
    test_paramINOUT(p_phonenumber);  
    DBMS_OUTPUT.PUT_LINE('新的電話號碼:'||p_phonenumber);  
    END;  
    -----sql命令下,查詢當前用戶的存儲過程或函數的源代碼,
    -----可以通過對USER_SOURCE數據字典視圖的查詢得到。USER_SOURCE的結構如下:
    
    SQL> DESCRIBE USER_SOURCE ;
    Name Type           Nullable Default Comments                                                                                                      
    ---- -------------- -------- ------- ------------------------------------------------------------------------------------------------------------- 
    NAME VARCHAR2(30)   Y                Name of the object                                                                                            
    TYPE VARCHAR2(12)   Y                Type of the object: "TYPE", "TYPE BODY", "PROCEDURE", "FUNCTION",
    "PACKAGE", "PACKAGE BODY" or "Java SOURCE" 
    LINE NUMBER         Y                Line number of this line of source                                                                            
    TEXT VARCHAR2(4000) Y                Source text                                                                                                   
    SQL> 
    ---查詢出存儲過程的定義語句
    select text from user_source WHERE NAME='TEST_COUNT';
    ----查詢存儲過程test_paramINOUT的參數
    SQL> DESCRIBE test_paramINOUT;
    Parameter     Type     Mode   Default? 
    ------------- -------- ------ -------- 
    P_PHONENUMBER VARCHAR2 IN OUT  
    SQL> 
    ---查看當前的存儲過程的狀態是否正確,
    ---VALID為正確,INVALID表示存儲過程無效或需要重新編譯
    SELECT STATUS FROM USER_OBJECTS WHERE OBJECT_NAME='TEST_COUNT';
    -----如果要檢查存儲過程或函數的依賴性,可以通過查詢數據字典USER_DENPENDENCIES來確定,該表結構如下:
    SQL> DESCRIBE USER_DEPENDENCIES;
    Name                 Type          Nullable Default Comments                                                   
    -------------------- ------------- -------- ------- ---------------------------------------------------------- 
    NAME                 VARCHAR2(30)                   Name of the object                                         
    TYPE                 VARCHAR2(17)  Y                Type of the object                                         
    REFERENCED_OWNER     VARCHAR2(30)  Y                Owner of referenced object (remote owner if remote object) 
    REFERENCED_NAME      VARCHAR2(64)  Y                Name of referenced object                                  
    REFERENCED_TYPE      VARCHAR2(17)  Y                Type of referenced object                                  
    REFERENCED_LINK_NAME VARCHAR2(128) Y                Name of dblink if this is a remote object                  
    SCHEMAID             NUMBER        Y                                                                           
    DEPENDENCY_TYPE      VARCHAR2(4)   Y                                                                               
    SQL>  
    ---查詢存儲過程TEST_COUNT的依賴關系
    SELECT REFERENCED_NAME,REFERENCED_TYPE FROM USER_DEPENDENCIES WHERE NAME='TEST_COUNT';


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM