2015-02-05 63 views
0

我有一個過程用另一個表中的數據更新我的客戶端。而有些客戶不會因其某個價值的失敗而更新。如何在過程更新之前測試一個值plsql

這是拋出的錯誤:ORA - 12899:對於「TABLE_EXAMPLE」「BRANCH_CODE」(當前值:3,最大值:2)列值太大。

而現在這是程序:

PROCEDURE p_update_customers AS 

CURSOR customer_data IS 
    SELECT a.code_cust code_cust, 
     '0' || a.branch_code branch_code, 
     a.costumer_id, 
     a.name name, 
     b.description 
    FROM customer a, description b 
    WHERE a.costumer_id = b.costumer_id; 

reg_customer_data customer_data%ROWTYPE; 

BEGIN 
BEGIN 
    OPEN customer_data; 
    LOOP 
    FETCH customer_data 
     INTO reg_customer_data; 
    EXIT WHEN customer_data%NOTFOUND; 
    BEGIN 

我想在這個部分我有使用IF或CASE語句來測試分支代碼。我只需要該值的最後兩位數字。 (在BEGIN和UPDATE之間)。因此,我需要在更新之前測試branch_code,因爲我只需要最後兩位數字(09或58)。

costumer_id name  branch_code 
    1   jose  09 
    2   peter  09 
    3   jhon  09 
    4   charlie 058 

如果branch_code有3個數字,刪除第一個數字並傳遞2位數值,稍後繼續更新。

注意:我不能更改或刪除我在遊標中使用的concat:CUSTOMER_DATA,因爲TABLE_EXAMPLE上的BRANCH_CODE它必須是兩位數。

回答

1

如果你不能改變光標,你仍然可以使用負的位置值與the substr() function從字符串的末尾向後計數,作爲編吉布斯顯示,而是針對光標結果集:

with t as (
    select 1 as costumer_id, 'jose' as name, '09' as branch_code from dual 
    union all select 2, 'peter ', '09' from dual 
    union all select 3, 'jhon', '09' from dual 
    union all select 4, 'charlie', '058' from dual 
) 
select costumer_id, name, branch_code, 
    substr(branch_code, -2) as new_branch_code 
from t; 

| COSTUMER_ID | NAME | BRANCH_CODE | NEW_BRANCH_CODE | 
|-------------|---------|-------------|-----------------| 
|   1 | jose |   09 |    09 | 
|   2 | peter |   09 |    09 | 
|   3 | jhon |   09 |    09 | 
|   4 | charlie |   058 |    58 | 

SQL Fiddle

所以,你可以改變你的更新使用相同的呼叫設定值:

UPDATE table_example 
     SET code_cust  = reg_customer_data.code_cust, 
      branch_code = substr(reg_customer_data.branch_code, -2), 
... 
2

替換​​與之一的基礎上,customer.branch_code數據類型如下...

  • 如果它的數字:

    TO_CHAR(a.branch_code, 'FM00') branch_code 
    
  • 如果它是VARCHAR/VARCHAR2:

    SUBSTR('0' || a.branch_code, -2, 2) branch_code 
    

附錄:OP指出,光標不能改變,因此該解決方案需要被轉移到更新:

UPDATE table_example 
    SET code_cust  = reg_customer_data.code_cust, 
     branch_code = SUBSTR(reg_customer_data.branch_code, -2, 2), 
     costumer_id = reg_customer_data.costumer_id, 
     name   = reg_customer_data.name, 
     description = reg_customer_data.description 
    WHERE code_cust  = reg_customer_data.code_cust; 
+0

感謝你的幫助,但斜面觸摸CUSTOMER_DATA光標。 – spikeTJ 2015-02-05 20:06:05

+1

@harsd - 查看我答案的附錄,它改變了'UPDATE'並且保持光標不變;希望對你有效。 – 2015-02-05 23:28:58

相關問題