Pl / SQL ORA-01722:where子句中的数字无效

时间:2013-11-03 08:52:06

标签: forms oracle plsql

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

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

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

它会出现以下错误:

ORA-01722: invalid number 

如何处理这个问题?

1 个答案:

答案 0 :(得分: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')));

输出:

        ID NAME                     SALARY
---------- -------------------- ----------
         1 Smith                      5000 
         3 Bay                       10000