【问题标题】:Create user defined operator with left/right sides创建具有左侧/右侧的用户定义运算符
【发布时间】:2013-12-07 01:32:48
【问题描述】:

我开始使用 pl/sql 开发一个 Oracle 运算符。指南中有一些示例,但现在我坚持一些。

在我见过的所有例子中,都是这样的:

CREATE OPERATOR Contains 
   BINDING (VARCHAR2, VARCHAR2) 
    RETURN NUMBER 
     USING text.contains;

我们在WHERE 子句中这样使用它:

SELECT * 
  FROM MyEmployees 
 WHERE Contains(resume, 'Oracle') = 1;

是否可以创建一个操作符,像=, +, ...一样使用,有左有右?

在这种情况下像:

SELECT * 
  FROM MyEmployees 
 WHERE resume Contains 'Oracle'

感谢您的帮助。

编辑: 我知道 PostgreSQL 可以,但没有找到 Oracle
http://www.postgresql.org/docs/current/static/sql-createoperator.html

【问题讨论】:

  • 这通常被称为中缀运算符。我对Oracle不熟悉,所以无法给出答案;但是我遇到的大多数语言都不允许您定义 new 中缀运算符(通常它们必须由解析器仔细处理)。
  • @Damien_The_Unbeliever:Postgres 允许这样做;)(我认为 C++ 也是如此)

标签: sql oracle plsql operators


【解决方案1】:

摘自您对@ajmalmhd04 answer的评论

我真的很想使用我的操作符,比如内置的 (=, + ...)

是的,documentation 定义用户自定义运算符的方式有点混乱,尤其是这部分:

用户自定义操作符的作用类似于内置操作符,例如和=;

不幸的是,这意味着您可以使用用户定义的运算符,其中(大部分)您可以使用内置运算符,但不能以相同的方式(例如operand1 OPERATOR operand2)使用内置运算符,例如<=。用户定义的操作符,如果不仔细研究的话,是调用函数的不同方式,除了它们(操作符)只能在 DML 语句中使用(selectinsert 等等)。您不能直接在 PL/SQL 中使用它们,只能通过 DML。 所以,像这样的东西,在 PL/SQL 中会导致 PLS-00548: invalid use of operator.

if operator(<<arguments>>) = 1 then
  -- something
end if;

创建和使用运算符的好处,如果您不参与开发特定于应用程序的基于服务器的扩展(数据盒),例如索引类型,我个人看不到。想不到可以用运算符,不能用函数的情况。然而,事实并非如此。您可以将运算符具有多个绑定的能力视为将其用作重载函数的一种方式。但是,另一方面,您可以通过包轻松实现相同的目标。

【讨论】:

    【解决方案2】:

    1)创建TYPE:

    CREATE OR REPLACE  TYPE number_type IS TABLE OF NUMBER;
    

    2) 创建函数:

    CREATE OR REPLACE FUNCTION near_to_num_f(A number) RETURN number_type AS
    l_num number_type;
    BEGIN
    SELECT num
    BULK COLLECT INTO l_num
    FROM tab1 WHERE num + 15 >= a AND num -15 <= a;
    RETURN l_num;
    END;
    

    3) 创建操作符:

    CREATE OR REPLACE OPERATOR near_to
       BINDING (number) 
       RETURN number_type
       USING near_to_num_f; 
    

    4) 创建示例表并插入一些数据:

     CREATE TABLE tab1 (num NUMBER);
    INSERT INTO tab1 VALUES( 90);
    INSERT INTO tab1 VALUES( 95);
    insert into tab1 values( 120);
    

    5) 查询使用:

    SELECT * 
    FROM tab1 
    WHERE  num IN(select * from TABLE(near_to(100)));
    

    6) 输出:

     NUM
    ----------
      90 
      95 
    

    Read More

    【讨论】:

    • 感谢您的帮助,但问题是一样的,我真的很想使用我的操作符,比如内置的 (=, + ...)。一个 arg 左侧(列)和右侧的值。
    • 如果你想用作内置......我不确定是否可能,但你可以尝试一个包装器来克服打字大括号
    猜你喜欢
    • 2023-03-07
    • 2016-06-08
    • 2023-04-10
    • 2013-11-22
    • 2018-10-04
    • 2017-03-04
    • 2021-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多