2015-11-13 30 views
-4

獲取下面的錯誤,而在12C甲骨文執行,但它工作正常時,它是在Oracle 10.2.0.4:程序失敗,原因是ORA-00920:無效的關係運算符

程序proc_up_dts_product_cat_dynsql失敗,原因是ORA-00920:無效 關係運算符 下面是該過程:

CREATE OR REPLACE PROCEDURE SEAPROB.proc_up_dts_product_cat_dynsql(tablename IN varchar) 
AS 
dynamicsql varchar(8000); 
ID int; 
DTS_Segment_op varchar2(10); 
DTS_Segment varchar2(15); 
DTS_Segment_where varchar2(255); 
DateEntered_op varchar2(10); 
DateEntered varchar2(30); 
DateEntered_where varchar2(255); 
Svc_Name_op varchar2(10); 
Svc_Name varchar2(100); 
Svc_Name_where varchar2(255); 
Product_Category varchar2(75); 
Priority int; 
combined_status_where varchar2(255); 
refdate date ; 
CURSOR PrivCursor 
IS 
SELECT 
ID, 
DTS_Segment_op, 
Nvl(upper(trim(DTS_Segment)),' '), 
DateEntered_op, 
CASE WHEN dateentered='%' THEN dateentered 
    WHEN dateentered LIKE '%/%/____' THEN To_Char(To_Date(dateentered,'MM/DD/YYYY'),'YYYY-MM-DD') 
    WHEN dateentered LIKE '%/%/__' THEN To_Char(To_Date(dateentered,'MM/DD/YY'),'YYYY-MM-DD') 
    WHEN dateentered LIKE '''%/%/%'' % ''%/%/%''' THEN ''''||To_Char(To_Date(SubStr(dateentered,InStr(dateentered,'''',1,1)+1,InStr(dateentered,'''',1,2)-InStr(dateentered,'''',1,1)-1),'MM/DD/YY'),'YYYY-MM-DD')||''' and '''||To_Char(To_Date(SubStr(dateentered,InStr(dateentered,'''',1,3)+1,InStr(dateentered,'''',1,4)-InStr(dateentered,'''',1,3)-1),'MM/DD/YY'),'YYYY-MM-DD')||'''' 
    ELSE dateentered END AS dateentered, 
Svc_Name_op, 
Nvl(upper(trim(Svc_Name)),' '), 
Product_Category, 
Priority 
FROM tbl_dts_pt_lookup order by priority desc; 


BEGIN 
refdate := ADD_MONTHS(to_date(SYSDATE,'dd-mon-yy'),-6) ; 

OPEN PrivCursor; 
-- Loop through all the rows in the tbl_dts_category_lookup table 
FETCH PrivCursor 
INTO 
ID, 
DTS_Segment_op, 
DTS_Segment, 
DateEntered_op, 
DateEntered, 
Svc_Name_op, 
Svc_Name, 
Product_Category, 
Priority; 

WHILE PrivCursor%found 

LOOP 
-- Create dynamic SQL 
--define case statements for where clause components 
combined_status_where := ' where (DTS_Cm_DisputeStatus <>'|| '''C''' || ' OR (DTS_Cm_DisputeStatus='|| '''C''' || ' AND DTS_CM_CLOSEDATE >= '''||refdate||'''))' ; 
dts_segment_where := case when dts_segment='%' then ' and 1=1' else ' and NVL(trim(Replace(Upper(segment),chr(0),''' || ''')),''' || ' '') ' || dts_segment_op || ' ''' || dts_segment || '''' end; 
svc_name_where := case when svc_name='%' then ' and 1=1' else ' and NVL(trim(Replace(Upper(dts_cm_servicename),chr(0),''' || ''')),''' || ' '') ' || svc_name_op || ' ''' || svc_name || '''' end ; 
dateentered_where := case when dateentered='%' then ' and 1=1' 
           when dateentered_op='between' then ' and TO_CHAR(dts_cm_dateentered,''YYYY-MM-DD'') between ' || dateentered 
           else ' and TO_CHAR(dts_cm_dateentered,''YYYY-MM-DD'') ' || dateentered_op || ' ''' || dateentered || '''' end ; 

dynamicsql := 'update '||tablename||' set product_cat_id=' || cast(id as varchar) ||', product_category =''' || product_category || ''''; 
--add where clause 
dynamicsql := dynamicsql || combined_status_where || dts_segment_where || dateentered_where || svc_name_where; 

EXECUTE IMMEDIATE dynamicsql; 
COMMIT; 

FETCH PrivCursor 
INTO 
ID, 
DTS_Segment_op, 
DTS_Segment, 
DateEntered_op, 
DateEntered, 
Svc_Name_op, 
Svc_Name, 
Product_Category, 
Priority; 

END LOOP; 
CLOSE PrivCursor; 


EXCEPTION 
    WHEN OTHERS THEN 
    DBMS_OUTPUT.PUT_LINE('Procedure proc_up_dts_product_cat_dynsql failed due to '||SQLERRM); 
END proc_up_dts_product_cat_dynsql; 
/
+1

'EXCEPTION 何時其他人DBMS_OUTPUT.PUT_LINE **首先,從你的代碼**中刪除這個bug。然後使用'SHOW ERRORS'來獲得完整的錯誤堆棧和準確的行號。如果它是運行時錯誤,則複製粘貼SQL * Plus會話並編輯您的問題以添加詳細信息。 –

+0

@LalitKumarB爲什麼要考慮'EXCEPTION當其他人這麼.. ..是一個錯誤? – Moudiz

+1

@Moudiz只是谷歌'當其他人甲骨文錯誤。否則,請閱讀我的文章,[**當其他人 - 一個bug **](http://lalitkumarb.com/2014/05/02/when-others-then-null-a-bug/)一些其他有用的文章http ://www.orafaq.com/wiki/WHEN_OTHERS和這一由** Thomas Kyte ** http://tkyte.blogspot.in/2012/05/pokemon-and-when-others.html並且這也是https: //asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:1155066278457底線「**其他人幾乎總是一個BUG,除非緊跟着一個RAISE。* *「 –

回答

3

數據庫擲出ORA-00920: invalid relational operator當我們在WHERE子句中提交一個SQL語句和語法錯誤。通常這是一個錯字。這在動態SQL中非常容易實現,因爲除了運行時我們看不到整個語句。

您尚未發佈生成的更新語句。那麼你不能,因爲你的異常處理不顯示它。臨提示:使用動態SQL 工作時,隨時登錄或顯示生成的語句,在異常塊如果無處:

dbms_output.put_line('generated statement:'|| dynamicsql); 

所以這只是一種猜測,但此行看起來可疑......

when dateentered_op='between' then ' and TO_CHAR(dts_cm_dateentered,''YYYY-MM-DD'') between ' || dateentered 

...因爲它似乎會生成一個沒有AND子句的BETWEEN語句。 BETWEEN運算符需要兩個邊界。

但它可能是很多事情。您可能正在運行一個不尋常的參數組合,這會生成無效的聲明。你需要更好的日誌。