oracle PL/SQL:在此函数中找不到错误

oiopk7p5  于 2022-11-22  发布在  Oracle
关注(0)|答案(2)|浏览(130)

我是一名学生,我有这样一个练习:我们必须编写一个带有两个参数(账号和取款)的函数,并且只有当账户余额-取款〉流量阈值时,才返回银行账户的新余额
这是我的代码:

set serveroutput on

CREATE OR REPLACE FONCTION Retrait
    (f_numcomp in varchar2,f_montant NUMBER(38,3))
    RETURN NUMBER(38,3)
AS
    v_compte compte%rowtype;
    v_solde compte.Solde%type;
BEGIN
    SELECT * into v_compte from compte where f_numcomp = compte.NUMEROCOMPTE;

    if (v_compte.Solde - f_montant) > v_compte.SeuilDebit /*and compte.Etat != 'desactiver'*/ THEN
        v_solde := v_compte.Solde - f_montant;
        UPDATE compte SET Solde = Solde - f_montant where f_numcomp = compte.NumeroCompte;
    else
        dbms_output.put_line('solde insufusant!');
    end if;

    return(v_solde);
END Retrait;
/

这是我得到的:
错误报告-
ORA-06550:第9行,第16列:
PLS-00103:符号“(“在以下符号的位置进行比较:
上。
06550. 00000 -“第%s行,第%s列:\n%s”

  • 原因:通常是PL/SQL编译错误。
  • 操作:
    我是新来的;我在这里看了一些文章,但仍然没有发现错误
lp0sw83n

lp0sw83n1#

您应该能够简化该函数,使用带有RETURNING子句的单个UPDATE语句(而不是先使用SELECT,然后使用UPDATE):

CREATE FUNCTION Retrait (
  f_numcomp IN COMPTE.NUMEROCOMPTE%TYPE,
  f_montant IN COMPTE.SOLDE%TYPE
) RETURN COMPTE.SOLDE%TYPE
AS
  v_solde COMPTE.SOLDE%TYPE;
BEGIN
  UPDATE compte
  SET    Solde = Solde - f_montant
  WHERE  f_numcomp = NumeroCompte
  AND    solde - f_montant > SeuilDebit
  RETURNING solde INTO v_solde;

  IF SQL%ROWCOUNT = 0 THEN
    DBMS_OUTPUT.PUT_LINE('solde insufusant!');
  END IF;

  RETURN v_solde;
END Retrait;
/

但是,在函数中使用DML语句并不常见;通常使用PROCEDURE并使用OUT参数返回值。
fiddle

pbwdgjma

pbwdgjma2#

FONCTION必须是FUNCTION,但这显然只是请求中的一个排印错误,因为您得到的错误是其他错误。
在函数声明中,Oracle需要不带精度的类型。例如,NUMBER而不是NUMBER(38, 3)

CREATE OR REPLACE FUNCTION Retrait (f_numcomp IN VARCHAR2, f_montant NUMBER)
  RETURN NUMBER
AS
  v_compte compte%ROWTYPE;
  v_solde  compte.Solde%TYPE;
BEGIN
  SELECT * INTO v_compte
  FROM compte
  WHERE f_numcomp = compte.NUMEROCOMPTE;

  ...

相关问题