从 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 * 时有效,否则您需要使用我上面显示的匿名块。
例如,我有一个 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 * 时有效,否则您需要使用我上面显示的匿名块。