创建视图后ORA-01722

时间:2012-08-27 20:42:39

标签: sql oracle view

视图使用:

生成
CREATE OR REPLACE VIEW USER_AUD_VIEW (AUDIT_ID, USER_ID, TABLE_NAME_TXT, COLUMN_NAME_TXT, OLD_VALUE_TXT, NEW_VALUE_TXT, AUDIT_LAST_UPDATED_DT, AUDIT_UPDATED_USER_ID, EVALUATOR_ID, PRODUCT_ID)
AS
SELECT acm.audit_id,
CAST(GET_TOKEN(GET_TOKEN(acm.PRIMARY_KEY_VALUES,1,','),2,':') AS VARCHAR2(64)) AS user_id,
acm.table_name_txt,
CASE WHEN (acm.table_name_txt = 'XREF_USER_PRODUCT')
THEN (mstr_product.product_description_txt || '/' || acm.column_name_txt)
ELSE acm.column_name_txt
END AS column_name_txt,
CASE WHEN UPPER(acm.column_name_txt) = 'PASSWORD_TXT'
THEN '******'
ELSE acm.old_value_txt
END AS old_value_txt,
CASE WHEN UPPER(acm.column_name_txt) = 'PASSWORD_TXT'
THEN '******'
ELSE acm.new_value_txt
END AS new_value_txt,
acm.system_dt,
CASE WHEN UPPER(acm.audit_updated_user_id) = 'UNKNOWN'
 THEN acm.audit_updated_user_id
 ELSE (users.user_id
|| ' ('
|| DECODE(users.last_name_txt, NULL,' ' , users.last_name_txt)
|| ', '
|| DECODE(users.first_name_txt, NULL,' ' , users.first_name_txt)
|| ')' )
END AS audit_updated_user_id,
acm.evaluator_id,
CASE WHEN UPPER(acm.table_name_txt) = 'XREF_USER_PRODUCT'
 THEN TO_NUMBER(trim(GET_TOKEN(GET_TOKEN(acm.PRIMARY_KEY_VALUES,2,','),2,':')))
 ELSE 0
END AS product_id
FROM audit_config_maintenance acm,
users,
mstr_product
WHERE acm.table_name_txt in ('USERS','XREF_USER_PRODUCT','XREF_USER_FUNCTION')
AND UPPER(acm.audit_updated_user_id) = UPPER(users.user_id)
AND CASE WHEN UPPER(acm.table_name_txt) = 'XREF_USER_PRODUCT'
     THEN     TO_NUMBER(trim(GET_TOKEN(GET_TOKEN(acm.PRIMARY_KEY_VALUES,2,','),2,':')))
     ELSE -1
END = mstr_product.product_id
AND acm.primary_key_values is not null
/

当我做desc USER_AUD_VIEW时,我得到了

Name      Null?             Type
AUDIT_ID    NOT NULL        NUMBER
USER_ID                 VARCHAR2(64)
TABLE_NAME_TXT          VARCHAR2(30)
COLUMN_NAME_TXT         VARCHAR2(81)
OLD_VALUE_TXT           VARCHAR2(64)
NEW_VALUE_TXT           VARCHAR2(64)
AUDIT_LAST_UPDATED_DT   DATE
AUDIT_UPDATED_USER_ID   VARCHAR2(71)
EVALUATOR_ID            NUMBER
PRODUCT_ID              NUMBER

然而,当我从USER_AUD_VIEW中选择*时,我得到了

ORA-01722:无效号码

我是否在创建视图时出错?

1 个答案:

答案 0 :(得分:1)

SQL> select TO_NUMBER('1AB234') from dual;

ORA-01722: invalid number
01722. 00000 -  "invalid number"
*Cause:    
*Action:

SQL> select TO_NUMBER('1234') from dual;
TO_NUMBER('1234')
-----------------
         1234 

当您在视图上发出select时,该视图会执行view代码中的select。它更像是再次编写整个大select,而只是在视图上运行select - 这意味着,视图上的desc很好,但是{{1}中的数据当您对字段值(字母数字)进行select转换时,创建视图会导致问题。 TO_NUMBER要求TO_NUMBER(val)只是数字(字符形式),任何字母(A-Z,a-z)或val中的任何特殊字符都会导致val

所以这是一个无赖,但是等等!我们可以对此做些什么,只从字段中获取数字并忽略其中的任何字母或特殊字符。

ORA-01722

警告 - 上述解决方案可能对十进制数字不太友好。但要提出一个整体的想法。

所以SQL> select to_number(regexp_replace('1!@#2Aa33-*^4','[^[:digit:]]')) from dual; VAL ------ 12334 - 你的救援人员就像下面的那样(假设regexp效果很好) -

GET_TOKEN