使用左/右侧创建用户定义的运算符

时间:2013-11-22 08:32:41

标签: sql oracle plsql operators

我开始使用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

2 个答案:

答案 0 :(得分:4)

摘自您对@ ajmalmhd04 answer

的评论
  

我真的想使用我的运算符,如内置(=,+ ...)

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

  

用户定义的运算符的作用类似于内置运算符,例如<,>和=;

不幸的是,这意味着您可以使用用户定义的运算符(大多数情况下)您可以使用内置运算符但不能以相同的方式(例如operand1 OPERATOR operand2)使用内置运算符,例如{ {1}}或<。用户定义的运算符,如果不仔细查看它们,则是调用函数的不同方式,除了它们(运算符)只能在DML语句中使用(=select等等)。您将无法直接在PL / SQL中使用它们,只能通过DML。 因此,在PL / SQL中,这样的结果将导致insert

PLS-00548: invalid use of operator.

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

答案 1 :(得分:1)

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