2014-01-06 47 views
1

對於查詢,是否可以獲得與Oracle DESCRIBE命令類似的結果?例如。我有幾個表中有一個連接限制了返回的列,我想把它寫到一個文件中。我後來想要將該值從文件恢復到另一個DBMS中的基本表中。在Oracle中描述查詢結果的模式?

我可以單獨描述所有的表和手工修剪列,但我希望像DESC (select a,b from t1 join t2) as q會工作,但事實並非如此。

創建一個視圖是行不通的,如果我沒有create view特權,這我不知道。沒有辦法直接描述查詢結果嗎?

+0

'd BMS_SQL.DESCRIBE'應該做你想做的事情:http://docs.oracle.com/cd/E11882_01/appdev.112/e25788/d_sql.htm#i1026120 –

回答

3

如果您打算重新使用查詢,它可能是有意義的爲它創建一個視圖。
您可以以同樣的方式,你可以爲一個表的數據庫視圖評論:

create view TEST_VIEW as select 'TEST' COL1 from dual; 
comment on table TEST_VIEW IS 'TEST ONLY'; 

要找到一個看法的意見,執行此:

select * from user_tab_comments where table_name='TEST_VIEW'; 

參考文獻:

How to create a comment to an oracle database view

http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:233014204543

注意:此URL指出SQLPLUS DESCRIBE命令只能與「表,視圖或同義詞」或「函數或過程」一起使用。這意味着DESCRIBE的目標必須是現有的數據庫對象。

http://docs.oracle.com/cd/B19306_01/server.102/b14357/ch12019.htm

作爲SQLPLUS命令,DESCRIBE不能動態解析SQL語句。由DESCRIBE返回的所有信息都存儲在數據字典中。

+0

更新的問題:我想要查詢查詢的原因是因爲我無法在數據庫中創建新的表或視圖。我也試過臨時表,但我沒有這個許可。但是,連接的結果應該有足夠的元數據來顯示這些信息(例如,如果我是從像jdbc這樣的應用程序中完成的),我希望獲得Oracle解決方案。 – Christopher

+0

嗨,我也會研究,回到你身邊,好嗎? –

+0

上面的鏈接描述了DESCRIBE對ORACLE 10.2的限制;我正在檢查此命令的其他ORACLE版本。 –

3

如果你有一個表示一組數據,你想從一個數據庫和負載提取到一個不同的數據庫查詢,它似乎非常合理的創建在源數據庫中該查詢視圖。一旦你有了這個觀點,你就可以從視圖中提取或從其他數據字典表中提取你正在查找的信息。

而且我假設有一個堅實的理由偏愛超過任何Oracle提供處理數據複製技術從一個數據庫將數據複製到另一個基於文件的定製解決方案。物化視圖,Streams,GoldenGate等通常都會比編寫自己的解決方案好得多。

如果你不能在源數據庫上創建的對象,則不能使用SQL * Plus的describe命令。您可以編寫一個使用dbms_sql包的匿名PL/SQL塊來分析和描述動態SQL語句。這會比使用describe命令複雜得多,你必須弄清楚你想如何格式化輸出。我會用this describe_columns example作爲起點。

+0

更新的問題:我想要查詢查詢的原因是因爲我不能在數據庫中創建新的表或視圖。我也試過臨時表,但我沒有這個許可。但是,連接的結果應該有足夠的元數據來顯示這些信息(例如,如果我是從像jdbc這樣的應用程序中完成的),我希望獲得Oracle解決方案。 – Christopher

+0

@Christopher - 如果你想要一個類似於JDBC提供的接口,你需要編寫一個使用'dbms_sql'包的匿名PL/SQL塊。我鏈接了一個可以用作起點的例子。 –

1

我很晚纔回答,但無論如何我會爲後代添加這個。

在Oracle中,您可以使用DBMS_SQL包。

用法:

  1. 將您的SQL語句轉換成一條線(與空間替代換行符)
  2. 替換單引號用兩個單引號
  3. 將所得到的值到STMT(在下面的腳本)。
  4. 運行腳本。

SET SERVEROUTPUT ON; DECLARE STMT CLOB; CUR NUMBER; COLCNT NUMBER; IDX NUMBER; COLDESC DBMS_SQL.DESC_TAB2; BEGIN CUR := DBMS_SQL.OPEN_CURSOR; STMT := ''; 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'); 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;

我沒有涵蓋在下面的腳本中所有可能的數據類型,你可以,如果你需要的時候添加更多的病例。您可以使用此SQL瞭解的數據類型值: select text from all_source where owner = 'SYS' and name = 'DBMS_TYPES' and type = 'PACKAGE'

蟾蜍世界有可能的數據類型的一個很好的名單在這裏: http://www.toadworld.com/platforms/oracle/w/wiki/3328.dbms-sql-describe-columns

我無法找到除了在甲骨文相同的列表在這個線程: https://community.oracle.com/thread/914475

例子: -- snip STMT := 'SELECT * FROM SYS.ALL_TAB_COLS'; -- snip 會給你: anonymous block completed Statement: SELECT * FROM SYS.ALL_TAB_COLS #1: VARCHAR2 (1) #2: VARCHAR2 (1) #3: VARCHAR2 (1) #4: VARCHAR2 (1) #5: VARCHAR2 (1) #6: VARCHAR2 (1) #7: NUMBER #8: NUMBER #9: NUMBER #10: VARCHAR2 (1) #11: NUMBER #12: NUMBER #13: VARCHAR2 (8) #14: NUMBER #15: VARCHAR2 (23) #16: VARCHAR2 (23) #17: NUMBER #18: NUMBER #19: NUMBER #20: DATE #21: NUMBER #22: VARCHAR2 (1) #23: NUMBER #24: VARCHAR2 (1) #25: VARCHAR2 (1) #26: NUMBER #27: NUMBER #28: VARCHAR2 (1) #29: VARCHAR2 (1) #30: VARCHAR2 (1) #31: VARCHAR2 (1) #32: VARCHAR2 (1) #33: NUMBER #34: NUMBER #35: VARCHAR2 (1) #36: VARCHAR2 (1)