PL/SQL中异常的处理
DECLARE
…;
BEGIN
…;
EXCEPTION
WHEN 异常情况1 [OR 异常情况2…] THEN
…;
WHEN异常情况3 [OR 异常情况4…] THEN
…;
WHEN OTHERS THEN
…;
END;
DECLARE
TMP_NAME VARCHAR(10);
BEGIN
SELECT ENAME INTO TMP_NAME FROM EMP;
DBMS_OUTPUT.PUT_LINE(TMP_NAME) ;
EXCEPTION
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('返回了太多行') ;
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('出现了其他异常') ;
END;
用户自定义异常处理
DECLARE
OUT_OF_STOCK EXCEPTION;
NUMBER_ON_HAND NUMBER;
BEGIN
…
IF NUMBER_ON_HAND < 1 THEN
RAISE OUT_OF_STOCK;
END IF;
…
EXCEPTION
WHEN OUT_OF_STOCK THEN
--HANDLE THE ERROR
END;
DECLARE
TMP_NAME VARCHAR(10);
MY_EXCEPTION EXCEPTION ;
BEGIN
SELECT ENAME INTO TMP_NAME FROM EMP WHERE EMPNO=7369;
DBMS_OUTPUT.PUT_LINE(TMP_NAME) ;
IF TMP_NAME <> 'LYF' THEN
RAISE MY_EXCEPTION ;
END IF ;
EXCEPTION
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('返回了太多行') ;
WHEN MY_EXCEPTION THEN
DBMS_OUTPUT.PUT_LINE('该用户不是lyf') ;
END;
变量类型的声明
DECLARE
MY_NAME VARCHAR(10);
TMP_NAME MY_NAME%TYPE;
--TMP_NAME EMP.ENAME%TYPE;
BEGIN
SELECT ENAME INTO TMP_NAME FROM EMP WHERE EMPNO=7369;
DBMS_OUTPUT.PUT_LINE(TMP_NAME) ;
END;
组合变量record:
-
record可以同时存储不同的数据类型,这有点像javabean
DECLARE type test_record is record( a number(2), b varchar2(10) ); firstRecord test_record; BEGIN firstRecord.a:=12; firstRecord.b:='lbx'; DBMS_OUTPUT.put_line (firstRecord.b); END;
组合变量%rowtype
DECLARE
v_emp emp%rowtype;
BEGIN
v_emp.empno:=1111;
v_emp.enam
DBMS_OUTPUT.put_line (v_emp.empno);
DBMS_OUTPUT.put_line (v_emp.ename);
DBMS_OUTPUT.put_line (v_emp.sal);
e:=’lbx’;
v_emp.sal:=10000;
END;
PL/SQL中的SQL语句:
n Select语句:
q 必须与into结合使用
q 只能返回一条记录,不能多,也不能少。
q 示例:
n select ename,sal into v_ename,v_sal from emp where empno = 7369;
n DML语句:
q 可以直接使用,与SQL中完全一样
q 如果想让DML语句起作用或者回退的话,需要显式的调用commit或者rollback
n DDL语句
q 需要使用execute immediate语句
q 示例:
n execute immediate ‘create table test (a varchar2(20), b number(3))’;
测试select语句: DECLARE v_ename emp.ename%type; v_sal emp.sal%type; BEGIN select ename,sal into v_ename,v_sal from emp where empno = 7369; DBMS_OUTPUT.put_line (v_ename); DBMS_OUTPUT.put_line (v_sal); END;
|
测试DML语句: DECLARE v_ename emp.ename%type; v_sal emp.sal%type; BEGIN insert into emp (empno,ename,sal) values ('1','aa','11'); DBMS_OUTPUT.put_line (v_ename); DBMS_OUTPUT.put_line (v_sal); -- commit; --rollback;
END;
select * from emp; rollback;
|
测试DDL语句: DECLARE
BEGIN execute immediate 'create table test2 (a varchar2(20), b number(3))'; END; |