0
votes

La fonction renvoie max de table entière au lieu de quelque chose de particulier - Plsql

J'ai eu une question de plsql liée à ma sortie. Supposons que j'ai une table comme celle-ci: xxx

J'ai besoin de créer une fonction qui obtient comme paramètre le pays et me fournit son niveau maximal.

C'est ce que j'ai écrit : xxx

et ma sortie est le taux maximal de table des tarifs entiers qui, par exemple, est 6, mais j'avais besoin d'obtenir 3.

sera reconnaissant de trouver mon bogue :) Merci!


0 commentaires

3 Réponses :


2
votes

Vous devez donner à votre paramètre un autre nom que le nom de la colonne dans la table, sinon la condition dans le où la clause code> est ambiguë.

in conditions r.country = pays CODE>, la base de données pense que le deuxième pays code> fait référence au nom de la colonne (non qualifié), pas au paramètre. Cette condition est toujours vraie (sauf si pays code> est null code>), et la requête finit par retourner le niveau maximum de la table entière. P>

CREATE OR REPLACE
FUNCTION getMaxLevel(pCountry VARCHAR2)
RETURN NUMBER
IS
MaxLevel NUMBER;
BEGIN
        SELECT max(R.Level) INTO MaxLevel 
        FROM Rates R
        WHERE R.country = pCountry;
        RETURN MaxLevel;
END getMaxLevel;
/
/*CALL TO CHECK*/
DECLARE
X NUMBER;
BEGIN
        X:=getMaxLevel('FRANCE');
        dbms_output.put_line(X);
END;


0 commentaires

3
votes

Vous problème est le nom du paramètre. Je recommanderais de le préfixer avec quelque chose comme dans code>: xxx pré>

vous pense em> que pays code> dans votre expression: P>

R.country = Country


0 commentaires

2
votes
  1. Vous avez oublié le préfixe Tð¾ le paramètre de fonction, c'est le nom de la fonction elle-même. Li>
  2. renommer la colonne niveau code> dans la table (E.G. LVL), c'est le mot clé. LI>

    Considérez cet exemple de travail: P>

    create or replace function getMaxLevel (Country varchar2) return number is
    begin
        for r in (
            select max (r.Lvl) MaxLevel
            from Rates r
            where R.country=getMaxLevel.Country
            ) loop return r.MaxLevel; 
            end loop;
        raise program_error;
    end getMaxLevel;
    /
    var x number
    exec :x := getMaxLevel ('FRANCE');
    
    X
    -
    3
    

0 commentaires