2013-02-13 148 views
-2

創建視圖時出現錯誤(ORA - 00972:標識符太長)。ORA - 00972:標識符太長

請查看查看語句。

create or replace view ELVW_ATM_REC_HANDOFF_1 
(Rectype 
    ,Recseq 
    ,Record_Type 
    ,Record_Sequence 
    ,MESSAGE_TYPE 
    ,PAN 
    ,PROCESSING_CODE 
    ,TRANSACTION_AMOUNT 
    ,TRANSACTION_CURRENCY_CODE 
    ,SETTLEMENT_AMOUNT 
    ,SETTLEMENT_CURRENCY_CODE 
    ,Billing_AMOUNT 
    ,Billing_CURRENCY_CODE 
    ,Transaction_DATE 
    ,Settlement_Date 
    ,TRACE 
    ,REFERENCE_NUMBER 
    ,Switch_Log_ID 
    ,AUTHORIZATION_NUMBER 
    ,RESPONSE_CODE 
    ,Host_Error_Code 
    ,TERMINAL_ID 
    ,Acceptor_ID 
    ,ACQUIRING_INSTITUTION_CODE 
    ,REV_FLAG 
    ,Original_Trace_Number 
    ,From_Account 
    ,To_Account) 

as 
select * from  


(select 'FT' 
    ,'count' 
    ,'DT' 
    ,rownum 
    ,msg_type 
    ,pan,proc_code 
    ,txn_amt 
    ,txn_ccy_code 
    ,setl_amt 
    ,setl_ccy_code 
    ,bill_amt 
    ,bill_ccy_code 
    ,trans_dt_time 
    ,setl_date 
    ,stan,trn_ref_no 
    ,'iso field 60' 
    ,'isofield 38' 
    ,resp_code 
    ,error_code 
    ,term_id 
    ,'ISOmessage42' 
    ,acq_ins_id 
    ,decode(substr(msg_type,1,1),4,reverse(msg_type),msg_type) 
    ,'ISOfield90' 
    ,from_acc 
    ,to_acc 
    from swtb_txn_log) 

看來在解碼功能發生錯誤。如果我評論它。它的工作正常。請找到下面的代碼

create or replace view ELVW_ATM_REC_HANDOFF_1(Rectype,Recseq,Record_Type,Record_Sequence,MESSAGE_TYPE,PAN,PROCESSING_CODE,TRANSACTION_AMOUNT,TRANSACTION_CURRENCY_CODE,SETTLEMENT_AMOUNT,SETTLEMENT_CURRENCY_CODE,Billing_AMOUNT,Billing_CURRENCY_CODE,Transaction_DATE,/*Transaction_TIME,*/Settlement_Date,TRACE,REFERENCE_NUMBER,Switch_Log_ID,AUTHORIZATION_NUMBER,RESPONSE_CODE,Host_Error_Code,TERMINAL_ID,Acceptor_ID,ACQUIRING_INSTITUTION_CODE,/*REV_FLAG,*/Original_Trace_Number,From_Account,To_Account) as 
select * from (select 'FT','count','DT',rownum,msg_type,pan,proc_code,txn_amt,txn_ccy_code,setl_amt,setl_ccy_code,bill_amt,bill_ccy_code,trans_dt_time,/*trans_dt_time,*/setl_date,stan,trn_ref_no,'iso field 60', 
'isofield 38',resp_code,error_code,term_id,'ISOmessage42',acq_ins_id,/*decode(substr(msg_type,1,1),4,reverse(msg_type),msg_type),*/'ISOfield90',from_acc,to_acc from swtb_txn_log) 

我已經檢查了列名的長度。它少於30個字符。期待您的幫助。

+2

標識符太長?代碼示例太多了。如果你希望人們能夠幫助你,那麼你應該更加努力地設置你的問題的格式,使其可讀。也許如果你已經更清楚地陳述了你的代碼,你將能夠發現問題而不是讓我們發現它。 – APC 2013-02-13 14:08:09

+0

那麼代碼很難閱讀,因爲你有它張貼,但猜測會是,因爲你正在創建一個視圖甲骨文不會自動截斷列名稱,你需要給該列名稱的別名,但這只是一個猜測。 – 2013-02-13 14:22:13

回答

3

嘗試給DECODE函數提供一個別名(短於30個字符)。

實施例:

DECODE(...stuff...) MYALIAS 
+0

這也是我的建議。 – 2013-02-13 14:22:45

+0

嗨,非常感謝。有效。 – user1664548 2013-02-14 04:16:30

+1

@ user1664548如果它解決了您的問題,請接受答案。 – Howie 2013-02-14 07:26:37

1

誠然,所有視圖中的規範的列名的是小於30個字符。

Howver,您認爲包括在線查詢:

select * from (select ... 

這可能是問題。因爲它可能試圖在該中間點處的DECODE()語句的標識符上運行。我說「可能」,因爲我不能在我的10g盒子上重現這一點:爲視圖定義列名解決了ORA​​-01948。

無論如何,只要給DECODE()列一個可接受長度的別名即可解決問題。