【Oracle】存儲過程寫法小例子


一、存儲過程的基本語法:

  CREATE OR REPLACE PROCEDURE 存儲過程名(param1 in type,param2 out type)

  IS

  變量1 類型(值范圍);

  變量2 類型(值范圍);  

  BEGIN

    select count(*) into 變量1 from 表名 where 列名=param1;

    if (判斷條件) then

      select 列名 into 變量2 from 表名 where 列名=param1;

      DBMS_OUTPUT.put_line('打印信息');

    Elsif (判斷條件) then

      dbms_output.put_line('打印信息');

    Else

      Raise 異常名 (NO_DATA_FOUND);

    End if;

  Exception

      When others then

        Rollback;   

  END;

二、已命名的異常:

  命名的系統異常               產生原因

  ACCESS_INTO_NULL           未定義對象

  CASE_NOT_FOUND              CASE中若未包含相應的WHEN,並且沒有設置ELSE時

  COLLECTION_IS_NULL           集合元素未初始化

  CURSER_ALREDAY_OPEN          游標已經打開

  DUP_VAL_NO_INDEX              唯一索引對應的列上有重復的列

  INVALID_CUSER               在不合法的游標上操作

  INVALID_NUMBER               內嵌的SQL語句不能將字符轉換為數字

  NO_DATA_FOUND               使用select into 未返回行,或應用索引表未初始化

  TOO_MANY_ROWS                執行select into 時,結果集超過一行

  ZERO_DIVIDE                  除數為0

  SUBSCRIPT_BEYOND_COUNT          元素下標超過嵌套表或VARRAY的最大值

  SUBSCRIPT_OUTSIDE_LIMIT          使用嵌套表或VARRAY時,將下標指定為負數

  VALUE_ERROR               賦值時,變量長度不足以容納實際數量

  LOGIN_DENIED               PL/SQL應用程序連接到ORACLE數據庫時,提供了不正確的用戶名和密碼

  NO_LOGGED_ON                 PL/SQL應用程序在沒有連接ORACLE數據庫的情況下訪問數據 

  PROGRAM_ERROR              PL/SQL內部問題,可能需要重裝數據字典& PL/SQL系統包

  ROWTYPE_MISMATCH             宿主游標變量與PL/SQL游標變量的返回類型不兼容

  SELF_IS_NULL                 使用對象類型時,在NULL對象上調用對象方法

  STORAGE_ERROR                運行PL/SQL時,超出內存空間

  SYS_INVALID_ID              無效的ROWID字符串

  TIMEOUT_ON_RESOURCE             ORACLE在等待資源時超時

三、實際例子

  3.1 沒有參數的過程

  create or replace procedure test_count
  is
  v_total int;
  v_date varchar(20);
  begin

    select count(*) into v_total from dual;
       select to_char(sysdate,'yyyy-mm-dd') into v_date from dual;
         DBMS_OUTPUT.put_line('總人數:'||v_total);
         DBMS_OUTPUT.put_line('當前時間:'||v_date);
  end;

  調用方法:

  begin

    test_count;
  end;

  3.2 僅帶傳入參數的過程

  create or replace procedure test_count1(v_id in varchar2)
       as
       v_name varchar(100);
       begin
         select c_name into v_name from tb_store where c_stono=v_id;
         DBMS_OUTPUT.put_line(v_id||'店的名稱為:'||v_name);
        exception
         when no_data_found then dbms_output.put_line('no_data_found');
       end;

       調用方法:

  begin
           test_count1(11910);
       end;

  3.3 僅帶輸出參數的過程

  create or replace procedure test_count2(v_name out varchar2)
  is
  begin
        select c_name into v_name from tb_store where c_stono='1101';
    exception
        when no_data_found then dbms_output.put_line('no_data_found');
  end;

  調用方法:

  declare
  v_name varchar(200);
  begin
    test_count2(v_name);
    dbms_output.put_line(v_name);
  end;

  3.4 帶輸入參數和輸出參數的存儲過程

  create or replace procedure test_count3(v_id in int,v_name out varchar2)
  is
  begin
    select c_name into v_name from tb_store where c_stono=v_id;
    dbms_output.put_line(v_name);
    exception
      when no_data_found then dbms_output.put_line('no_data_found');

  end;

  調用方法:

  declare
  v_name varchar(200);
  begin
    test_count3('1101',v_name);
  end;

  3.5 帶異常輸出的存儲過程

  

  


免責聲明!

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



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