2016-07-06 9 views
0
CREATE OR REPLACE FUNCTION XXCHR_UPDATE  (
                   P_SALESREP_ID   IN NUMBER, 
                   p_COLUMN_NAME   IN  VARCHAR2, 
                   P_COLUMN_VALUE   IN varchar2 
                  ) 
    RETURN VARCHAR2 

IS 

    lv_dyn_sql      VARCHAR2(2000):= NULL; 

BEGIN 


     lv_dyn_sql := 'UPDATE thirty_days 
       SET attribute86 ='||p_COLUMN_NAME||',attribute87 ='||P_COLUMN_VALUE 
       || 'WHERE SALESREP_ID = :1';  

    EXECUTE IMMEDIATE lv_dyn_sql using P_SALESREP_ID; 

    return(1); 



EXCEPTION 
     WHEN OTHERS 
     THEN 
     dbms_output.put_line('Returning Error : '||SQLERRM); 
     --lv_return_val:= 0; 
    RETURN SQLERRM; 

END XXCHR_UPDATE; 

Wenn ich diese Funktion ausführen seine Rückkehr FehlerORA-14551: Kann keinen DML-Vorgang in einem Abfragefehler durchführen, während sofort mit Execute

ORA-14551

bitte vorschlagen hier

+0

[Wie frage ich ** gut ** Frage?] (Http://stackoverflow.com/help/how-to-ask) –

+0

Was tun Sie mit diese Funktion. 'wähle XXCHR_UPDATE (a, b, c) aus dual;'? –

+1

vielleicht müssen Sie Zitate in Ihrem Dyn SQL hinzufügen? Denn wenn Sie sql string ausgeben, können Sie sehen, welches Attribut 87 = attr, aber müssen attribute87 = 'attr' –

Antwort

0

versuchen Sie, Ihre Aussage zu ändern:

lv_dyn_sql := 'UPDATE thirty_days 
       SET attribute86 ='||p_COLUMN_NAME||',attribute87 ='||P_COLUMN_VALUE 
       || 'WHERE SALESREP_ID = :1'; 

zu

lv_dyn_sql := 'UPDATE thirty_days 
       SET attribute86 ='||p_COLUMN_NAME||',attribute87 ='||P_COLUMN_VALUE 
       || 'WHERE SALESREP_ID ='||P_SALESREP_ID; 

und natürlich:

EXECUTE IMMEDIATE lv_dyn_sql; 
0

Warum sind nicht alle drei Parameter? Lassen Sie sich von der Schnur los verbindet:

lv_dyn_sql := q'[UPDATE thirty_days 
        SET attribute86 = :arg1 
         , attribute87 = :arg2 
        WHERE SALESREP_ID = :arg3]'; 

execute immediate lv_dy_sql using p_column_name, p_column_value, p_salesrepid;