首页 > 解决方案 > 如何通过将参数传递给oracle pl / sql中的where子句来获取多条记录

问题描述

桌子 :

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:无效号码

请帮助理解这个问题并建议我解决方案。

标签: sqlselectplsql

解决方案


欢迎来到 SO。提问的好地方:我可以看到你想要做什么。从语法上讲,您尝试使用“IN”子句查询表是可以原谅的,但正如其他人所说,这不能在您将数值提交到 varchar2 的情况下完成。无论如何,数组或集合(即使您已经创建了一个)在这里都不是一个简单的选择。但是您确实有多种解决方案可供您使用:

1/ 将您的数字放入一个数组并在循环中使用条件并检查 e_id 是否构成您的数组的一部分。但不优雅!

2/创建一个全局临时表并添加您的数字并将该表添加到您的查询中,指定一个连接。

3/ 使用 Ref Cursor 创建一些动态 PL/SQL。我在下面为您提供了一个示例,使用您的表 (emp) 和值。在这种情况下,您可以根据要查询的值构建字符串。见下文。varchar2 string: sqlString 可以根据需要进行操作。粘贴到测试工具中并查看。希望能帮助到你

declare
  type refCursor is ref cursor;
  tableCursor refCursor;
  emp_record  emp%rowtype;
  sqlString   varchar2(200);

begin
 -- Dynamic SQL statement with placeholder:
  sqlString := 'SELECT * FROM emp WHERE e_id in 
(101, 102)';

  -- Open cursor:
  open tableCursor for sqlString;

  -- Fetch rows from result set one at a time:
  loop
    fetch tableCursor
    into emp;
    exit when tableCursor%notfound;
    dbms_output.put_line(emp.e_id);
  end loop;

  -- Close cursor:
  close tableCursor;

end;

推荐阅读