从 Oracle 中提供的查询中获取列名或别名 sql

Get column or alias name from a provided query in Oracle sql

例如,我有一个 sql 查询

SELECT * 
FROM EMPLOYEE 
INNER JOIN DEPARTMENT 
ON EMPLOYEE.DEP_ID = DEPARTMENT.DEP_ID

现在,我想获取 return 结果的所有列名称:DEP_ID、EMP_ID、.....

我正在开发类似 http://www.w3schools.com/sql/trysql.asp?filename=trysql_select_all 的 j2ee 网络,您可以在其中输入 sql 查询并获得结果 table

您可以查询 ALL_TAB_COLUMNS table 以获取 EMPLOYEE table

中的所有列

不确定您是否需要这些格式,因此不能完全确定您想要的最终结果

要控制列和值对齐,您可能需要使用 Dynamic SQL 替换 SELECT 语句中的 * 以控制返回列的顺序

有一种方法可以使用 dbms_sql.describe_columns2 获取查询的所有列名。但是,它必须在 PL/SQL.

内完成

例如,

我想获取以下所有列的列表SQL:

SELECT emp.empno, emp.ename, dept.deptno 
FROM emp 
INNER JOIN dept 
ON emp.deptno = dept.deptno

以下匿名块将按照它们在 select 列表中的确切顺序列出所有 列名称:

SQL> set serveroutput on
SQL> DECLARE
  2    l_cursor NUMBER := dbms_sql.open_cursor;
  3    l_ignore NUMBER;
  4    l_desc dbms_sql.desc_tab2;
  5    l_cnt NUMBER;
  6  BEGIN
  7    dbms_sql.parse( l_cursor, 'SELECT emp.empno, emp.ename, dept.deptno
  8  FROM emp
  9  INNER JOIN dept
 10  ON emp.deptno = dept.deptno', dbms_sql.native );
 11    dbms_sql.describe_columns2( l_cursor, l_cnt, l_desc );
 12    FOR i IN 1 .. l_cnt
 13    LOOP
 14      dbms_output.put_line( 'Column ' || i || ' is "' || l_desc(i).col_name || '"' );
 15    END LOOP;
 16    dbms_sql.close_cursor( l_cursor );
 17  END;
 18  /
Column 1 is "EMPNO"
Column 2 is "ENAME"
Column 3 is "DEPTNO"

PL/SQL procedure successfully completed.

SQL>

它还会为您提供列名的 ALIASES

SQL> DECLARE
  2    l_cursor NUMBER := dbms_sql.open_cursor;
  3    l_ignore NUMBER;
  4    l_desc dbms_sql.desc_tab2;
  5    l_cnt NUMBER;
  6  BEGIN
  7    dbms_sql.parse( l_cursor, 'SELECT emp.empno employee_id, emp.ename employee_name, dept.deptno department_no
  8  FROM emp
  9  INNER JOIN dept
 10  ON emp.deptno = dept.deptno', dbms_sql.native );
 11    dbms_sql.describe_columns2( l_cursor, l_cnt, l_desc );
 12    FOR i IN 1 .. l_cnt
 13    LOOP
 14      dbms_output.put_line( 'Column ' || i || ' is "' || l_desc(i).col_name || '"' );
 15    END LOOP;
 16    dbms_sql.close_cursor( l_cursor );
 17  END;
 18  /
Column 1 is "EMPLOYEE_ID"
Column 2 is "EMPLOYEE_NAME"
Column 3 is "DEPARTMENT_NO"

PL/SQL procedure successfully completed.

SQL>

由于您使用的是 SELECT *`,您还可以列出来自 [DBA|ALL|USER]_TAB_COLUMNS 的列名:

SQL> SELECT column_name FROM user_tab_columns WHERE table_name IN ('EMP','DEPT');

COLUMN_NAME
--------------------------------------------------------------------------------
EMPNO
ENAME
JOB
MGR
HIREDATE
SAL
COMM
DEPTNO
DEPTNO
DNAME
LOC

11 rows selected.

这仅在您使用 SELECT * 时有效,否则您需要使用我上面显示的匿名块。