--IFELSE
DECLARE
V_NUM NUMBER;
BEGIN
V_NUM := 100;
IF V_NUM > 100 THEN
--
ELSIF V_NUM > 50 THEN
--
ELSE
--
END IF;
END;
--带参数存储过程
CREATE OR REPLACE PROCEDURE DELETE_SUBSCRIBER(P_SUBID IN NUMBER) IS
V_MEM VARCHAR2(100) := '<SQL5.4.4.11R2.p14121911_6861>';
BEGIN
--。。。
END DELETE_SUBSCRIBER;
/
--不带参数存储过程
CREATE OR REPLACE PROCEDURE DELETE_SUBSCRIBER IS
V_MEM VARCHAR2(100) := '<SQL5.4.4.11R2.p14121911_6861>';
BEGIN
--。。。
END DELETE_SUBSCRIBER;
/
--带参数的函数
其中RETURN字句是必须存在的,一个函数如果没有执行RETURN字句就结束语句会发生错误
CREATE OR REPLACE FUNCTION GET_PRODUCTSTR(P_SUBID IN NUMBER, P_PAYDT DATE)
RETURN VARCHAR2 IS
RESULT VARCHAR2(1024);
BEGIN
MERGE_STR := '';
FOR V_P IN C_PRODUCTINFO LOOP
MERGE_STR := MERGE_STR || V_P.PRODUCTNAMESTR || '[R:' || V_P.MONTHFEE || ']. ';
END LOOP;
RETURN RESULT;
END;
/
--函数可以有默认值
CREATE OR REPLACE FUNCTION CountryNumber(n_max number default 10000,n_min number default 10)
RETURN VARCHAR2 IS
v_resultvalue vacharr2(50);
BEGIN
RETURN v_resultvalue;
END;
--异常处理例子
DECLARE
V_NUM NUMBER(2) := 10;
V_ZERO NUMBER(2) := 0;
V_RESULT NUMBER(5);
BEGIN
V_RESULT := V_NUM / V_ZERO;
EXCEPTION
WHEN ZERO_DIVIDE THEN
DBMS_OUTPUT.PUT_LINE('DIVIDE ZERO');
END;
异常说明:
DUP_VAL_INDEX:违反唯一性
LOGIN_DENIED: 登陆失败,用户名密码错误
NO_DATA_FOUND:没有发现数据存在
TOO_MANY_ROWS:数据行太多,
ZERO_DIVIDE:除数为0错误
VALUE_ERROR: 算法或转换错误
CASE_NOT_FOUND: 在case语句中发现不匹配的when语句
DECLARE
E_OVERNUMBER EXCEPTION;
BEGIN
IF V_MAX < V_NUM THEN
-- deal....
RAISE E_OVERNUMBER;
END IF EXCEPTION
WHEN E_OVERNUMBER THEN DBMS_OUTPUT.PUT_LINE("ERR MSG");
END;