我是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子句中使用变量的正确语法是什么?我希望我不必在此问题中建议的简单语句中使用游标等
好吧,是的-这些“翻译”并不总是按照他们的预期去做。
这是您的代码应如下所示:
like
,没有=
了在where
第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;
好的,我看到我必须为查询返回的每个数据项声明一个变量,但是是的,在这种情况下,使用您的良好代码会给我返回多行的错误
就像@APC所说的一样。我添加了更多代码,这些代码显示了如何“修复”该问题,但是-最终结果取决于您要执行的操作。这仅在支持DBMS_OUTPUT的工具(例如SQLPlus或SQL Developer)中显示值。
我现在正在使用此代码DECLARE v_SearchObj VARCHAR2(100):='%aldbrough%'; 类型v_obj_id是数字表;类型v_name是TABLE OF VARCHAR(200); 类型v_description是VARCHAR(200)表; 从agnis.t_object中开始选择obj_id,名称,说明批量收集到v_obj_id,v_name,v_description在哪里(名称)像v_searchobj; 结束; 但我收到此错误错误报告-ORA-06550:第9行,第24列:PLS-00321:表达式'V_OBJ_ID'不适合作为赋值语句的左侧
是否可以在这些注释中格式化代码?
您不能在注释中设置代码格式;最好编辑您发布的原始问题。无论如何,您不能将3列批量收集为3个数组。创建一个包含所有3列的数组。