Operatori definiţi de utilizator
In blocurile PL/SQL şi în instrucţiunile SQL se pot folosi operatori implementaţi în cadrul sistemului Oracle.
Lista operatorilor care se pot utiliza în SQL este precizată în documentul
Operatori
Ca şi componente într-o bază de date se pot defini operatori utilizator, printr-o instrucţiune de forma următoare (simplificată):
CREATE [OR REPLACE] OPERATOR [schema.]denumire_operator
BINDING (lista_parametri) RETURN tip_valoare USING [schema.][pachet.]nume_functie
[,(lista_parametri) RETURN tip_valoare USING [schema.][pachet.]nume_functie ] ...
Un operator se implementează prin una sau mai multe funcţii memorate.
La utilizarea operatorului se va folosi o listă
de parametri (semnătura operatorului), care trebuie să coincidă cu lista argumentelor (ca număr, iar
tipurile de pe aceeaşi poziţie să fie compatibile) de la una din funcţiile utilizate pentru implementare.
Tipul de dată pentru valoarea operatorului se precizează prin clauza RETURN.
Modificarea definiţiei unui operator se poate face printr-o instrucţiune:
ALTER OPERATOR ...
iar pentru ştergerea unui operator se poate folosi:
DROP OPERATOR [schema.]operator
Un operator definit se poate folosi într-o instrucţiune SELECT pentru:
- precizarea expresiilor selectate
- în expresiile din clauza WHERE
- în clauza GROUP BY
- în clauza ORDER BY
Observaţii.
- Pentru gestiunea unui operator în schema proprie este necesar privilegiul
CREATE OPERATOR, iar pentru gestiunea unui operator în altă schemă sunt necesare privilegiile
CREATE ANY OPERATOR, DROP ANY OPERATOR, EXECUTE ANY OPERATOR (în funcţie de operaţia implicată de gestiune).
- Tipurile folosite pentru semnătura operatorului şi tipul rezultatului nu pot fi: REF, LONG, LONG RAW.
La un operator se poate adăuga un comentariu prin instrucţiunea:
COMMENT ON OPERATOR [schema.]operator IS 'sir de caractere'
Pentru a obţine informaţii despre operatorii din baza de date se pot folosi view-urile sistem:
{USER|ALL|DBA}_OPERATORS
{USER|ALL|DBA}_OPERATOR_COMMENTS
Exemple:
create table test(a varchar2(10), b varchar2(10));
insert into test values ('a','A');
insert into test values ('1','1');
insert into test values ('a','b');
select * from test where a=b;
Definim o funcţie:
CREATE OR REPLACE FUNCTION egalitate(s1 varchar2, s2 varchar2) return INTEGER AS
begin
if upper(s1)=upper(s2) then return 1; else return 0; end if;
end;
Folosirea funcţiei:
select * from test where egalitate(a,b)=1;
Definim un operator:
CREATE OR REPLACE OPERATOR egal BINDING(varchar2,varchar2) RETURN INTEGER USING egalitate;
Folosirea operatorului:
select * from test where egal(a,b)=1;
Referinţe: