为具有大量列的表(不是 SELECT *)高效编写 SELECT 查询

Wil*_*son 6 oracle select fields

由于 GIS 软件的限制,我需要为数据库中的 200 多个表中的每一个编写选择查询。查询需要选择除 SHAPE 列之外的所有列。

是否有一种有效的方法来获取每个表的所有字段名称 - 用于编写选择查询?

我试过的:

  1. 我认为这可以通过 SQL Developer(免费)实现。但不幸的是,由于 IT 挑战,我没有 SQL Developer。

  2. 我知道当我SELECT *在 Oracle 中的表上创建视图时,查询被转换为显式选择单个字段。所以我可以 a)SELECT *为每个表创建一个视图,b) 获取视图定义,以及 c) 为每个表编写查询。这可能比手动输入每个字段名称要快,但不会快很多。

如何有效地为具有大量列的表编写选择查询?

Joe*_*ish 11

我们可以使用ALL_TAB_COLS视图LISTAGG来生成您需要的查询。只要您的表不超过 125 列左右,此策略就应该有效。如果您有太多很长的列名,LISTAGG则不会返回完整值,因为返回值仅限于VARCHAR2(4000). 下面是一种实现:

SELECT 'SELECT ' || COL_LIST || ' FROM SCOTT.' || TABLE_NAME || ';' QUERY_TO_RUN
FROM
(
  SELECT DISTINCT TABLE_NAME
  ,  LISTAGG(COLUMN_NAME, ', ') WITHIN GROUP (ORDER BY COLUMN_ID)  OVER (PARTITION BY TABLE_NAME) COL_LIST
  from ALL_TAB_COLS
  WHERE OWNER = 'SCOTT'
  -- AND TABLE_NAME IN (...)
  AND COLUMN_NAME <> 'SHAPE'
) t;
Run Code Online (Sandbox Code Playgroud)

在那个例子中,我使用了内置的 SCOTT 模式(不确定它是否存在于您的数据库中)。以下是我的结果:

SELECT ENAME, JOB, SAL, COMM FROM SCOTT.BONUS;
SELECT EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO FROM SCOTT.EMP;
SELECT GRADE, LOSAL, HISAL FROM SCOTT.SALGRADE;
SELECT DEPTNO, DNAME, LOC FROM SCOTT.DEPT;
Run Code Online (Sandbox Code Playgroud)