Функция MY_FUN возвращается должным образом.
SELECT MY_FUN('e1','m1','L1') TEST1 FROM DUAL; --This return value 5 as expected.
TEST1
-----
5
Функциональными параметрами являются EQUIP, MODEL и LOT. Он выбирает значение в столбце RR в таблице WC_BASE в соответствии с EQUIP, MODEL и ITEM1. И значение ITEM1 находится в таблице M_IF с помощью LOT.
Но, Как изменить MY_FUN для возврата значения, даже если значение ITEM1 равно NULL? Например, LOT 'L3' равен NULL или LOT4 не существует в таблице M_IF.
--How to modify MY_FUN to return 6?
SELECT MY_FUN('e1','m1','L3') TEST2 FROM DUAL;
SELECT MY_FUN('e1','m1','L4') TEST3 FROM DUAL;
Ожидаемый результат:
TEST2
------
6
TEST3
------
6
[Моя таблица и данные]
CREATE TABLE WC_BASE (
EQUIP VARCHAR2(15),
MODEL VARCHAR2(15),
VAL VARCHAR2(15),
ITEM1 VARCHAR2(15),
RR VARCHAR2(15)
);
CREATE TABLE M_IF (
LOT VARCHAR2(15),
ITEM1 VARCHAR2(15)
);
INSERT INTO WC_BASE VALUES('e1','m1','2','c1','5');
INSERT INTO WC_BASE VALUES('e1','m1','1',NULL,'6');
INSERT INTO M_IF VALUES('L1','c1');
INSERT INTO M_IF VALUES('L2','c1');
INSERT INTO M_IF VALUES('L3',NULL);
[Моя функция]
CREATE OR REPLACE FUNCTION MY_FUN
(
P1 IN VARCHAR2,
P2 IN VARCHAR2,
P3 IN VARCHAR2
)
RETURN NUMBER AS V_VALUE NUMBER;
BEGIN
SELECT (
---
WITH SG AS (SELECT *
FROM WC_BASE
WHERE EQUIP =P1
AND MODEL =P2
AND ITEM1=(SELECT ITEM1 FROM M_IF WHERE LOT = P3) -- How to make an effect of ignoring this condition if the subquery returns null?
)
SELECT (x1) ANSWER
FROM ( SELECT
NVL(TO_NUMBER(RR),0) AS x1
FROM SG
WHERE VAL IN (SELECT TO_CHAR(MAX(TO_NUMBER(VAL))) FROM SG )
)
---
)
INTO V_VALUE
FROM DUAL ;
RETURN V_VALUE;
END MY_FUN;
/