查找带引号的对象

时间:2013-11-26 14:18:23

标签: sql oracle

ORACLE对象可以像“Last Name”一样命名。问题是:如何找到这些对象?表,列等

表user_tab_columns未找到指示此列是此类对象的标志未指定。

不要踢我,我不太懂英语。

enter image description here

我需要找到列,类似于图中所示的列,列出所有列。

5 个答案:

答案 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';