一、存儲過程的基本語法:
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 帶異常輸出的存儲過程