我需要创建一个 cursor/function/procedure 来获得这个结果

I need to create a cursor/function/procedure to get this result

我有这个table:

+----+-------+----------+---------------+
| ID | Name  | Contract | ContractValue |
+----+-------+----------+---------------+
| 1  | Mike  | 001      | 100$          |
+----+-------+----------+---------------+
| 1  | Mike  | 004      | 177$          |
+----+-------+----------+---------------+
| 2  | Diana | 002      | 300$          |
+----+-------+----------+---------------+
| 2  | Diana | 003      | 150$          |
+----+-------+----------+---------------+

然后 SQL 我得到这个结果:

SELECT Name, SUM(ContractValue) as ContractValue
FROM table
GROUP BY Name;

+-------+---------------+
| Name  | ContractValue |
+-------+---------------+
| Mike  | 277$          |
+-------+---------------+
| Diana | 450$          |
+-------+---------------+

我需要创建一个与 table above.Of 课程结果相同的 cursor/function/procedure 而不是 table 它应该是这样的字符串“迈克设法获得了 277 美元”。有谁知道该怎么做?

所以,您的 table 实际上将 100$ 存储在 contractvalue 中?这意味着它是一个字符串,这是一个非常糟糕的数据模型。如果您必须对其进行数学运算,则需要一个数字列:contractvalue_usd 存储 100。拥有一个字符串意味着您将任由用户以任何格式输入任何旧垃圾。

无论如何,解决您的实际问题。有多种不同的方法可以解决这个问题。这是一个 returns 嵌套 table 格式化字符串的函数:

create or replace function get_contract_summary 
    return sys.dbms_debug_vc2coll
as
    return_value sys.dbms_debug_vc2coll;
begin
    select name || ' managed to obtain ' 
                || to_char( total_contractvalue ) ||'$'
    bulk collect into return_value
    from (  
        select name, 
               sum(to_number(replace(contractvalue, '$'))) as total_contractvalue
        from contracts
        group by name
        );
    return return_value;
end get_contract_summary;
/   

运行 像这样:

SQL> select * from table(get_contract_summary)
  2  /

COLUMN_VALUE
--------------------------------------------------------------------------------
Diana managed to obtain 450$
Mike managed to obtain 277$

SQL>