函数名称超出SQL范围

时间:2018-01-11 21:03:29

标签: oracle oracle11g

我正在尝试创建一个抽象层来模仿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中的一个关键字,但它允许我用该名称创建这个函数。

有什么方法可以让它发挥作用吗?

1 个答案:

答案 0 :(得分:1)

我不认为你可以解决问题"按照"。但是,如果你在函数名称周围使用双引号(这是某些人做的另一个愚蠢的事情 - 而且,看看我,我现在就做),它会工作没有所有者的名字:

columns = ['a', 'x', 'b', 'y']
df = pd.read_csv('file.csv', usecols=columns)

但是,这意味着在引用该功能时,您始终必须使用双引号。

如果我是你,我会更改功能名称。正如您所看到的,您可以做某事的事实并不意味着您应该这样做。