您好,登錄后才能下訂單哦!
一、問題描述:
寫了一個存儲過程(只取了半截,能說明命題即可)
CREATE OR REPLACE PROCEDURE "MONTH_RPT_CENTER_STU_DATA_PROC" (centerIds in VARCHAR2) AS mlockdate date; BEGIN /* 創建人:fengcl 創建時間:2018.1.23 更新人: 更新時間: 參數:中心編號(字符串類型) 功能:調用時,先從中間表刪除指定中心的數據,再重新查詢插入指定中心的數據到中間表 */ --獲取月報鎖定日期 select trunc(sysdate,'mm')+to_number( name) into mlockdate from mdm_dic_option where code='monthReportDate' and dic_code='system_set_001'; if mlockdate<trunc(sysdate) then delete from rpt_month_stu_data where RPT_DATE>=add_months(trunc(sysdate,'mm'),-1) and RPT_DATE<trunc(sysdate,'mm') and CENTER_ID in (centerIds); commit;
在調用這個存儲過程的時候,如果參數centerIds只有一個數字,例如:1 可以正常執行,但是如果有多個數字的話,例如:1,2,3,4,5 就回報如下錯誤,
Procedure execution failed
ORA-01722: 無效數字
ORA-06512: 在 "CRM3TEST.MONTH_RPT_CENTER_STU_DATA_PROC", line 17
ORA-06512: 在 line 1
查詢時間: 0.029s
二、解決過程
通過百度發現,存儲過程把這個參數作為了一個整體來處理了,并不象普通的sql一樣,把他作為一個數組來對待
三、解決方案
百度了一下,發現網上方案挺多,但是我選擇了以下的方案,就是自定義一個函數,對這個參數進行處理。
步驟一、新建一個oracle變量:(普通的sql查詢窗口既可以創建)
CREATE OR REPLACE TYPE strsplit_type IS TABLE OF VARCHAR2 (4000)
步驟二、新建一個函數(這個函數是網上現成的,親測可用)
CREATE OR REPLACE function strsplit(p_value varchar2, p_split varchar2 := ',') return strsplit_type pipelined is v_idx integer; v_str varchar2(500); v_strs_last varchar2(4000) := p_value; begin loop v_idx := instr(v_strs_last, p_split); exit when v_idx = 0; v_str := substr(v_strs_last, 1, v_idx - 1); v_strs_last := substr(v_strs_last, v_idx + 1); pipe row(v_str); end loop; pipe row(v_strs_last); return; end strsplit;
步驟三、改造存儲過程(將原先的 in (centerIds) 更改為: in (select * from table (strsplit(centerIds))) )
CREATE OR REPLACE PROCEDURE "MONTH_RPT_CENTER_STU_DATA_PROC" (centerIds in VARCHAR2) AS mlockdate date; BEGIN /* 創建人:fengcl 創建時間:2018.1.23 更新人: 更新時間: 參數:中心編號(字符串類型) 功能:調用時,先從中間表刪除指定中心的數據,再重新查詢插入指定中心的數據到中間表 */ --獲取月報鎖定日期 select trunc(sysdate,'mm')+to_number( name) into mlockdate from mdm_dic_option where code='monthReportDate' and dic_code='system_set_001'; if mlockdate<trunc(sysdate) then delete from rpt_month_stu_data where RPT_DATE>=add_months(trunc(sysdate,'mm'),-1) and RPT_DATE<trunc(sysdate,'mm') and CENTER_ID in (select * from table(strsplit(centerIds))); commit;
到此,問題解決。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。