您的位置:首页 > 数据库 > Oracle

Oracle BEGIN END 【整理】

2017-04-12 23:53 465 查看
ORACLE BEGIN END 关键字表示一个完整的块。

在任何一个ORACLE 的PL/SQL块中至少需要一个BEGIN..END来表示这是一个完整的块。这些PL/SQL块包括DECLARE开头的自定义虚拟块,存储过程,函数,包等.

begin ...end的意义可以理解为SQL语句执行的上下限,begin 是上限,SQL开始的地方,end是下限sql语句结束的地方.

另外,执行一个procedure 可以使用运行下面语句

begin

procedure_name();

end; 来执行。

BEGIN END 和EXECUTE区别

begin end;是匿名块 是在 PL-SQL环境中运行的,execute是命令 可以被外界调用。

execute 是调用oracle的系统包,过程或函数等,在执行时就是以begin..end开始和结束的。

Oracle的pl/sql块都至少有一个begin...end来表示完整块,在begin...end中可以自定义一些函数,存储过程和包等,

这些自定义码由begin开始执行,其所对应的end结束。

请看下面例子:

Oracle中执行一个dbms_job包,以下四个写法:

begin

dbms_job.run(44);

end; ----这样正常运行

dbms_job.run(44); ----这样会报错

begin

execute dbms_job.run(44);

end; ----这样会报错

execute dbms_job.run(44); ----这样正常运行

 

 

 PL/SQL 基本写法

-- 说明:声明、异常处理部分为可选,视具体程序而定

DECLARE -- 声明变量

  A INTEGER;-- 只声明

  B FLOAT := 0;-- 带赋值的声明

  C FLOAT;

BEGIN -- 可执行语句开始

  DBMS_OUTPUT.put_line('开始执行可执行语句块![http://www.linuxidc.com转载注明出处]');

  A := 1.5;

  DBMS_OUTPUT.put_line('A=' || A);

  DBMS_OUTPUT.put_line('B=' || B);

  C := A / B; -- 会引发分母为0的异常,下面的两条输出语句将无法执行

  DBMS_OUTPUT.put_line('C=' || C);

  DBMS_OUTPUT.put_line('可执行语句块执行完毕![http://www.linuxidc.com转载注明出处]');

EXCEPTION -- 异常处理

  WHEN OTHERS THEN

    DBMS_OUTPUT.put_line('[PL/SQL 基本写法]中出现异常,错误代码:ORA'||sqlcode);

END; -- 可执行语句结束

/ -- 该符号表示执行这段PL/SQL代码

执行后的输出:

开始执行可执行语句块![http://blog.csdn.net/ls_man转载注明出处]

A=2

B=0

[PL/SQL 基本写法]中出现异常,错误代码:ORA-1476

我们再看一下如何通过异常处理实现数据库事务:

-- PL/SQL 事务

-- 说明:有多条修改数据的语句执行,如果其中某条出错,之前的更改也不会记入数据库

-- 1.先创建一个测试表

DECLARE

  V_SQL_DROP_TABLE  VARCHAR2(50) := 'DROP TABLE MY_TEST';

  V_SQL_CREATE_TABLE VARCHAR2(100) := 'CREATE TABLE MY_TEST(NOT_NULL VARCHAR2(20) NOT NULL, ONLY_INT INTEGER)';

BEGIN

  EXECUTE IMMEDIATE V_SQL_CREATE_TABLE; -- 创建测试表

EXCEPTION

  -- 如果表已存在,则会引发异常

  WHEN OTHERS THEN

    EXECUTE IMMEDIATE V_SQL_DROP_TABLE; -- 先删除

    EXECUTE IMMEDIATE V_SQL_CREATE_TABLE; -- 再创建

END;

/

--2.用我们刚创建的测试表进行测试

DECLARE

  V_COUNT INTEGER; -- 表中记录的行数

  V_INT_VAL MY_TEST.ONLY_INT%TYPE; -- 使用%TYPE关键字参照某表某字段类型声明变量

BEGIN

  V_INT_VAL := 123456;

  -- 插入一条正确的数据

  INSERT INTO MY_TEST VALUES ('TEST_SUCCESS', V_INT_VAL);

  -- 查询条数为1条,我们发现插入成功了

  SELECT COUNT(*) INTO V_COUNT FROM MY_TEST;

  DBMS_OUTPUT.put_line('MY_TEST表中有' || V_COUNT || '条记录');

  -- 插入一条错误的数据,因为第二个字段为int型,插入字符数据肯定会出错

  INSERT INTO MY_TEST VALUES ('TEST_FAIL', 'ABC');

  -- 最后提交更改

  COMMIT;

EXCEPTION

  -- 异常处理

  WHEN OTHERS THEN

    ROLLBACK; -- 异常时回滚,这样第一次插入的正确数据也不会保存到数据库

    DBMS_OUTPUT.put_line('[PL/SQL 事务]中出现异常,错误代码:ORA' || sqlcode);

    -- 我们验证一下表里的数据为0条

    SELECT COUNT(*) INTO V_COUNT FROM MY_TEST;

    DBMS_OUTPUT.put_line('回滚后,MY_TEST表中有' || V_COUNT || '条记录');

END; -- 可执行语句结束

/ -- 该符号表示执行这段PL/SQL代码

执行后的输出:

MY_TEST表中有1条记录

[PL/SQL 事务]中出现异常,错误代码:ORA-1722

回滚后,MY_TEST表中有0条记录

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: