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



我是甲骨文和学习的新手;我只是在尝试运行此 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工具,该工具也有一个"Scratch Editor"来帮助从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 子句中使用变量的正确语法是什么? 我希望我不必使用游标等来执行此问题中建议的简单语句

嗯,是的 - 那些"翻译者"并不总是做他们应该做的事情。

代码应如下所示:

  • where子句中使用like,而不是=
  • 在 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;

由于这是标记为 SQL Developer,请使用绑定变量:

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

SQL开发人员将弹出一个对话框,您可以在其中设置ObjToSearch变量的值。

如果要在代码中指定绑定变量,则:

VARIABLE objtosearch VARCHAR2(50)
BEGIN
:objtosearch := '%aldbrough%';
END;
/
SELECT obj_id,
name,
description
FROM   agnis.t_object
WHERE  lower(name) = :ObjToSearch;

并使用F5将语句作为脚本运行,而不是作为单个语句运行。

最新更新