oracle实例

--oracle示例:全部编译通过;
--1、带有输出参数的过程
CREATE OR REPLACE PROCEDURE update_sal(     
    v_empno     in emp.empno%TYPE,
    v_income     in emp.sal%TYPE,
    v_outcome     out emp.sal%TYPE) --地址传参
IS
BEGIN
    UPDATE emp SET sal=v_income WHERE empno=v_empno
    RETURNING sal INTO v_outcome;
    commit;    
END;

--调用
DECLARE
    v_outcome emp.sal%type;  
BEGIN
    update_sal(&empid,&income,v_outcome);--注意oracle中&empid表示输入参数;
    dbms_output.put_line('缴费:'||v_outcome);
END;

--2、带有输入输出参数的过程
CREATE OR REPLACE PROCEDURE divide(
    num1 IN OUT NUMBER,
    num2 IN OUT NUMBER) 
IS
    v1 NUMBER;
    v2 NUMBER;
BEGIN
    v1 := trunc(num1 / num2);
    v2 := mod(num1,num2);
    num1 := v1;
    num2 := v2;
END;

declare 
    v_var1 number:=4;
    v_var2 number:=2;
begin
    divide(v_var1,v_var2);--调用存储过程;
    DBMS_OUTPUT.PUT_LINE('v_var1='||v_var1);
    DBMS_OUTPUT.PUT_LINE('v_var2='||v_var2);
end;

--3、函数的例子
create or replace function fun_getSal(eno number)--默认in
return number
as
v_sal emp.sal%type;
begin
   select sal into v_sal from emp where empno=eno;
   return v_sal;
exception
   when others then
     raise_application_error(-20017,'雇员不存在');--raise抛出异常:可能报错错误号参数超出范围;
end fun_getSal;
--函数调用
--注意对应关系;
declare
  v_sal number;
  emp_20012 exception;
  pragma exception_init(emp_20012,-20017);
begin
  v_sal:=fun_getSal(&v_empno);
  dbms_output.put_line('sal='||v_sal);
  exception
  when emp_20012 then
      dbms_output.put_line('该---雇员不存在');
end;

--4、包的例子:
--包声明:
CREATE OR REPLACE PACKAGE DEMO_PACK IS
    DEPTREC DEPT%ROWTYPE;  --注意这个rowtype
    FUNCTION ADD_DEPT(DEPT_NO NUMBER, DEPT_NAME VARCHAR2, LOCATION VARCHAR2) RETURN NUMBER;
    FUNCTION REMOVE_DEPT(DEPT_NO NUMBER) RETURN NUMBER;
    PROCEDURE QUERY_DEPT(DEPT_NO IN NUMBER);
END DEMO_PACK;

--包定义:
CREATE OR REPLACE PACKAGE BODY DEMO_PACK IS
    FUNCTION ADD_DEPT(DEPT_NO NUMBER, DEPT_NAME VARCHAR2, LOCATION VARCHAR2) RETURN NUMBER IS
        EMPNO_REMAINING EXCEPTION;
        PRAGMA EXCEPTION_INIT(EMPNO_REMAINING, -1);
        /* -1 是违反唯一约束条件的错误代码 */
    BEGIN
        INSERT INTO DEPT VALUES (DEPT_NO, DEPT_NAME, LOCATION);
        IF SQL%FOUND THEN
            RETURN 1;
        END IF;
    EXCEPTION
        WHEN EMPNO_REMAINING THEN
            RETURN 0;
        WHEN OTHERS THEN
            RETURN - 1;
    END ADD_DEPT;
    
    FUNCTION REMOVE_DEPT(DEPT_NO NUMBER) RETURN NUMBER IS
    BEGIN
        DELETE FROM DEPT WHERE DEPTNO = DEPT_NO;
        IF SQL%FOUND THEN
            RETURN 1;
        ELSE
            RETURN 0;
        END IF;
    EXCEPTION
        WHEN OTHERS THEN
            RETURN - 1;
    END REMOVE_DEPT;

    PROCEDURE QUERY_DEPT(DEPT_NO IN NUMBER) IS
    BEGIN
        SELECT * INTO DEPTREC FROM DEPT WHERE DEPTNO = DEPT_NO;--传给了rowtype
    EXCEPTION
        WHEN NO_DATA_FOUND THEN
            DBMS_OUTPUT.PUT_LINE('数据库中没有编码为' || DEPT_NO || '的部门');
        WHEN TOO_MANY_ROWS THEN
            DBMS_OUTPUT.PUT_LINE('程序运行错误!请使用游标');
        WHEN OTHERS THEN
            DBMS_OUTPUT.PUT_LINE(SQLCODE || '----' || SQLERRM);
    END QUERY_DEPT;
