【问题标题】:Function name out of scope in SQLSQL中的函数名超出范围
【发布时间】:2018-01-14 19:57:16
【问题描述】:

我正在尝试创建一个抽象层来模仿 Oracle 11g 中的 DB2 功能。目标是让当前正在运行 DB2 查询的客户重新指向 Oracle 抽象层,而无需更改其语法。

我在 ABC 架构下创建了以下函数:

create or replace function ABC.timestamp(p_date in date) return date is
begin
  return p_date;
end;

当我尝试在 SQL 语句中使用它时,我得到一个错误:

select timestamp(current_date) from dual;

ORS-06553: PLS-222: no function with name 'TIMESTAMP' exists in this scope

如果我明确地调用架构,它会起作用:

select ABC.timestamp(current_date) from dual;

我还有一个登录触发器,它将会话的 current_schema 显式设置为 ABC。我能看到的唯一复杂之处是 TIMESTAMP 是 Oracle 中的一个关键字,但它允许我使用该名称创建这个函数。

有什么方法可以让它工作吗?

【问题讨论】:

  • TIMESTAMP 是保留字。此外,您的选择是否从 ABC 模式运行?如果没有,那么您需要包括赠款。
  • 是的,它从 ABC 运行。它在编译期间没有抱怨保留字似乎很奇怪。
  • 注意,与 DB2 不同,Oracle DATE 数据类型始终具有时间组件。因此,无论如何,您的功能可能毫无用处。我假设函数应该是return TRUNC(p_date); - 但是你为什么要为这样的基本操作编写一个专用函数?
  • 目标是让当前正在运行 DB2 查询的客户无需更改其语法即可重新指向 Oracle 抽象层。
  • 这个目标是无法实现的。两种数据库风格之间存在各种细微差别。即使没有,您也可能希望重写一些 SQL 以利用 Oracle 的专有优化策略。

标签: oracle oracle11g


【解决方案1】:

我认为您不能“按原样”解决它。但是,如果您在函数名称周围使用双引号(这是某些人所做的又一个 愚蠢 的事情 - 看看我,我现在就这样做),它会在没有所有者姓名的情况下工作:

SQL> create or replace function "timestamp" (p_date in date) return date is
  2  begin
  3    return p_date;
  4  end;
  5  /

Function created.

SQL> select "timestamp"(current_Date) from dual;

"TIMESTA
--------
11.01.18

SQL>

但是,这意味着您在引用该函数时总是必须使用双引号。

如果我是你,我会更改函数名称。如您所见,您可以做某事的事实并不意味着您应该去做。

【讨论】:

  • 您是否在此处使用 SQL*Plus 执行该操作?我有点惊讶结果有列名"TIMESTA。我似乎在大写之后记得它(无法访问数据库 atm)。最后一段我完全同意!
  • 是的,@Ben,它是从我的 SQLPlus 会话中复制/粘贴的。当没有别名时,它返回查询返回的列名的前“n”个字符。在这种情况下,这些是双引号,后跟 TIMESTA,因为 NLS 设置表明结果是 DD.MM.YY。当我将其修改为 DD.MM.YYYY 时,结果的“列名”为“TIMESTAMP(不带右双引号)。
  • 我可以重现您的结果,但不幸的是,出于我的要求,我无法更改该名称,因为传入的查询是为 DB2 编写的,并且希望 timestamp 是一个有效的函数。
  • 好的;那么,你会怎么做呢?
  • 您在 DB2 @Paul 中使用的是 SQL PL 还是 PL/SQL?如果您使用 SQL PL,那么您的触发器代码无论如何都会略有不同,因此您最好在此实例中更改函数的名称(或者如果这是您的函数实际上正在执行的操作,则将其完全删除并使用 cast() 代替,如果真的很需要)。如果您使用的是 PL/SQL,那么 DB2 是否没有实现任何 Oracle 语法使您能够反转您正在模仿的语法?
猜你喜欢
  • 1970-01-01
  • 2010-11-22
  • 1970-01-01
  • 2012-12-16
  • 1970-01-01
  • 2018-07-18
  • 1970-01-01
  • 2018-03-30
  • 2021-11-29
相关资源
最近更新 更多