Как использовать переменную в предложении LIKE в PL / SQL - PullRequest
0 голосов
/ 07 февраля 2020

Я новичок в 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 что возвращает несколько строк? Я надеюсь, что мне не нужно использовать курсоры et c для такого простого утверждения, как предложено в этого вопроса

Ответы [ 2 ]

2 голосов
/ 07 февраля 2020

Ну да, эти "переводчики" не всегда делают то, что должны.

Вот как должен выглядеть ваш код:

  • use 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 (и да, это так), то одна опция l oop через строки и сделать что-то (например, отобразить эти значения):

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

Поскольку это тег SQL Developer, используйте переменную связывания:

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

и SQL developer откроет диалоговое окно, в котором вы можете установить значение переменной ObjToSearch.

Если вы хотите указать переменную связывания в коде, то:

VARIABLE objtosearch VARCHAR2(50)

BEGIN
  :objtosearch := '%aldbrough%';
END;
/

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

И запустите операторы как скрипт, используя F5 , а не как отдельные операторы.

...