如何获取在 Oracle Object Type 中声明的 VARCHAR2 属性的长度,使用 OracleTypeCHAR 元数据,而不管数据库字符集

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/5044312/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-18 22:48:35  来源:igfitidea点击:

How to obtain the length of VARCHAR2 attribute declared in Oracle Object Type, using OracleTypeCHAR metadata, regardless of database character set

javaoraclejdbcplsqlmetadata

提问by morisil

My Java application depends on Oracle Object Types metadata. I use oracle.jdbc.oracore.OracleTypeCHARclass to access these metadata with JDBC. After converting the database to charset AL32UTF8, the OracleTypeCHAR#getLength()method returns results multiplied by factor of 4 comparing to what is declared in Oracle Object Type - for example:

我的 Java 应用程序依赖于 Oracle 对象类型元数据。我使用oracle.jdbc.oracore.OracleTypeCHAR类通过 JDBC 访问这些元数据。将数据库转换为 charset 后AL32UTF8,该OracleTypeCHAR#getLength()方法返回的结果乘以因子 4 与 Oracle 对象类型中声明的相比 - 例如:

some_attribute varchar2(10)

Would result in lenght 40, when lenght 10was returned with the previous charset. Is there a way to obtain the raw value from PL/SQL without parsing OOT source code?

40当 lenght10与前一个字符集一起返回时,将导致 lenght 。有没有办法在不解析 OOT 源代码的情况下从 PL/SQL 获取原始值?

回答by Janek Bogucki

The character length for a character column can be found in user_tab_columns.CHAR_LENGTH,

字符列的字符长度可以在user_tab_columns.CHAR_LENGTH 中找到,

select column_name, comments from all_col_comments where table_name = 'USER_TAB_COLUMNS';

COLUMN_NAME          COMMENTS

TABLE_NAME           Table, view or cluster name
COLUMN_NAME          Column name
DATA_TYPE            Datatype of the column
DATA_TYPE_MOD        Datatype modifier of the column
DATA_TYPE_OWNER      Owner of the datatype of the column
DATA_LENGTH          Length of the column in bytes
DATA_PRECISION       Length: decimal digits (NUMBER) or binary digits (FLOAT)
DATA_SCALE           Digits to right of decimal point in a number
NULLABLE             Does column allow NULL values?
COLUMN_ID            Sequence number of the column as created
DEFAULT_LENGTH       Length of default value for the column
DATA_DEFAULT         Default value for the column
NUM_DISTINCT         The number of distinct values in the column
LOW_VALUE            The low value in the column
HIGH_VALUE           The high value in the column
DENSITY              The density of the column
NUM_NULLS            The number of nulls in the column
NUM_BUCKETS          The number of buckets in histogram for the column
LAST_ANALYZED        The date of the most recent time this column was analyzed
SAMPLE_SIZE          The sample size used in analyzing this column
CHARACTER_SET_NAME   Character set name
CHAR_COL_DECL_LENGTH Declaration length of character type column
GLOBAL_STATS         Are the statistics calculated without merging underlying partitions?
USER_STATS           Were the statistics entered directly by the user?
AVG_COL_LEN          The average length of the column in bytes
CHAR_LENGTH          The maximum length of the column in characters
CHAR_USED            C is maximum length given in characters, B if in bytes
V80_FMT_IMAGE        Is column data in 8.0 image format?
DATA_UPGRADED        Has column data been upgraded to the latest type version format?
HISTOGRAM

Use this query to find the character length of the column,

使用此查询查找列的字符长度,

select
  char_length
from
  user_tab_columns
where
  table_name = 'T' and column_name = 'SOME_ATTRIBUTE';