表:
create table emp
(
E_ID number,
E_NAME varchar2(30)
);
select * from emp;
101 name1
102 name2
我的代码:
declare
v1 varchar2(30) := '101,102';
begin
for i in (select e_id,e_name
from emp
where e_id in (v1)) loop
dbms_output.put_line(i.e_id);
end loop;
end;
/
问题:
获取 ORA -01722:invalid 号
请帮助了解此问题并向我提出解决方案。
2 回答
这是语法错误。
E_ID 是数字类型,您正在比较它将是 varchar2 类型的 v1。
欢迎来到 SO。一个问问题的好地方:我可以看到您正在尝试做什么。从句法上讲,您尝试使用“ IN”子句查询表是可以原谅的,但是正如其他人所说的那样,如果您将数字值提交到 varchar2 中,则无法做到这一点。无论如何,数组或集合(即使您已经创建了一个数组)也不是一个容易的选择。但是,您确实可以使用多种解决方案:
1 /将您的数字放入数组并在循环中使用条件,并检查 e_id 是否构成数组的一部分。但是 in-elegant!
2 /创建一个全局临时表,然后在其中添加您的数字并将该表添加到您的查询中,并指定一个联接。
3 /使用参考光标创建一些动态 PL/SQL。我在下面为您提供了一个使用表(emp)和值的示例。在这种情况下,您将能够根据要查询的值构建字符串。见下文。 varchar2 字符串:sqlString 可以根据需要进行操作。粘贴到 test-harness 并查看。希望能帮助到你