5

Is it possible to get results similar to the Oracle DESCRIBE command for a query? E.g. I have a join among several tables with a restriction of the columns that are returned, and I want to write that to a file. I later want to restore that value from a file into its own base table in another DBMS.

I could describe all of the tables individually and manually prune the columns, but I was hoping something like DESC (select a,b from t1 join t2) as q would work but it doesn't.

Creating a view isn't going to work if I don't have create view privileges, which I don't. Is there no way to describe a query result directly?

4

3 回答 3

5

如果您有一个表示要从一个数据库中提取并加载到不同数据库中的一组数据的查询,那么在源数据库中为该查询创建一个视图似乎非常明智。获得该视图后,您可以describe查看或以其他方式从各种数据字典表中提取您要查找的信息。

而且我假设有充分的理由更喜欢使用基于文件的自定义解决方案将数据从一个数据库复制到另一个数据库,而不是 Oracle 提供的用于处理数据复制的任何技术。物化视图、Streams、GoldenGate 等通常都是比自己编写更好的解决方案。

如果不允许在源数据库上创建对象,则不能使用 SQL*Plusdescribe命令。您可以编写一个匿名 PL/SQL 块,使用该dbms_sql包来解析和描述动态 SQL 语句。这将比使用命令复杂得多describe,您必须弄清楚您希望如何格式化输出。我会用这个describe_columns例子作为起点。

于 2014-01-06T21:39:35.447 回答
5

如果您计划重新使用查询,则为它创建一个视图可能是有意义的。
您可以像评论表一样评论数据库视图:

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

参考:

如何为 oracle 数据库视图创建注释

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 返回的所有信息都存储在数据字典中。

于 2014-01-06T22:44:42.740 回答
3

我很晚才回答,但无论如何我会为后代添加这个。

在 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'

Toad World 在这里有一个很好的可能数据类型列表: http ://www.toadworld.com/platforms/oracle/w/wiki/3328.dbms-sql-describe-columns

除了这个线程,我在 Oracle 上找不到相同的列表: 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)

于 2016-10-03T08:57:54.557 回答