是否可以概述CTE?

时间:2016-12-20 13:56:10

标签: sql oracle

在sql developer中我可以做到

desc table

并获取

describe table
Name                   Null Type          
---------------------- ---- ------------- 
DATE_TIME                    DATE          
KEY                          VARCHAR2(11)  

CTE可能会出现这种情况吗?例如,如果表中有10列,我将获得所有列的描述。但如果我只想要2列的描述怎么办呢。

with alias as (select col1, col2 from table) desc alias

这不起作用。

3 个答案:

答案 0 :(得分:2)

你可以应用一招:

CREATE VIEW dummy AS
WITH ..
SELECT ..

然后:

DESC dummy

答案 1 :(得分:1)

不,你不能这样做。

CTE不存储在系统目录中的任何位置。它与派生表基本相同:

with alias as (select col1, col2 from table) 
select * from alias

相同
select * 
from ( select col1, col2 from table) alias

你也不能describe派生表。

你可以做远程相似的唯一方法是从CTE中选择,但选择不是行的where条件。

with alias as (select col1, col2 from table) 
select * from alias
where 0 = 42;

然后你至少会看到列名和数据类型(具体取决于你使用的SQL客户端)

答案 2 :(得分:0)

您可以在不创建视图的情况下执行此操作,其中包含更复杂的内容:

create table yourTable(
DATE_TIME                    DATE,          
KEY                          VARCHAR2(11)
);

您可以使用DBMS_SQL来描述select查询的列:

SQL> DECLARE
  2    l_Cursor        INTEGER DEFAULT dbms_sql.open_cursor;
  3    l_Stmt          VARCHAR2(4000);
  4    l_colCnt        NUMBER DEFAULT 0;
  5    l_descTbl       dbms_sql.desc_tab;
  6  BEGIN
  7    dbms_sql.parse(l_Cursor, 'SELECT key FROM yourTable', dbms_sql.native);
  8    dbms_sql.describe_columns(l_Cursor, l_colCnt, l_descTbl);
  9    --
 10    FOR i IN 1..l_colCnt LOOP
 11        dbms_output.put_line('Column '||l_descTbl(i).col_name || ' - type '||l_descTbl(i).col_type);
 12    END LOOP;
 13    --
 14    dbms_sql.close_cursor(l_Cursor);
 15  END;
 16  /
Column KEY - type 1

PL/SQL procedure successfully completed.

结果必须由此表解释:

Datatype    Number
VARCHAR2    1
NVARCHAR2   1
NUMBER      2
INTEGER     2
LONG        8
ROWID       11
DATE        12
RAW         23
LONG RAW    24
CHAR        96
NCHAR       96
MLSLABEL    106

因此,它表示列KEY的类型为1,即VARCHAR2。 就像你可以获得更多信息一样,例如大小。