我正在使用一个变量来存储数值范围,如下所示:
:p_where := 7||','||8||','||9;
select * from <TABLE> where
col1 in (:p_where);
它会给出以下错误:
ORA-01722: invalid number
如何处理这个问题?
如果您按照向我们展示的方式进行操作,您最终会得到以下结果:
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