我使用变量来存储数值范围,如下所示:
:p_where := 7||','||8||','||9;
select * from <TABLE> where
col1 in (:p_where);
它会出现以下错误:
ORA-01722: invalid number
如何处理这个问题?
答案 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