温馨提示:本文翻译自stackoverflow.com,查看原文请点击:oracle - How to use a variable in a LIKE clause in PL/SQL
oracle oracle-sqldeveloper

oracle - 如何在PL / SQL的LIKE子句中使用变量

发布于 2020-04-24 17:41:36

我是Oracle的新手,正在学习;我只是想运行此T-SQL查询

DECLARE @SearchObj varchar(100);
SET @SearchObj='%aldbrough%';

SELECT
      obj_id,
      name,
      description
   FROM
      agnis.t_object
   WHERE
      lower(name) = ObjToSearch ;

我正在使用SQL Developer Oracle工具,该工具还具有“临时编辑器”以帮助从T-SQL进行翻译。当我运行该工具时,它给了我这段代码

     DECLARE
   v_SearchObj VARCHAR2(100);

    BEGIN
       v_SearchObj := '%aldbrough%' ;
       SELECT obj_id ,
              NAME ,
              DESCRIPTION 
         FROM agnis.t_object 
        WHERE  LOWER(NAME) = ObjToSearch;

    END;

但是相同的工具给我这个错误

    Error report -
ORA-06550: line 10, column 26:
PL/SQL: ORA-00904: "OBJTOSEARCH": invalid identifier
ORA-06550: line 6, column 4:
PL/SQL: SQL Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.

那么在返回多个行的LIKE子句中使用变量的正确语法是什么?我希望我不必在此问题中建议的简单语句中使用游标等

查看更多

提问者
brillox
被浏览
29
Littlefoot 2020-02-07 20:56

好吧,是的-这些“翻译”并不总是按照他们的预期去做。

这是您的代码应如下所示:

  • 使用like,没有=了在where
  • 在PL / SQL中,您必须将select语句的结果放into一些东西-例如,本地声明的变量(如我的示例所示)。

所以:

DECLARE
   v_SearchObj    VARCHAR2 (100) := '%aldbrough%';
   --
   v_obj_id       t_object.obj_id%TYPE;
   v_name         t_object.name%TYPE;
   v_description  t_object.description%TYPE;
BEGIN
   SELECT obj_id, NAME, DESCRIPTION
     INTO v_obj_id, v_name, v_description
     FROM agnis.t_object
    WHERE LOWER (NAME) LIKE v_searchobj;
END;

如果这样的代码返回一个错误- too_many_rows是的,它),那么一种选择是循环通过行和做一些事情(如显示这些值):

DECLARE
   v_SearchObj  VARCHAR2 (100) := '%aldbrough%';
BEGIN
   FOR cur_r IN (SELECT obj_id, NAME, DESCRIPTION
                   FROM agnis.t_object
                  WHERE LOWER (NAME) LIKE v_searchobj)
   LOOP
      DBMS_OUTPUT.put_line (
         'Name = ' || cur_r.name || ', description = ' || cur_r.description);
   END LOOP;
END;