天天看點

oracle存儲過程無效字元_存儲過程執行報無效數字解決方法

存儲過程執行報無效數字

存儲過程

CREATE OR REPLACE PROCEDURE UpdatePiecesChn(pieceidStr  in varchar2,

updateChnid in NUMBER,

fromChnid   in number) is

begin

delete from sc_st_chn_ps

where pieceid in (select pieceid

from sc_st_chn_ps

where chnid = updateChnid

and pieceid in (pieceidStr))

and chnid = fromChnid;

update sc_st_chn_ps

set chnid = updateChnid

where pieceid in (pieceidStr)

and chnid = fromChnid;

commit;

end UpdatePiecesChn;

然後調用

exec UpdatePiecesChn('1555,1557,1560,1576,1577,1578,1547,1561,1573,1574,1586,1588,1590,1592,1593,1663,1664,2675,2676,2679,2681,2682,2683,2705,2708,2709,3722,3682,3723,5330,5331,5332,5563',504,198);

會報錯誤,錯誤提示資訊:ORA-01722: 無效數字

我大概也知道原因是 in後面pieceidStr對應的值不合法

正确的應該是

delete from sc_st_chn_ps

where pieceid in (select pieceid

from sc_st_chn_ps

where chnid = updateChnid

and pieceid in (1555,1557,1560,1576,1577,1578,1547,1561,1573,1574,1586,1588,1590,1592,1593,1663,1664,2675,2676,2679,2681,2682,2683,2705,2708,2709,3722,3682,3723,5330,5331,5332,5563))

而我這邊變為了

delete from sc_st_chn_ps

where pieceid in (select pieceid

from sc_st_chn_ps

where chnid = updateChnid

and pieceid in (‘1555,1557,1560,1576,1577,1578,1547,1561,1573,1574,1586,1588,1590,1592,1593,1663,1664,2675,2676,2679,2681,2682,2683,2705,2708,2709,3722,3682,3723,5330,5331,5332,5563’))

請問這個該怎麼改? 這一串字元是前台傳過來的,謝謝

------解決思路----------------------

這種的用動态拼裝sql

CREATE OR REPLACE PROCEDURE UpdatePiecesChn(pieceidStr  in varchar2,

updateChnid in NUMBER,

fromChnid   in number) is

v_del_sql varchar2(100);

v_upd_sql varchar2(100);

begin

v_del_sql:='delete from sc_st_chn_ps where pieceid in (select pieceid  from sc_st_chn_ps where chnid = updateChnid and pieceid in ('

------解決思路----------------------

pieceidStr

------解決思路----------------------

')) and chnid = fromChnid';

v_upd_sql:='update sc_st_chn_ps set chnid = updateChnid  where pieceid in ('

------解決思路----------------------

pieceidStr

------解決思路----------------------

')  and chnid = fromChnid';

execute immediate v_del_sql;

execute immediate v_upd_sql;

commit;

end UpdatePiecesChn;

------解決思路----------------------

-- 這個出錯了,系統 會把 pieceidStr 當做一個數值來看,是一個數值,而不是多個。

where pieceid in (pieceidStr)

-- 采用樓上的動态語句是一個方法,也可以使用 instr 函數,但是存在一個隐式轉化

where instr(  ','

------解決思路----------------------

pieceidStr

------解決思路----------------------

',' ,  ','

------解決思路----------------------

piecdeid

------解決思路----------------------

',') > 0

------解決思路----------------------

引用:這種的用動态拼裝sql

CREATE OR REPLACE PROCEDURE UpdatePiecesChn(pieceidStr  in varchar2,

updateChnid in NUMBER,

fromChnid   in number) is

v_del_sql varchar2(100);

v_upd_sql varchar2(100);

begin

v_del_sql:='delete from sc_st_chn_ps where pieceid in (select pieceid  from sc_st_chn_ps where chnid = updateChnid and pieceid in ('

------解決思路----------------------

pieceidStr

------解決思路----------------------

')) and chnid = fromChnid';

v_upd_sql:='update sc_st_chn_ps set chnid = updateChnid  where pieceid in ('

------解決思路----------------------

pieceidStr

------解決思路----------------------

')  and chnid = fromChnid';

execute immediate v_del_sql;

execute immediate v_upd_sql;

commit;

end UpdatePiecesChn;

oracle存儲過程無效字元_存儲過程執行報無效數字解決方法