【发布时间】: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 的专有优化策略。