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