0

我有一张叫做推荐的桌子。我需要存储一个在“内容”列中搜索关键字并显示匹配行的数据库过程。我使用 sql plus。

  CREATE OR REPLACE PROCEDURE Search_Testimonials
  (@WRDSRCH VARCHAR2)
  AS
  BEGIN
    SELECT * FROM Testimonials
    where content like concat('%',WRDSRCH,'%');
  END;
  /

我不断收到警告:过程创建时出现编译错误。

4

3 回答 3

0

根据我的个人观点,a_horse_with_no_name 建议的更改是我们从 SQL Server 迁移到 Oracle 时必须对代码进行的两个最大更改。

我建议您创建一个函数,而不是一个过程,如下所示:

CREATE OR REPLACE FUNCTION Search_Testimonials
(WRDSRCH VARCHAR2)
RETURN sys_refcursor
IS
    ret_cur sys_refcursor;
BEGIN
    OPEN ret_cur FOR
    SELECT *
      FROM Testimonials
     WHERE content like '%'||WRDSRCH||'%';

    RETURN ret_cur;
END;
/

使用此类函数的优点是您可以简单地运行如下查询并在 Toad 或 SQL Developer 中获取结果:

SELECT Search_Testimonials ('some_text')
  FROM dual;

结果将只包含一个单元格,(CURSOR)但双击该单元格将为您提供整个结果集。

于 2013-11-11T12:44:24.720 回答
0

您的代码中有几个错误(如果不调整就不能使用 TSQL 代码):

  • 参数名称在 Oracle 中不使用 @(如 @a_horse_with_no_name 所述)
  • 你需要一些东西来存储结果(同样,正如@a_horse_with_no_name 所提到的)
  • 你不能用 3 个参数调用 CONCAT;要连接字符串,您可以使用||运算符

Oracle 的一个可能实现(对搜索结果使用 ref 游标)将是

CREATE TABLE testimonials
(pk NUMBER NOT NULL PRIMARY KEY, 
 content VARCHAR2(100));

CREATE OR REPLACE PROCEDURE Search_Testimonials(WRDSRCH VARCHAR2,
                                                v_cur   IN OUT sys_refcursor) AS
BEGIN
  OPEN v_cur FOR
    SELECT *
      FROM Testimonials
     WHERE content LIKE '%' || WRDSRCH || '%';
END;

用法(来自 SQL/Plus):

var x refcursor;
begin 
  search_testimonials('hello', :x); 
end;
/
print x;
于 2013-11-11T11:30:53.727 回答
0

正如@a_horse_with_no_name 所述,使用变量时不使用“@”。concat 函数也不适合您的情况。您的程序的更正版本是

create or replace
PROCEDURE Search_Testimonials (WRDSRCH in VARCHAR2,o_cursor out sys_refcursor)
  is
  BEGIN
   OPEN o_cursor FOR 
    SELECT * FROM Testimonials
   where content LIKE '%' || WRDSRCH || '%';
  END;

如果您从 sqlplus 或 sql developer 运行,请使用以下命令执行。

var rc refcursor
exec Search_Testimonials ('A',:rc);
print rc;
于 2013-11-11T11:36:39.923 回答