SQL содержит проблему в хранимых процедурах - PullRequest
0 голосов
/ 17 апреля 2020

Испытание глагола содержимого на создаваемой мной БД, и я хочу знать проблему с этим синтаксисом

create or replace PROCEDURE past_event_check
as
BEGIN
SELECT  event_description from past_events
where Contains (event_description, 'Club');

END;

В нем говорится, что компиляция не удалась, строка 5 (04:29:41) PL / SQL: ORA-00920: неверный реляционный оператор. Компиляция не выполнена, строка 4 (04:29:41)

Ответы [ 2 ]

0 голосов
/ 17 апреля 2020

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>
0 голосов
/ 17 апреля 2020

Вы должны использовать, как показано ниже

    create or replace PROCEDURE past_event_check
    as
     l_event_desc past_events.event_description%TYPE;
     BEGIN
     SELECT  event_description into l_event_desc from past_events
    where Contains (event_description, 'Club',1) > 0;
     dbms_output.put_line(l_event_desc);
    END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...