我可以使用select语句获取我选择的每列的数据类型而不是值吗?
例如:
SELECT a.name, a.surname, b.ordernum
FROM customer a
JOIN orders b
ON a.id = b.id
,结果应该是这样的
name | NVARCHAR(100)
surname | NVARCHAR(100)
ordernum| INTEGER
或者它可以像这样排成一行,但并不重要:
name | surname | ordernum
NVARCHAR(100) | NVARCHAR(100) | INTEGER
由于
答案 0 :(得分:13)
您可以查询数据库中的all_tab_columns
视图。
SELECT table_name, column_name, data_type, data_length FROM all_tab_columns where table_name = 'CUSTOMER'
答案 1 :(得分:9)
我使用DUMP()
SELECT DUMP(A.NAME),
DUMP(A.surname),
DUMP(B.ordernum)
FROM customer A
JOIN orders B
ON A.id = B.id
它会返回类似的内容:
每栏 'Typ=1 Len=2: 0,48'
。
Type=1
表示VARCHAR2/NVARCHAR2
Type=2
表示NUMBER/FLOAT
Type=12
表示DATE
等。
您可以参考此oracle doc获取信息Datatype Code
或者这是一个简单的映射Oracle Type Code Mappings
答案 2 :(得分:3)
我遇到了同样的情况。作为一种解决方法,我刚刚创建了一个view
(如果你有权限)并描述它并稍后删除它。 :)
答案 3 :(得分:3)
我通常创建一个视图并使用DESC
命令:
CREATE VIEW tmp_view AS
SELECT
a.name
, a.surname
, b.ordernum
FROM customer a
JOIN orders b
ON a.id = b.id
然后,DESC
命令将显示每个字段的类型。
DESC tmp_view
答案 4 :(得分:1)
如果您没有在Oracle中创建视图的权限,请使用MS访问“hack”: - (
在MS Access中,使用sql创建一个pass through查询(但添加where子句只选择1条记录),从视图中创建一个select查询(非常重要),选择all *,然后从中创建一个make表。选择查询。当它运行时,它将创建一个包含一条记录的表,所有数据类型都应该“匹配”oracle。 即Passthrough - >选择 - > MakeTable - >表
我确信还有其他更好的方法,但如果你的工具和权限有限,这将有效。
答案 5 :(得分:0)
此外,如果您有Toad for Oracle,则可以突出显示该语句并按 CTRL + F9 ,您将获得一个很好的列视图和他们的视图数据类型。
答案 6 :(得分:0)
you can use the DBMS_SQL.DESCRIBE_COLUMNS2
SET SERVEROUTPUT ON;
DECLARE
STMT CLOB;
CUR NUMBER;
COLCNT NUMBER;
IDX NUMBER;
COLDESC DBMS_SQL.DESC_TAB2;
BEGIN
CUR := DBMS_SQL.OPEN_CURSOR;
STMT := 'SELECT object_name , to_char(object_id), created FROM DBA_OBJECTS where rownum<10';
SYS.DBMS_SQL.PARSE(CUR, STMT, DBMS_SQL.NATIVE);
DBMS_SQL.DESCRIBE_COLUMNS2(CUR, COLCNT, COLDESC);
DBMS_OUTPUT.PUT_LINE('Statement: ' || STMT);
FOR IDX IN 1 .. COLCNT
LOOP
CASE COLDESC(IDX).col_type
WHEN 2 THEN
DBMS_OUTPUT.PUT_LINE('#' || TO_CHAR(IDX) || ': NUMBER');
WHEN 12 THEN
DBMS_OUTPUT.PUT_LINE('#' || TO_CHAR(IDX) || ': DATE');
WHEN 180 THEN
DBMS_OUTPUT.PUT_LINE('#' || TO_CHAR(IDX) || ': TIMESTAMP');
WHEN 1 THEN
DBMS_OUTPUT.PUT_LINE('#' || TO_CHAR(IDX) || ': VARCHAR'||':'|| COLDESC(IDX).col_max_len);
WHEN 9 THEN
DBMS_OUTPUT.PUT_LINE('#' || TO_CHAR(IDX) || ': VARCHAR2');
-- Insert more cases if you need them
ELSE
DBMS_OUTPUT.PUT_LINE('#' || TO_CHAR(IDX) || ': OTHERS (' || TO_CHAR(COLDESC(IDX).col_type) || ')');
END CASE;
END LOOP;
SYS.DBMS_SQL.CLOSE_CURSOR(CUR);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM(SQLCODE()) || ': ' || DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);
SYS.DBMS_SQL.CLOSE_CURSOR(CUR);
END;
/
full example in the below url
https://www.ibm.com/support/knowledgecenter/sk/SSEPGG_9.7.0/com.ibm.db2.luw.sql.rtn.doc/doc/r0055146.html