0

我正在使用一个变量来存储数值范围,如下所示:

:p_where := 7||','||8||','||9;

select * from <TABLE> where
col1 in (:p_where);

它会给出以下错误:

ORA-01722: invalid number 

如何处理这个问题?

4

1 回答 1

2

如果您按照向我们展示的方式进行操作,您最终会得到以下结果:

col1 in ('7,8,9');

代替:

col11 in (7, 8, 9)

您需要做的是编写一个PIPELINED函数,该函数将标记以逗号分隔的数字列表,并允许您查询该列表并将它们放入IN列表中。我不确定这是否适用于 Oracle Forms,请参阅以下示例并尝试使用它并给我一些反馈:

CREATE TABLE test_pipe (
  id NUMBER,
  name VARCHAR2(20),
  salary NUMBER
);

INSERT INTO test_pipe VALUES (1, 'Smith', 5000);
INSERT INTO test_pipe VALUES (2, 'Brown', 8000);
INSERT INTO test_pipe VALUES (3, 'Bay', 10000);

COMMIT;

CREATE TYPE t_pipe_test_num_tab IS TABLE OF NUMBER;
/

CREATE OR REPLACE FUNCTION test_func_num_pipe(p_list IN VARCHAR2)
  RETURN t_pipe_test_num_tab
  PIPELINED
AS
BEGIN
  FOR v_value IN (
          SELECT regexp_substr(p_list, '[^,]+', 1, level) AS token FROM dual
          CONNECT BY regexp_substr(p_list, '[^,]+', 1, level) IS NOT NULL
        )
  LOOP
    PIPE ROW (v_value.token);
  END LOOP;
END;
/

SELECT *
  FROM test_pipe
WHERE id IN (SELECT COLUMN_VALUE FROM TABLE(test_func_num_pipe('1,3')));

输出:

        身份证 姓名 工资
---------- -------- ----------
         1 史密斯 5000
         3 湾 10000
于 2013-11-03T09:13:28.527 回答