CONTAINS
- это Oracle Текст. Смотрите этот пример:
SQL> create table test as select * From emp;
Table created.
SQL> select deptno, empno, ename, job, sal from test
2 where contains(ename, 'king') > 0;
select deptno, empno, ename, job, sal from test
*
ERROR at line 1:
ORA-20000: Oracle Text error:
DRG-10599: column is not indexed
SQL>
Справа; Oracle Текст - столбец должен быть проиндексирован, но не по какому-либо типу индекса:
SQL> create index i1 on test(ename) indextype is ctxsys.context;
Index created.
SQL> select deptno, empno, ename, job, sal from test
2 where contains(ename, 'king') > 0;
DEPTNO EMPNO ENAME JOB SAL
---------- ---------- ---------- --------- ----------
10 7839 KING PRESIDENT 5000
SQL>
ОК, предварительные условия теперь выполнены.
Если вы хотите переместить такой запрос в PL / SQL (которая является хранимой процедурой), она требует, чтобы вы извлекали данные в что-то - переменную. Объявите это и используйте в выражении select
:
SQL> create or replace procedure p_test (par_ename in test.ename%type) is
2 l_job test.job%type; --> declared is here
3 begin
4 select job
5 into l_job --> used is here
6 from test
7 where contains(ename, par_ename) > 0;
8 dbms_output.put_line(par_ename || ' works as ' || l_job);
9 end;
10 /
Procedure created.
SQL> set serveroutput on
SQL> begin
2 p_test('king');
3 end;
4 /
king works as PRESIDENT
PL/SQL procedure successfully completed.
SQL>
В зависимости от того, что вы действительно делаете, это может потребоваться исправить, поскольку существует опасность различных ошибок (таких как TOO_MANY_ROWS
возвращено по запросу и т. д. c.).
Если вы на самом деле не хотите использовать Oracle Текст, посмотрите другие варианты: instr
и like
:
SQL> select deptno, empno, ename, job, sal from test
2 where instr(ename, 'KING') > 0;
DEPTNO EMPNO ENAME JOB SAL
---------- ---------- ---------- --------- ----------
10 7839 KING PRESIDENT 5000
SQL> select deptno, empno, ename, job, sal from test
2 where ename like '%KING%';
DEPTNO EMPNO ENAME JOB SAL
---------- ---------- ---------- --------- ----------
10 7839 KING PRESIDENT 5000
SQL>