2015-11-17 3 views
2

J'ai cette fonction PL/SQL qui accepte le nom d'un étudiant (f_name). La fonction affiche ensuite toutes les informations pour l'étudiant donné à partir d'une table préfabriquée appelée étudiants. La table contient 5 colonnes, 2 types de nombres et 3 types varchar2. Si le nom n'est pas trouvé dans la table, un message d'erreur est renvoyé. Mon code à ce jour estPL/SQL Fonction pour retourner varchar2/nombres

CREATE OR REPLACE FUNCTION studentName(
    f_name IN VARCHAR2) 
    RETURN 
IS 
    v_test students%rowtype; 
    CURSOR c1 
    IS 
    SELECT * FROM students WHERE first_name = f_name; 
BEGIN 
    OPEN c1; 
    FETCH c1 INTO v_test; 
    IF c1%notfound THEN 
    v_test := NULL; 
    END IF; 
CLOSE c1; 
RETURN v_test; 
END; 

Je continue à recevoir:

PLS-00382: l'expression est de mauvais type

Je crois que de ma déclaration initiale varchar2 de retour. Comment autoriser le retour à accepter à la fois le type varchar2 et le type de numéro?

+3

Le type de v_test que vous renvoyez 'students% rowtype;' est en conflit avec votre type de retour 'varchar2'. En fait, pour accepter le retour dont vous avez besoin, changez le type de retour en 'students% rowtype' – SomeJavaGuy

+0

' students% rowtype' est un type de * une variable *, quel est le problème? – smnbbrv

+0

fixe jamais merci les gars – rob

Répondre

3

RETOUR varchar2

Vous devez retourner le rowtype, mais vous retournez un scalaire. VARCHAR2 ne peut pas contenir une ligne, il ne peut contenir qu'une valeur de chaîne.

Modifier à:

RETURN students%rowtype; 

Demo utilisant table standard EMP:

SQL> CREATE OR REPLACE FUNCTION studentName(
    2  f_name IN VARCHAR2) 
    3 RETURN emp%rowtype 
    4 IS 
    5 v_test emp%rowtype; 
    6 CURSOR c1 
    7 IS 
    8  SELECT * FROM emp WHERE ename = f_name; 
    9 BEGIN 
10 OPEN c1; 
11 FETCH c1 INTO v_test; 
12 IF c1%notfound THEN 
13  v_test := NULL; 
14 END IF; 
15 CLOSE c1; 
16 RETURN v_test; 
17 END; 
18/

Function created. 

SQL> sho err 
No errors. 

NOTE: %ROWTYPE implique PL/type d'enregistrement SQL et types PL/SQL ne sont pas connu pour SQL. Vous ne pourrez donc pas utiliser la fonction directement en langage SQL. Vous devez utiliser Type d'objet SQL. Sinon vous obtiendrez:

ORA-06553: PLS-801: erreur interne [55018]

Solution pour l'utiliser dans SQL:

SQL> create or replace 
    2 type student_obj_type 
    3  as object(
    4    student_id number, 
    5    stu_name varchar2(20), 
    6    dept varchar2(20) 
    7    ) 
    8/

Type created. 

Utilisez student_obj_type au lieu de élèves% rowtype pour utiliser la fonction dans SQL.

+0

merci Lalit travaille maintenant – rob

+0

J'ai ajouté une autre information, j'espère que cela aiderait. –