Oracle 用于在表列中搜索关键字的sql存储过程

Oracle 用于在表列中搜索关键字的sql存储过程,oracle,stored-procedures,plsql,Oracle,Stored Procedures,Plsql,我有一张名为推荐表的桌子。我需要存储一个数据库过程,在“contents”列中搜索关键字并显示匹配的行。我正在使用sql plus CREATE OR REPLACE PROCEDURE Search_Testimonials (@WRDSRCH VARCHAR2) AS BEGIN SELECT * FROM Testimonials where content like concat('%',WRDSRCH,'%'); END; / 我不断得到警告:

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

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

我不断得到警告:编译错误创建的过程

您的代码中有几个错误(如果不进行修改,就无法使用TSQL代码):

  • 参数名在Oracle中不使用@(如@a_horse_和\u no_name所述)
  • 你需要一些东西来存储结果(同样,正如@a_horse_和_no_name提到的)
  • 不能使用3个参数调用CONCAT;要连接字符串,可以使用
    | |
    运算符
Oracle的一个可能实现(使用ref游标搜索结果)是

用法(来自SQL/Plus):


正如带有“无”名称的@a_horse_所述,在使用变量时不使用“@”。 此外,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或SQLDeveloper运行,请使用以下命令执行

var rc refcursor
exec Search_Testimonials ('A',:rc);
print rc;

根据我个人的观点,一个没有名字的“马”所建议的更改是我们从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;

结果将只包含一个单元格,表示
(光标)
,但双击该单元格将显示整个结果集。

参数在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;
/
SELECT Search_Testimonials ('some_text')
  FROM dual;