SQL 包含存储过程中的问题

Posted

技术标签:

【中文标题】SQL 包含存储过程中的问题【英文标题】:SQL contains issue in stored procedures 【发布时间】:2020-04-17 04:38:21 【问题描述】:

在我正在制作的数据库上尝试包含动词,我想知道这个语法的问题

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)

【问题讨论】:

【参考方案1】:

你应该像下面这样使用

    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;

【讨论】:

【参考方案2】:

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 Text - 列必须被索引,但不是任何索引类型:

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 等)。


如果您实际上不想使用 Oracle Text,请查看其他选项:instrlike

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>

【讨论】:

非常感谢!这真的帮助我更多地理解它

以上是关于SQL 包含存储过程中的问题的主要内容,如果未能解决你的问题,请参考以下文章

sql存储过程有什么用

如何循环遍历 sql 语句中的存储过程

Transact-SQL中的存储过程

如何从 Access 2010 中的 SQL 存储过程返回多个记录集

将 List<> 传递给 SQL 存储过程

SQL 存储过程中的“引用旧”和“引用新”有啥区别?