c# - ORA-06502: PL/SQL: numeric or value error with stored procedure and ASP.NET MVC -
i trying insert data oracle database asp.net mvc application. using stored procedure so, error:
ora-06502: pl/sql: numeric or value error: character string buffer small ora-06512: @ "c##aet.kategorija_pkg", line 40 ora-06502: pl/sql: numeric or value error: character string buffer small ora-06512: @ line 1
procedure code is:
procedure ins_kategorija ( p_naziv in kategorija.naziv%type, p_kategorija_id out kategorija.kategorija_id%type, p_rezultat out number, p_poruka out varchar2 ) begin p_rezultat := 1; select kategorija_seq.nextval p_kategorija_id dual; insert kategorija values (p_kategorija_id, p_naziv); p_rezultat := 0; p_poruka := 'db: kategorija uspesno uneta.'; exception when others p_rezultat := 1; p_poruka := 'db: ' ||sqlcode|| ' - ' ||sqlerrm; end ins_kategorija;
and method calling it:
list<oracleparameter> izvrsitransakciju(string nazivprocedure, list<oracleparameter> parametri, oracletransaction transakcija) { try { using (oraclecommand komanda = new oraclecommand(nazivprocedure, konekcija)) { komanda.transaction = transakcija; komanda.commandtype = commandtype.storedprocedure; komanda.bindbyname = true; list<oracleparameter> izlazniparametri = new list<oracleparameter>(); foreach (oracleparameter p in parametri) { komanda.parameters.add(p); if (p.direction != parameterdirection.input) izlazniparametri.add(p); } komanda.executenonquery(); return izlazniparametri; } } catch (exception ex) { throw new exception("greška pri izvršavanju transakcije: " + ex.message); } }
the methods communicates database are:
public list<oracleparameter> pokrenitransakciju(string nazivprocedure, list<oracleparameter> parametri) { try { list<oracleparameter> listaparametara; using (konekcija) { konekcija.open(); using (oracletransaction transakcija = konekcija.begintransaction()) { listaparametara = izvrsitransakciju(nazivprocedure, parametri, transakcija); int rezultat = convert.toint32(listaparametara.firstordefault(x => x.parametername == "p_rezultat")); if (rezultat != 0) transakcija.rollback(); else transakcija.commit(); return listaparametara; } } } catch (exception ex) { throw ex; } } list<oracleparameter> izvrsitransakciju(string nazivprocedure, list<oracleparameter> parametri, oracletransaction transakcija) { try { using (oraclecommand komanda = new oraclecommand(nazivprocedure, konekcija)) { komanda.transaction = transakcija; komanda.commandtype = commandtype.storedprocedure; komanda.bindbyname = true; list<oracleparameter> izlazniparametri = new list<oracleparameter>(); foreach (oracleparameter p in parametri) { komanda.parameters.add(p); if (p.direction != parameterdirection.input) izlazniparametri.add(p); } komanda.executenonquery(); return izlazniparametri; } } catch (exception ex) { throw new exception("greška pri izvršavanju transakcije: " + ex.message); } } public oracleparameter napraviparametar(string naziv, object vrednost, oracledbtype? tip, parameterdirection pravac) { oracleparameter param = new oracleparameter(); param.parametername = naziv; param.direction = pravac; if (tip != null) param.oracledbtype = (oracledbtype)tip; dodajvrednost(param, vrednost); return param; } void dodajvrednost(oracleparameter param, object vrednost) { if (vrednost == null) return; if (vrednost int) param.value = (int)vrednost; else if (vrednost decimal) param.value = (decimal)vrednost; else if (vrednost string) param.value = (string)vrednost; else if (vrednost datetime) param.value = (datetime)vrednost; }
any ideas? thank in advance!
[solution] appreciated assistance laudec, figured out 1 must specify size
attribute of oracleparameter
object when defining varchar2
parameters. added that, , problem solved.
apparently, comes variable affected p_poruka
out parameter when calling ins_kategorija
procedure small store message trying put in ( based on discussion in comments ).
if called ins_kategorija inside package, have understood behavious :
declare poruka varchar2(10); kategorija_id number; rezulta number; begin ins_kategorija('test',kategorija_id,rezulta,poruka); end;
this raise mentionned error message. didn't expect when calling outside. ( code calls directly ins_kategorija
or call procedure package calls ins_kategorija
? )
i guess have change code in caller of pokrenitransakciju
, 1 defines out variable(and size) used call procedure
edit : reasons following based on op's comment :
when 1 defines oracleparameter of varchar2 type, oracleparameter.size required (it seems set 0 if isn't manually set).
Comments
Post a Comment