【问题标题】:Changing the column precision while creating a view in Oracle在 Oracle 中创建视图时更改列精度
【发布时间】:2012-05-11 18:51:06
【问题描述】:
 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,
GET_TOKEN(GET_TOKEN(acm.PRIMARY_KEY_VALUES,1,','),2,':') AS user_id,
acm.table_name_txt,
acm.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.audit_last_updated_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_uupdated_user_id,
acm.evaluator_id,
TO_NUMBER(GET_TOKEN(GET_TOKEN(acm.PRIMARY_KEY_VALUES,2,','),2,':')) AS product_id

   FROM audit_config_maintenance acm,
users
   WHERE acm.table_name_txt             in ('USERS','XREF_USER_PRODUCT')
   AND UPPER(acm.audit_updated_user_id) = UPPER(users.user_id)
   AND acm.primary_key_values is not null

在创建上述视图时,get_token() 函数将列类型设为 varchar2(4000)。如何更改命令以使该字段成为 varchar2(64) ?

【问题讨论】:

    标签: oracle view precision varchar


    【解决方案1】:

    你可以使用CAST函数,即CAST( GET_TOKEN(GET_TOKEN(acm.PRIMARY_KEY_VALUES,1,','),2,':') AS VARCHAR2(64)

    如果你创建一个函数

    SQL> create or replace function my_function
      2    return varchar2
      3  is
      4  begin
      5    return 'foo';
      6  end;
      7  /
    
    Function created.
    

    然后选择此函数的简单视图将具有VARCHAR2(4000) 数据类型。

    SQL> create or replace view v1 as select my_function col1 from dual;
    
    View created.
    
    SQL> desc v1;
     Name                                      Null?    Type
     ----------------------------------------- -------- ----------------------------
     COL1                                               VARCHAR2(4000)
    

    但是,如果您将调用包装在 CAST 中,长度会发生变化

    SQL> ed
    Wrote file afiedt.buf
    
      1  create or replace view v2
      2  as
      3  select cast( my_function as varchar2(10) ) col1
      4*   from dual
    SQL> /
    
    View created.
    
    SQL> desc v2;
     Name                                      Null?    Type
     ----------------------------------------- -------- ----------------------------
     COL1                                               VARCHAR2(10)
    

    【讨论】:

      【解决方案2】:

      使用强制转换功能。在这种情况下,用 cast 包裹 get_toklen

       CAST(GET_TOKEN(GET_TOKEN(acm.PRIMARY_KEY_VALUES,1,','),2,':') as varchar2(64)) AS user_id
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-10
        • 1970-01-01
        • 1970-01-01
        • 2022-11-18
        • 1970-01-01
        相关资源
        最近更新 更多