江西广告网

标题: PL/SQL命名作用域的窍门 [打印本页]

作者: 纸老虎    时间: 2009-1-23 11:52
标题: PL/SQL命名作用域的窍门
  很多PL/SQL程序员采用一个命名约定区分不同作用域内的变量,从而确定一个值来自哪个作用域。一个常用的方法是给参数加前缀p_,给局部变量加前缀l_,给全局变量或者包变量加前缀g_。例如:      create or replace function myfunc(p_empno integer) return varchar2   is     l_ename emp.ename%type;   begin     select ename into l_ename      from emp      where empno = p_empno;     return l_ename;   end myfunc;   /   show errors;      PL/SQL有一个有趣的命名作用域系统,在这个系统中你可以在一个函数域内通过指定函数或者过程的名字来来访问在函数或者过程中出现的变量。这样上面的代码就可以改写为:      create or replace function myfunc(empno integer) return varchar2   is     ename emp.ename%type;   begin     select ename into myfunc.ename      from emp      where empno = myfunc.empno;     return myfunc.ename;   end myfunc;   /   show errors;            我知道最少有一个专业组织已经在第二个方法中为其命名约定制定了标准。      这个作用域系统实际上带来了一个奇怪的问题:它意味着如果包名和过程或者函数名一样的话,那么就不可能在这个包内调用与其同名的过程或者函数。      create or replace package p1   as     function test return varchar2;   end p1;   /   show errors;      create or replace package body p1   as     function test return varchar2     as     begin       return 'hello world';     end test;   end p1;   /   show errors;           create or replace package p2   as     function p1 return varchar2;   end p2;   /   show errors;      create or replace package body p2   as     function p1 return varchar2     as       return p1.test;     end p1;   end p2;   /   show errors;      Warning: Package Body created with compilation errors.      Errors for PACKAGE BODY P2:      LINE/COL  ERROR      --------      ----------------------------------   6/3        PL/SQL: Statement ignored   6/13       PLS-00302: component 'TEST' must be declared      自己测试一下这些PL/SQL命名作用域系统的窍门,看看你有什么想法。 <




欢迎光临 江西广告网 (http://bbs.jxadw.com/) Powered by Discuz! X3.2