日期:2014-05-16  浏览次数:20365 次

变量默认值和EXECUTE IMMEDIATE以及goto关键字

?

1、设置变量默认值

直接在参数类型后加:=defaultvalue

例子:

?

V_FUNCNAME                   VARCHAR2(20) := 'IFELSE';

2、EXECUTE IMMEDIATE 代替了以前Oracle8i中DBMS_SQL package包.

?

它解析并马上执行动态的SQL语句或非运行时创建的PL/SQL块.动态创建和执行SQL语句性能超前,EXECUTE IMMEDIATE的目标在于减小企业费用并获得较高的性能,较之以前它相当容易编码.尽管DBMS_SQL仍然可用,但是推荐使用EXECUTE IMMEDIATE,因为它获的收益在包之上。?

?

EXECUTE IMMEDIATE 'select ' || V_JSGS_BTXM_CONTENT_VALUE || ' from dual' INTO RESULT;

规则1:EXECUTE IMMEDIATE将不会提交一个DML事务执行,应该显式提交。

规则2:如果通过EXECUTE IMMEDIATE处理DML命令,那么在完成以前需要显式提交或者作为EXECUTE IMMEDIATE自己的一部分. 如果通过EXECUTE IMMEDIATE处理DDL命令,它提交所有以前改变的数据。

 declare
  l_depnam varchar2(20) := 'testing';
  l_loc    varchar2(10) := 'Dubai';
  begin
  execute immediate 'insert into dept values  (:1, :2, :3)'
    using 50, l_depnam, l_loc;
  commit;
 end;

?当执行SQL语句时,不要用分号,当执行PL/SQL块时,在其尾部用分号

?

3、goto关键字:

PL/SQL对于GOTO的使用有一些限制.对于块,循环或者IF语句而言,想要从外层跳转到内层是非法的.

使用GOTO语句从一个IF子句跳转到另一个子句中也是非法的.

最后,从一个异常处理块内部跳转到当前块是非法的.

/*
goto label_name;
只能由内部的语句块跳往外部块 
设置标签
<<label_name>>
可以为循环设置标签
*/
declare
id number:=1;
begin
loop 
dbms_output.put_line('循环次数--'||id);
id :=id+1;
if id=10 then 
goto a;
end if;
end loop;
<<a>>
dbms_output.put_line('跳出循环');
end;
/
?注意,goto语句不能在异常处理中跳转!

?