ORACLE对象可以像“Last Name”一样命名。问题是:如何找到这些对象?表,列等
表user_tab_columns未找到指示此列是此类对象的标志未指定。
不要踢我,我不太懂英语。
我需要找到列,类似于图中所示的列,列出所有列。
答案 0 :(得分:2)
引用:
ORACLE对象可以像“Last Name”一样命名。问题是:如何找到这些对象?
默认情况下,Oracle始终以大写形式存储对象名称。因此,为了找到引用的对象名称(应该注意那些双引号不会出现在数据字典中),我们只需要识别名称中至少有一个小写字母字符的对象。
应该注意的是,这种方法没有考虑引用的表名可能是大写的{oracle保留字(例如TABLE
)这一事实。你不能创建名为TABLE
的表,除非您将TABLE
括在双引号中
/* There were no quoted identifiers created */
SQL> select t.table_name
2 from user_tables t
3 where regexp_like(t.table_name, '[[:lower:]]');
no rows selected
/* create table with quoted name */
SQL> create table "Table_Name"(
2 col number
3 );
Table created.
/* search for quoted table names */
SQL> column table_name format a30
SQL> select t.table_name
2 from user_tables t
3 where regexp_like(t.table_name, '[[:lower:]]');
TABLE_NAME
------------------------------
Table_Name
如果表名中包含非法标点符号,则可以通过添加思考表名可能包含的标点符号来扩展搜索模式。例如,[[:lower:]\.*:]
。
SQL> select t.table_name
2 from user_tables t
3 where regexp_like(t.table_name, '[[:lower:]\.*:]');
TABLE_NAME
-------------------
.TABLE
.table
TABLE_NAMe
Table_Name
na:me\
name*
name\
table
8 rows selected.
注意:Oracle不区分常规(未引用)标识符和带引号的标识符(大写)。也就是说,table_name
和"TABLE_NAME"
是相同的,后者不会被视为带引号的标识符。
答案 1 :(得分:0)
您可以使用regexp_instr
搜索除数字,字符和下划线以外的符号。
表,程序,类型等:
SELECT
owner,
object_name,
object_type
FROM
all_objects
WHERE
regexp_instr(object_name, '[^_0-9a-zA-z]') > 0
AND owner IN ('HR')
;
输出:
OWNER OBJECT_NAME OBJECT_TYPE ----------- ------------------------------ ---------------- HR TYPE HR !@#$%^&*( PROCEDURE HR BIN$6YKZr90lXr7gQAB/AQAVOA==$0 TABLE PARTITION HR DR$NAME_INDEX$I TABLE HR DR$NAME_INDEX$K TABLE HR DR$NAME_INDEX$N TABLE HR DR$NAME_INDEX$R TABLE HR DR$NAME_INDEX$X INDEX HR SYS_LOB0000114402C00001$$ LOB HR SYS_LOB0000114402C00002$$ LOB HR SYS_LOB0000114428C00006$$ LOB HR SYS_LOB0000114433C00002$$ LOB HR SYS_LOB0000115263C00022$$ LOB HR SYS_LOB0000115263C00023$$ LOB HR SYS_LOB0000115717C00002$$ LOB HR SYS_LOB0000115729C00001$$ LOB HR table with spaces TABLE
如您所见,其他一些对象也进入了结果集。
列:
SELECT
owner,
table_name,
column_name
FROM
all_tab_cols
WHERE
regexp_instr(column_name, '[^_0-9a-zA-z]') > 0
AND owner IN ('HR')
;
输出:
OWNER TABLE_NAME COLUMN_NAME ------------ ---------------------- ------------------ HR CN_PLOT_OVERLAP SYS_NC00023$ HR CN_PLOT_OVERLAP SYS_NC00022$ HR CN_PLOT_OVERLAP SYS_NC00021$ HR CN_PLOT_OVERLAP SYS_NC00020$ HR CN_PLOT_OVERLAP SYS_NC00019$ HR CN_PLOT_OVERLAP SYS_NC00018$ HR CN_PLOT_OVERLAP SYS_NC00017$ HR table with spaces @monkey_column
我仅在HR
架构中搜索了对象 - 您可以根据需要进行更改。此外,如果要查找特定字符,请更改正则表达式 - 而不是:
regexp_instr(column_name, '[^_0-9a-zA-z]') > 0
要查找,例如!@#
和space
,请使用:
regexp_instr(column_name, '[ !@#]') > 0
(注意在开头没有^
标志 - 这意味着“除了...之外的所有其他内容”)
答案 2 :(得分:0)
名称带双引号的表的列表:
请参阅答案Nicholas Krasnov。
名称带双引号的列列表:
select * from user_tab_columns a
where REGEXP_LIKE(a.column_name, '[^A-Za-z0-9_]|(PRIOR)|(COMMENT)|(NUMBER)|(DATE)|(VARCHAR)|(CHAR)|(SYS)')
答案 3 :(得分:-1)
我不太懂,但据我所知
您可以使用像;
这样的系统表select * from all_tables
select * from all_columns
或
select * from user_tables
select * from user_columns
答案 4 :(得分:-1)
查看" all_columns"据我所知不存在(至少在Oracle 11.1之前),试试
SELECT owner, table_name, column_name FROM all_tab_cols WHERE column_name = 'Last Name';