我正在嘗試創建一個簡單的函式,該函式回傳傳遞給函式的最小值......但是在運行時它不起作用,它只回傳與我傳遞給函式 15、2、3 的相同值,它應該回傳 2.. . 有人可以幫助我并告訴我為什么它不起作用嗎?
CREATE OR REPLACE
function
GET_LEAST_VALUE(in_numbers IN VARCHAR2)
RETURN VARCHAR2
IS
vReturn varchar2(50);
BEGIN
vReturn := least(in_numbers);
return vReturn;
END;
uj5u.com熱心網友回復:
正如所評論的那樣,它無法作業,因為您實際上是在將字串傳遞給函式。
這是一個選項 - 它將字串拆分為行;regexp_substr回傳一個字串(再次)所以 - 首先修剪它(以洗掉可能的空格)并應用to_number(否則你會比較字串,這與比較數字不同)。最后,應用min聚合函式,因為如果你傳遞了多個數字(你會得到 too_many_rows 錯誤) ,least它將不起作用。
SQL> CREATE OR REPLACE FUNCTION get_least_value (in_numbers IN VARCHAR2)
2 RETURN VARCHAR2
3 IS
4 vreturn VARCHAR2 (50);
5 BEGIN
6 WITH
7 temp
8 AS
9 ( SELECT TO_NUMBER (TRIM (REGEXP_SUBSTR (in_numbers,
10 '[^,] ',
11 1,
12 LEVEL))) val
13 FROM DUAL
14 CONNECT BY LEVEL <= REGEXP_COUNT (in_numbers, ',') 1)
15 SELECT MIN (val)
16 INTO vreturn
17 FROM temp;
18
19 RETURN vreturn;
20 END;
21 /
Function created.
SQL> SELECT get_least_value ('15,2,3') result FROM DUAL;
RESULT
--------------------------------------------------------------------------------
2
SQL>
uj5u.com熱心網友回復:
CREATE OR REPLACE FUNCTION get_least_value (in_numbers IN VARCHAR2) RETURN NUMBER IS
w_result NUMBER ;
BEGIN
SELECT MIN(value) INTO w_result FROM
json_table (
'[' || in_numbers || ']',
'$[*]'
columns (
value NUMBER PATH '$'
)
)
;
RETURN w_result ;
END ;
/
SELECT get_least_value('4,1,9,0,-5') from dual ;
-5
uj5u.com熱心網友回復:
為什么它不起作用?
當您傳入單個字串并在LEAST將該單個字串與其他字串進行比較時找到最小值時,它確實有效,因此它回傳該單個字串;這正是我們LEAST打算做的。
但是,這不是您期望的那樣。
為什么它不符合我的預期?
您期望'15,2,3'被評估為數字串列(即LEAST(15,2,3)),但它不是數字串列,它是單個字串文字,在人類看來,就像數字串列,但對于 SQL 引擎,它實際上只有一個字串值,將被評估為LEAST('15,2,3').
如何解決?
您需要通過集合傳入多個值(例如,內置的SYS.ODCINUMBERLISTvarray 集合型別):
CREATE FUNCTION GET_LEAST_VALUE(
in_numbers IN SYS.ODCINUMBERLIST
) RETURN NUMBER
IS
v_least NUMBER;
BEGIN
SELECT MIN(column_value)
INTO v_least
FROM TABLE(in_numbers);
RETURN v_least;
END;
/
然后將其稱為:
SELECT get_least_value(SYS.ODCINUMBERLIST(15,2,3))
FROM DUAL;
或者
BEGIN
DBMS_OUTPUT.PUT_LINE(get_least_value(SYS.ODCINUMBERLIST(15,2,3)));
END;
/
小提琴
或者,您需要將字串拆分為單獨的值,然后找到這些值中的最小值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/530915.html
標籤:sql甲骨文plsql
上一篇:如何使用for回圈更新資料框,并為檔案夾中的影像選擇區域的tesseract輸出?
下一篇:OracleSQL漏掉了