END DEMO_PACK;

--包调用:
DECLARE
    v_var NUMBER; -- 部门编号
BEGIN
    v_var:=DEMO_PACK.REMOVE_DEPT(100);
    DBMS_OUTPUT.PUT_LINE('返回代码:' || v_var);
END;

DECLARE
    VAR NUMBER;
BEGIN
    VAR := DEMO_PACK.ADD_DEPT(90, 'Administration', 'Beijing');
    IF VAR = -1 THEN
        DBMS_OUTPUT.PUT_LINE(SQLCODE || '----' || SQLERRM);
    ELSIF VAR = 0 THEN
        DBMS_OUTPUT.PUT_LINE('该部门记录已经存在!');
    ELSE
        DBMS_OUTPUT.PUT_LINE('添加记录成功!');
        
        DEMO_PACK.QUERY_DEPT(90);
        
        DBMS_OUTPUT.PUT_LINE(DEMO_PACK.DEPTREC.DEPTNO || '---' ||
                             DEMO_PACK.DEPTREC.DNAME || '---' || DEMO_PACK.DEPTREC.LOC);
        VAR := DEMO_PACK.REMOVE_DEPT(90);
        IF VAR = -1 THEN
            DBMS_OUTPUT.PUT_LINE(SQLCODE || '----' || SQLERRM);
        ELSIF VAR = 0 THEN
            DBMS_OUTPUT.PUT_LINE('该部门记录不存在!');
        ELSE
            DBMS_OUTPUT.PUT_LINE('删除记录成功!');
        END IF;
    END IF;
END;

--5、异常示例:
DECLARE
    V_EMPNO EMP.EMPNO%TYPE := &EMPNO;
    NO_RESULT EXCEPTION;
BEGIN
    UPDATE EMP SET SAL = SAL + 100 WHERE EMPNO = V_EMPNO;
    IF SQL%NOTFOUND THEN
        RAISE NO_RESULT;--抛出异常;
    END IF;
EXCEPTION
    WHEN NO_RESULT THEN
        DBMS_OUTPUT.PUT_LINE('你的数据更新语句失败了!');
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE(SQLCODE || '---' || SQLERRM);
END;

DECLARE
    V_DEPTNO DEPT.DEPTNO%TYPE := &DEPTNO;--传入参数;
    
    --用户自定义的异常;
    DEPTNO_REMAINING EXCEPTION;
    PRAGMA EXCEPTION_INIT(DEPTNO_REMAINING, -2292);
    /* -2292 是违反一致性约束的错误代码 */
BEGIN
    DELETE FROM DEPT WHERE DEPTNO = V_DEPTNO;
EXCEPTION
    WHEN DEPTNO_REMAINING THEN
        DBMS_OUTPUT.PUT_LINE('违反数据完整性约束!');
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE(SQLCODE || '---' || SQLERRM);
END;

--6、序列的例子;
--创建序列
Create sequence seq_test
Increment by 1
Start with 1
Maxvalue 3
Minvalue 1
noCycle   
nocache ;

drop sequence seq_test;
 
alter sequence seq_test  nomaxvalue;

--序列的使用  nextval
SELECT SEQ_TEST.CURRVAL, SEQ_TEST.NEXTVAL FROM DUAL;

--7、if和else的例子:
DECLARE
    V_EMPNO   EMP.EMPNO%TYPE := &EMPNO;
    V_SALARY  EMP.SAL%TYPE;
    V_COMMENT VARCHAR2(35);
BEGIN
    SELECT SAL INTO V_SALARY FROM EMP WHERE EMPNO = V_EMPNO;
    IF V_SALARY < 1500 THEN
        V_COMMENT := 'FAIRLY LESS';
    ELSIF V_SALARY < 3000 THEN
        V_COMMENT := 'A LITTLE MORE';
    ELSE
        V_COMMENT := 'LOTS OF SALARY';
    END IF;
    DBMS_OUTPUT.PUT_LINE(V_COMMENT);
END;

--8、case when的例子:
select ename,sal,
   case
   when sal>5000 then 1
   when sal>1500 then 2
   else 3
   end "等级"  --注意:case when其别名在end后面并无as
   from emp;



你可能感兴趣的:(database)