2015-02-05 34 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

相关问题