2016-07-04 3 views
-2
CREATE OR REPLACE FUNCTION XXCHR_FNC(
    P_EMP_ID   IN NUMBER, 
    P_COLUMN_NAME IN VARCHAR2 
) RETURN VARCHAR2 
IS 
    lv_dyn_sql VARCHAR2(2000):= NULL; 
    lv_return_val VARCHAR2(200); 
BEGIN 
    lv_dyn_sql:='SELECT :2 FROM thirty_days ' 
       || 'WHERE salesrep_id=:1'; 

    EXECUTE IMMEDIATE lv_dyn_sql INTO lv_return_val 
    USING P_EMP_ID,P_COLUMN_NAME; 

    RETURN(lv_return_val); 
EXCEPTION 
    WHEN OTHERS THEN 
    dbms_output.put_line('Returning Error : '||SQLERRM); 
    RETURN (SQLERRM); 
END XXCHR_FNC; 
+0

Il n'y a pas question ici. Que demandez-vous? – MT0

+0

Excuses le problème est quand j'essaye d'exécuter la fonction ci-dessus je fais face à une erreur comme ORA-01722: erreur de numéro non valide tout en sélectionnant des données d'une table. J'ai assigné des types de données corrects aux variables s'il vous plaît suggérer ici. Merci d'avance – Satish

+0

Qu'est-ce qu'un type de colonne 'salesrep_id'? Et quelle valeur avez-vous passé au paramètre "P_COLUMN_NAME"? Je suppose que 'salesrep_id' est du type de données number, mais vous avez passé une chaîne qui ne peut pas être convertie en un nombre à' P_COLUMN_NAME', et c'était une raison de l'erreur. – krokodilko

Répondre

0

Vous ne pouvez pas passer un nom de colonne comme une variable de liaison - si vous le faites vous retournerez le nom de colonne comme une chaîne plutôt littérale que d'obtenir la valeur de la colonne. Vous devez utiliser la concaténation sur la chaîne SQL:

CREATE OR REPLACE FUNCTION XXCHR_FNC(
    P_EMP_ID   IN NUMBER, 
    P_COLUMN_NAME IN VARCHAR2 
) RETURN VARCHAR2 
IS 
    lv_return_val VARCHAR2(200); 
BEGIN 
    EXECUTE IMMEDIATE 
    'SELECT ' || P_COLUMN_NAME || ' FROM thirty_days WHERE salesrep_id=:1' 
    INTO lv_return_val 
    USING P_EMP_ID; 

    RETURN lv_return_val; 
EXCEPTION 
    WHEN OTHERS THEN 
    dbms_output.put_line('Returning Error : '||SQLERRM); 
    RETURN SQLERRM; 
END XXCHR_FNC; 
/

Test:

CREATE TABLE thirty_days (
    salesrep_id NUMBER(8,0), 
    a VARCHAR2(20), 
    b VARCHAR2(20), 
    c VARCHAR2(20), 
    d VARCHAR2(20) 
); 

INSERT INTO thirty_days VALUES(1, 'a', 'b', 'c', 'd'); 

Sortie:

SELECT xxchr_fnc(1, 'a') FROM DUAL; 

XXCHR_FNC(1,'A') 
---------------- 
a 
+0

Merci MT0 son travail :) – Satish