Plsql PL/SQL函数\u获取总余额有错误

Plsql PL/SQL函数\u获取总余额有错误,plsql,Plsql,我试图创建一个函数,给定一个客户名称,从账户表a、CNAME、BAL中获取该客户账户的总余额 在命令中编译时,我遇到错误: 行从帐户中选择SUMbal到total_a_bal忽略 和account.cname=v_acname SQL cmd未正确结束的行 请帮助更正错误。任何帮助都将不胜感激 我的职能是: CREATE OR REPLACE FUNCTION totbal (v_acname IN account.cname%type) RETURN NUMBER IS to

我试图创建一个函数,给定一个客户名称,从账户表a、CNAME、BAL中获取该客户账户的总余额

在命令中编译时,我遇到错误: 行从帐户中选择SUMbal到total_a_bal忽略

和account.cname=v_acname SQL cmd未正确结束的行

请帮助更正错误。任何帮助都将不胜感激

我的职能是:

CREATE OR REPLACE FUNCTION totbal
    (v_acname IN account.cname%type)
RETURN NUMBER
IS 
    total_a_bal NUMBER; 
BEGIN 
    SELECT SUM(bal) INTO total_a_bal FROM account
    group by account.cname
    WHERE account.cname = v_acname;
    RETURN total_a_bal;
END;
/

这可能不是函数的唯一问题,但在SQL查询中WHERE子句始终位于GROUP BY子句之前。因此,您的函数应该如下所示:

CREATE OR REPLACE FUNCTION totbal
    (v_acname IN varchar2)     -- a type should follow IN, e.g. varchar2
RETURN NUMBER
IS
    total_a_bal NUMBER; 
BEGIN
    SELECT SUM(bal) INTO total_a_bal
    FROM account
    WHERE account.cname = v_acname;    -- WHERE always precedes GROUP BY
    GROUP BY account.cname
RETURN total_a_bal;
END;

这可能不是函数的唯一问题,但在SQL查询中WHERE子句始终位于GROUP BY子句之前。因此,您的函数应该如下所示:

CREATE OR REPLACE FUNCTION totbal
    (v_acname IN varchar2)     -- a type should follow IN, e.g. varchar2
RETURN NUMBER
IS
    total_a_bal NUMBER; 
BEGIN
    SELECT SUM(bal) INTO total_a_bal
    FROM account
    WHERE account.cname = v_acname;    -- WHERE always precedes GROUP BY
    GROUP BY account.cname
RETURN total_a_bal;
END;

Oracle不仅适用于参数定义account.cname%类型,这是首选方法。它所做的是将参数定义绑定到数据库中的列。如果列定义发生更改,则过程会自动获取更改的列定义

这个用数据库列定义的概念可以而且可能应该扩展到过程/函数本身的变量和返回类型中

然后,此功能变为:

CREATE OR REPLACE FUNCTION totbal
    (v_acname IN account.cname%type)
RETURN account.bal%type
IS 
    total_a_bal account.bal%type; 
BEGIN 
    SELECT SUM(bal) INTO total_a_bal FROM account
    group by account.cname
    WHERE account.cname = v_acname;
    RETURN total_a_bal;
END; 

Oracle不仅适用于参数定义account.cname%类型,这是首选方法。它所做的是将参数定义绑定到数据库中的列。如果列定义发生更改,则过程会自动获取更改的列定义

这个用数据库列定义的概念可以而且可能应该扩展到过程/函数本身的变量和返回类型中

然后,此功能变为:

CREATE OR REPLACE FUNCTION totbal
    (v_acname IN account.cname%type)
RETURN account.bal%type
IS 
    total_a_bal account.bal%type; 
BEGIN 
    SELECT SUM(bal) INTO total_a_bal FROM account
    group by account.cname
    WHERE account.cname = v_acname;
    RETURN total_a_bal;
END; 

account.cname%类型。。。这是什么?帐户.cname%类型。。。这是什么?非常感谢你的评论!!我把where子句放在GROUPBY之前,然后重新运行代码,得到了结果!对于这部分:account.cname%type中的v_acname,这意味着参数v_acname与account表中的列cname具有相同的数据类型。这也行得通。我不认为甲骨文是这样的。您应该只列出与account表中显示的类型相同的类型。@TimBiegeleisen我不认为Oracle是这样工作的为什么?可以使用%type属性作为UDF参数的类型。或者我不理解什么?@OtoShavadze我在甲骨文中没有UDF的经验。如果你是对的,那么请随意编辑我的答案。@TimBiegeleisen-不,我刚刚检查了我是否遗漏了我不想编辑你的答案的内容,不管怎样,它似乎是正确的。非常感谢你的评论!!我把where子句放在GROUPBY之前,然后重新运行代码,得到了结果!对于这部分:account.cname%type中的v_acname,这意味着参数v_acname与account表中的列cname具有相同的数据类型。这也行得通。我不认为甲骨文是这样的。您应该只列出与account表中显示的类型相同的类型。@TimBiegeleisen我不认为Oracle是这样工作的为什么?可以使用%type属性作为UDF参数的类型。或者我不理解什么?@OtoShavadze我在甲骨文中没有UDF的经验。如果你是对的,那么请随意编辑我的答案。@TimBiegeleisen-不,我刚刚检查了我是否遗漏了我不想编辑你的答案的内容,不管怎样,它似乎是正确的。