Oracle-正在使用可选参数吗?

问题描述 投票:1回答:1

我想将最多三个可选参数添加到名为TEST的Oracle函数中。返回值应为2。如何修改我的函数以使这些查询以最简单的方式工作?

SELECT TEST('eq1','md1') TEST0 FROM DUAL; -- Shows 2 correctly    
--How to make these queries also work?
SELECT TEST('eq1','md1','c1') TEST1 FROM DUAL;
SELECT TEST('eq1','md1','c1','d1') TEST2 FROM DUAL;
SELECT TEST('eq1','md1','c1','d1','e1') TEST3 FROM DUAL;

表和功能如下。

下表如下

CREATE TABLE T5 (
COL1 VARCHAR2(10),
COL2 VARCHAR2(10),
COL3 VARCHAR2(10),
COL4 VARCHAR2(10),
COL5 VARCHAR2(10),
VAL VARCHAR2(10)
);
INSERT INTO T5  VALUES ('eq1','md1','c1','d1','e1','2');
INSERT INTO T5  VALUES ('eq2','md2','c2','d2','e2','5');
INSERT INTO T5  VALUES ('eq3','md3','c3','d3','e3','3');

我的职责是,

CREATE OR REPLACE FUNCTION TEST
(p1 IN VARCHAR2,
 p2 IN VARCHAR2
                  --How to add optional parameter p3?
                  --How to add optional parameter p4?
                  --How to add optional parameter p5?
)
RETURN NUMBER AS V_VALUE VARCHAR2(10);
BEGIN
SELECT(
    SELECT VAL  FROM T5
    WHERE COL1 = p1
    AND COL2 = p2
                  --How to add constraint COL3=p3?
                  --How to add constraint COL4=p4?
                  --How to add constraint COL5=p5?                      
    )
INTO V_VALUE
FROM DUAL;    
RETURN V_VALUE;
END;
/
oracle parameters
1个回答
2
投票

您需要定义default值,就是这样。

您的功能代码应如下所示:

CREATE OR REPLACE FUNCTION TEST (
    P1   IN   VARCHAR2,
    P2   IN   VARCHAR2,
    P3   IN   VARCHAR2 DEFAULT NULL,
    P4   IN   VARCHAR2 DEFAULT NULL,
    P5   IN   VARCHAR2 DEFAULT NULL
) RETURN NUMBER AS
    V_VALUE   VARCHAR2(10);
BEGIN
    SELECT
        (
            SELECT
                VAL
            FROM
                T5
            WHERE
                COL1 = P1
                AND COL2 = P2
                AND COL3 = COALESCE(P3, COL3)
                AND COL4 = COALESCE(P4, COL4)
                AND COL5 = COALESCE(P5, COL5)
        )
    INTO V_VALUE
    FROM
        DUAL;

    RETURN V_VALUE;
END TEST;
/

现在,所有查询将运行:

SELECT TEST('eq1','md1') TEST0 FROM DUAL;
SELECT TEST('eq1','md1','c1') TEST1 FROM DUAL;
SELECT TEST('eq1','md1','c1','d1') TEST2 FROM DUAL;
SELECT TEST('eq1','md1','c1','d1','e1') TEST3 FROM DUAL;

但是,请确保order中传递的参数的function没有损坏。您不传递P5参数值就不能传递P4,除了在调用函数时使用参数名。

干杯!

© www.soinside.com 2019 - 2024. All rights reserved.