06-10
26
PL/SQL 中的EXECUTE IMMEDIATE
作者:Java伴侣 日期:2006-10-26
一个程序,无论是用何种语言写的,实现它的松耦合都是有必要的。松耦合的体现大到MVC模式,小到成员变量的组合。耦合性越小,代码的可重用、可维护性就越高。
这里说说我最近刚接触到的PL/SQL语言中的EXECUTE IMMEDIATE,它的意思是“立即运行”,所实现的功能正如其意。为了更好的理解它的用法,例如:
DECLARE
STR VARCHAR2(8000);
BEGIN
STR:='select ename from emp where empno=7788';
EXECUTE IMMEDIATE STR into v_ename;
DBMS_OUTPUT.PUT_LINE(V_NAME);
end;
/
这段代码实现的功能是等同于一条SQL语句
SQL<select ename from emp where empno=7788;
乍一看后者可实现的功能和前者一样,且有简便很多。而真正的情况却是,在实际的项目运作中,用EXECUTE IMMEDIATE来处理SQL语句占到了整个项目的70%~80%以上。
原因如下:
首先,如果在一个项目里直接使用DML语句(如inster、update、delete)来处理数据。那么一旦表或数据位置更换,代码就会出错。要修改的地方会很杂。而使用EXECUTE IMMEDIATE的好处是把SQL语句转换成字符串的形式。字符串中是可以插入变量的,好处不言而喻。
其次,消除隐患,如无表操作。正常情况下,用SQL<Create TABLE EMP...时候,ORACALE会先去验证时候有这个表,如果没有将报错。而时候EXECUTE IMMEDIATE,才用处理字符串的方式,无需担心这样的问题。
再来在真正的项目中,对于变量的使用次数也是很高的。比如客户要看一月、二月、三月……的数据,如果但用SQL语句去写,耦合性太强。这就是为什么推荐用EXECUTE IMMEDIATE来处理数据的原因。
PS:使用EXECUTE IMMEDIATE值得注意的两点,一来在用DDL语句(如select)时,无法直接运行,需要先into到一个变量里。再来,如上面例子中的str应该设置成多大为好,推荐设置成varchar2(8000),以免程序报错。
这里说说我最近刚接触到的PL/SQL语言中的EXECUTE IMMEDIATE,它的意思是“立即运行”,所实现的功能正如其意。为了更好的理解它的用法,例如:
DECLARE
STR VARCHAR2(8000);
BEGIN
STR:='select ename from emp where empno=7788';
EXECUTE IMMEDIATE STR into v_ename;
DBMS_OUTPUT.PUT_LINE(V_NAME);
end;
/
这段代码实现的功能是等同于一条SQL语句
SQL<select ename from emp where empno=7788;
乍一看后者可实现的功能和前者一样,且有简便很多。而真正的情况却是,在实际的项目运作中,用EXECUTE IMMEDIATE来处理SQL语句占到了整个项目的70%~80%以上。
原因如下:
首先,如果在一个项目里直接使用DML语句(如inster、update、delete)来处理数据。那么一旦表或数据位置更换,代码就会出错。要修改的地方会很杂。而使用EXECUTE IMMEDIATE的好处是把SQL语句转换成字符串的形式。字符串中是可以插入变量的,好处不言而喻。
其次,消除隐患,如无表操作。正常情况下,用SQL<Create TABLE EMP...时候,ORACALE会先去验证时候有这个表,如果没有将报错。而时候EXECUTE IMMEDIATE,才用处理字符串的方式,无需担心这样的问题。
再来在真正的项目中,对于变量的使用次数也是很高的。比如客户要看一月、二月、三月……的数据,如果但用SQL语句去写,耦合性太强。这就是为什么推荐用EXECUTE IMMEDIATE来处理数据的原因。
PS:使用EXECUTE IMMEDIATE值得注意的两点,一来在用DDL语句(如select)时,无法直接运行,需要先into到一个变量里。再来,如上面例子中的str应该设置成多大为好,推荐设置成varchar2(8000),以免程序报错。
评论: 0 | 引用: 0 | 查看次数: 997
发表评论