oracle create function with cursor 求和另一个函数
oracle create function with cursor which sums another function
我这里有一种情况是函数和游标。我得到了 Fun_1 函数 return 我 ref_cursor 和这种类型的数据:
<SYSTEM_NAME=SPORT1,CASH_IN=1, CASH_OUT=0, NET_WIN=1, VAUCHER=0>,
<SYSTEM_NAME=SPORT2,CASH_IN=279,CASH_OUT=57.86,NET_WIN=278.71, VAUCHER=0.29>
,<SYSTEM_NAME=SPORT3,CASH_IN=9.22,CASH_OUT=0.5, NET_WIN=9.22, VAUCHER=0>;
现在我想创建函数,它将 return SUM(CASH_IN)、SUM(CASH_OUT)、SUM(NET_WIN) 和 SUM(VAUCHER) 来自Fun1 函数。
我需要做什么才能达到这个目的?谢谢
不清楚 <SYSTEM_NAME=SPORT1
、 CASH_IN=1
等是单独的列还是从您的函数返回的整个字符串的一部分。如果他们是一部分
对于整个字符串,您可以像下面的查询一样使用 REGEXP_SUBSTR
。这里假设 =
之后的所有值都将是整数或小数。
如果它们是单独的列值,那么您可以简单地在每一列上使用 SUBSTR(s,INSTR(s,'=') + 1)
来获取 '='
之后的值。
WITH c
AS (SELECT REGEXP_SUBSTR(s, 'CASH_IN=([0-9.]+)', 1, 1, NULL, 1) a,
REGEXP_SUBSTR(s, 'CASH_OUT=([0-9.]+)', 1, 1, NULL, 1) b,
REGEXP_SUBSTR(s, 'NET_WIN=([0-9.]+)', 1, 1, NULL, 1) c,
REGEXP_SUBSTR(s, 'VAUCHER=([0-9.]+)', 1, 1, NULL, 1) d
FROM t)
SELECT SUM(a) AS sum_CASH_IN,
SUM(b) AS sum_CASH_OUT,
SUM(c) AS sum_NET_WIN,
SUM(d) AS sum_VAUCHER
FROM c;
| SUM_CASH_IN | SUM_CASH_OUT | SUM_NET_WIN | SUM_VAUCHER |
|-------------|--------------|-------------|-------------|
| 289.22 | 58.36 | 288.93 | 0.29 |
我这里有一种情况是函数和游标。我得到了 Fun_1 函数 return 我 ref_cursor 和这种类型的数据:
<SYSTEM_NAME=SPORT1,CASH_IN=1, CASH_OUT=0, NET_WIN=1, VAUCHER=0>,
<SYSTEM_NAME=SPORT2,CASH_IN=279,CASH_OUT=57.86,NET_WIN=278.71, VAUCHER=0.29>
,<SYSTEM_NAME=SPORT3,CASH_IN=9.22,CASH_OUT=0.5, NET_WIN=9.22, VAUCHER=0>;
现在我想创建函数,它将 return SUM(CASH_IN)、SUM(CASH_OUT)、SUM(NET_WIN) 和 SUM(VAUCHER) 来自Fun1 函数。
我需要做什么才能达到这个目的?谢谢
不清楚 <SYSTEM_NAME=SPORT1
、 CASH_IN=1
等是单独的列还是从您的函数返回的整个字符串的一部分。如果他们是一部分
对于整个字符串,您可以像下面的查询一样使用 REGEXP_SUBSTR
。这里假设 =
之后的所有值都将是整数或小数。
如果它们是单独的列值,那么您可以简单地在每一列上使用 SUBSTR(s,INSTR(s,'=') + 1)
来获取 '='
之后的值。
WITH c
AS (SELECT REGEXP_SUBSTR(s, 'CASH_IN=([0-9.]+)', 1, 1, NULL, 1) a,
REGEXP_SUBSTR(s, 'CASH_OUT=([0-9.]+)', 1, 1, NULL, 1) b,
REGEXP_SUBSTR(s, 'NET_WIN=([0-9.]+)', 1, 1, NULL, 1) c,
REGEXP_SUBSTR(s, 'VAUCHER=([0-9.]+)', 1, 1, NULL, 1) d
FROM t)
SELECT SUM(a) AS sum_CASH_IN,
SUM(b) AS sum_CASH_OUT,
SUM(c) AS sum_NET_WIN,
SUM(d) AS sum_VAUCHER
FROM c;
| SUM_CASH_IN | SUM_CASH_OUT | SUM_NET_WIN | SUM_VAUCHER |
|-------------|--------------|-------------|-------------|
| 289.22 | 58.36 | 288.93 | 0.29 |