【问题标题】:ORACLE: Parameter reference in WHERE doesn't workORACLE:WHERE 中的参数引用不起作用
【发布时间】:2011-02-23 09:48:35
【问题描述】:

我在 oracle 10g 中创建了一个简单的静态函数,用于根据他的 pk 获取对象的引用。

STATIC FUNCTION getRef(nome IN VARCHAR2) 
RETURN REF folder_typ IS

  fl_r REF folder_typ := null;

BEGIN

   SELECT REF(fl) 
     INTO fl_r
     FROM folder_tab fl
    WHERE fl.nome = nome;

   RETURN fl_r;

END getRef;

这给了我一个错误,因为它无法获取一行。 如果插入WHERE fl.nome = nome; 我写WHERE fl.nome = 'folder1'; - 它有效。

我认为我没有以正确的方式使用参数。 我该如何使用它?

【问题讨论】:

  • 我没有看到任何语法错误。 DESC FOLDER_TAB 的输出是什么?了解您遇到的错误也会有所帮助。

标签: sql oracle stored-procedures plsql oracle10g


【解决方案1】:

这是一个范围界定问题。

这是我根据您发布的内容推断的设置版本。注意参数名称与属性名称不同。

create or replace type folder_t as object
(name varchar2(128))
/

create table folders of folder_t
/

create or replace function getRef
    (nome in varchar2)
    return ref folder_t
is
    fl_r REF folder_t;
begin
    select ref(fl)
    into fl_r
    from folders fl
    where fl.name = nome;

    return fl_r;
end  getRef;
/

如您所见,鉴于此测试数据...

SQL> insert into folders values (folder_t('temp'))
  2  /

1 row created.

SQL> insert into folders values (folder_t('work'))
  2  /

1 row created.

SQL>

...我可以查询两个 REF:

SQL> select getRef('temp') from dual
  2  /

GETREF('TEMP')
--------------------------------------------------------------------------------
00002802091051432318864AF594741916D743E1291CF597373A4F4D7A93F159DA53A73FC0010372
2D0000


SQL> select getRef('work') from dual
  2  /

GETREF('WORK')
--------------------------------------------------------------------------------
0000280209F31778C18D5740FBA0CB90929E1B6FBD1CF597373A4F4D7A93F159DA53A73FC0010372
2D0001


SQL>

但是,如果我更改函数声明,使参数名称与属性名称相同,则会发生这种情况:

SQL> create or replace function getRef
  2      (name in varchar2)
  3      return ref folder_t
  4  is
  5      fl_r REF folder_t;
  6  begin
  7      select ref(fl)
  8      into fl_r
  9      from folders fl
 10      where fl.name = name;
 11
 12      return fl_r;
 13  end  getRef;
 14  /

Function created.

SQL> select getRef('temp') from dual
  2  /

GETREF('TEMP')
------------------------------------------------------------


SQL>

SQL 引擎从表向外应用范围。因为不合格的NAME 匹配表上的列,所以它不会检查是否也有该名称的参数。这就是为什么给参数一个不同的名称是个好主意。个人而言,我赞成在参数前加上 P_ 的做法,因此参数不会与局部变量或对象名称发生冲突。

【讨论】:

  • 因为您将文件夹属性命名为“name”而不是“nome”。我解决了用不同的名称调用参数。所以现在看起来像哪里 fl.nome = nome2;还是谢谢你。
【解决方案2】:

最佳实践是始终为所有变量提供范围,而不仅仅是来自表别名的变量:

FUNCTION getRef(nome IN VARCHAR2) 
RETURN REF folder_typ IS
  fl_r REF folder_typ := null;
BEGIN

   SELECT REF(fl) 
     INTO fl_r
     FROM folder_tab fl
    WHERE fl.nome = getRef.nome;

   RETURN fl_r;
END getRef;

【讨论】:

    猜你喜欢
    • 2015-11-02
    • 2022-06-10
    • 1970-01-01
    • 2020-03-07
    • 2023-01-29
    • 1970-01-01
    • 1970-01-01
    • 2017-03-08
    • 2013-12-19
    相关资源
    最近更新 更多