次のような数値範囲を格納するために変数を使用しています。
: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')));
出力:
ID名 給与 ---------- -------------------- ---------- 1 スミス 5000 3 ベイ 10000