首页 文章

如何通过将参数传递给 oracle pl/sql 中的 where 子句来获取多个记录

提问于
浏览
0

表:

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 回答

  • 0

    这是语法错误。

    E_ID 是数字类型,您正在比较它将是 varchar2 类型的 v1。

  • 0

    欢迎来到 SO。一个问问题的好地方:我可以看到您正在尝试做什么。从句法上讲,您尝试使用“ IN”子句查询表是可以原谅的,但是正如其他人所说的那样,如果您将数字值提交到 varchar2 中,则无法做到这一点。无论如何,数组或集合(即使您已经创建了一个数组)也不是一个容易的选择。但是,您确实可以使用多种解决方案:

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

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

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

    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;
    

相关问题