ITPub博客

首页 > Linux操作系统 > Linux操作系统 > PL/SQL中变量与Table字段名的区分(转)

PL/SQL中变量与Table字段名的区分(转)

原创 Linux操作系统 作者:zuibunan 时间:2009-10-12 10:06:29 0 删除 编辑

可以通过加上前缀的方法。

SQL> create or replace function f_test1 (id in number) return number as
  2  v_result number;
  3  begin
  4  select count(*) into v_result from test where id = id;
  5  return v_result;
  6  end;
  7  /

函数已创建。

SQL>
SQL> create or replace function f_test2 (id in number) return number as
  2  v_result number;
  3  begin
  4  select count(*) into v_result from test where id = f_test2.id;
  5  return v_result;
  6  end;
  7  /

函数已创建。

SQL>
SQL> desc test
名称                                      是否为空? 类型
----------------------------------------- -------- ----------------------------
ID                                                 NUMBER(3)

SQL> select * from test;

        ID
----------
         1
         2

SQL> select f_test1(1), f_test2(1) from dual;

F_TEST1(1) F_TEST2(1)
---------- ----------
         2          1

匿名块可以这样
SQL> <>
  2  declare
  3  id number default 1;
  4  result number;
  5  begin
  6  select count(1) into result from test where id = block.id;
  7  dbms_output.put_line(result);
  8  end;
  9  /
1

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/3PL/SQL: Statement ignored

  6/13PLS-00302: component 'TEST' must be declared

  自己测试一下这些PL/SQL命名作用域系统的窍门,看看你有什么想法。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/15725751/viewspace-616292/,如需转载,请注明出处,否则将追究法律责任。

下一篇: PL/SQL命名(转)
请登录后发表评论 登录
全部评论

注册时间:2009-09-15

  • 博文量
    39
  • 访问量
    92491