【问题标题】:List all columns of a query (Oracle)列出查询的所有列 (Oracle)
【发布时间】:2026-02-09 17:20:07
【问题描述】:

Oracle 中是否有一个 SQL stmt 可以让我提取查询返回的所有列?

结合 Java,我可以执行查询并处理元数据,但我正在寻找一种方便的方法。

【问题讨论】:

  • 你应该知道它们,因为你已经指定了查询。不要使用*。明确。
  • 不一定:如果我使用以下查询会怎样? SELECT * FROM TBL_A A, TBL_B B WHERE A.ID = B.ID
  • 查看如何列出表格的列:*.com/a/26977159/402322
  • 如果您再解释一下您打算如何使用它,或者更好的是,如果您可以提供一些您需要的代码,您可能会得到更适合您需求的答案。例如,您是否正在寻找一种使用 JDBC API 获取此信息的方法?
  • 我有很长的 SQL stmts,我想获取获取的列。

标签: sql oracle


【解决方案1】:

试试这个:

DECLARE 

    sqlstr VARCHAR2(1000);
    cur INTEGER;
    columnCount INTEGER;
    describeColumns DBMS_SQL.DESC_TAB;

BEGIN 

    cur := DBMS_SQL.OPEN_CURSOR;
    sqlstr := 'SELECT * FROM TBL_A A, TBL_B B WHERE A.ID = B.ID';
    DBMS_SQL.PARSE(cur, sqlStr, DBMS_SQL.NATIVE);
    DBMS_SQL.DESCRIBE_COLUMNS(cur, columnCount, describeColumns);   
    FOR i IN 1..columnCount LOOP
        DBMS_OUTPUT.PUT_LINE ( describeColumns(i).col_name );
    END LOOP;
    DBMS_SQL.CLOSE_CURSOR(cur);

END;

更新:为了获得结果集,您可以这样做:

CREATE OR REPLACE TYPE VARCHAR_TABLE_TYPE AS TABLE OF VARCHAR2(30);

CREATE OR REPLACE FUNCTION GetColumns(sqlstr IN VARCHAR2) 
   RETURN VARCHAR_TABLE_TYPE PIPELINED AS

    cur INTEGER;
    columnCount INTEGER;
    describeColumns DBMS_SQL.DESC_TAB;

BEGIN 

    cur := DBMS_SQL.OPEN_CURSOR;
    DBMS_SQL.PARSE(cur, sqlStr, DBMS_SQL.NATIVE);
    DBMS_SQL.DESCRIBE_COLUMNS(cur, columnCount, describeColumns);   
    FOR i IN 1..columnCount LOOP
        PIPE ROW(describeColumns(i).col_name);
    END LOOP;
    DBMS_SQL.CLOSE_CURSOR(cur);
   RETURN;
END;


SELECT * FROM TABLE(GetColumns('SELECT * FROM TBL_A A, TBL_B B WHERE A.ID = B.ID'));

【讨论】:

  • 别忘了在 SQL dev 中执行set serveroutput on
  • 还有没有办法将describeColumns的值作为结果集返回?