Plsql 我需要创建一个游标/函数/过程来获得这个结果

Plsql 我需要创建一个游标/函数/过程来获得这个结果,plsql,cursor,Plsql,Cursor,我有这张桌子: +----+-------+----------+---------------+ | ID | Name | Contract | ContractValue | +----+-------+----------+---------------+ | 1 | Mike | 001 | 100$ | +----+-------+----------+---------------+ | 1 | Mike | 004 | 177$

我有这张桌子:

+----+-------+----------+---------------+
| 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$          |
+-------+---------------+

我需要创建一个游标/函数/过程,该游标/函数/过程的结果与上面的表相同。当然,它应该是一个类似“Mike设法获得277$”的字符串,而不是一个表。有人知道怎么做吗

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

无论如何,为了解决你的实际问题。有各种不同的方法来解决这个问题。下面是一个函数,它返回格式化字符串的嵌套表:

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> 

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

无论如何,为了解决你的实际问题。有各种不同的方法来解决这个问题。下面是一个函数,它返回格式化字符串的嵌套表:

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> 

你必须把你到目前为止试过的东西贴出来。这里真的不鼓励询问代码,我希望那些发布答案的人真的不鼓励发布查询的人学习您必须发布您迄今为止尝试过的内容。这里真的不鼓励询问代码,我希望那些发布答案的人真的不鼓励发布查询的人学习