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

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

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/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/15725751/viewspace-616292/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值