Выбор множества столбцов, но не всех в Oracle - PullRequest
3 голосов
/ 17 июня 2011

Я написал PLSQL-программу, которая генерирует таблицу, имеющую обычно более 200 столбцов. Число столбцов не фиксировано и меняется каждый раз при выполнении процедуры plsql. Мне всегда нужно ВЫБРАТЬ не все столбцы, но неудобно добавлять их в запрос SELECT вручную. Столбцы, которые мне не нужно выбирать, это column1, column2 и column3 каждый раз. Если у меня есть 200 столбцов, мне нужно написать

Select column4, column5, ..., column200 from plsqltable

Мое решение состоит в том, чтобы использовать другую программу PLSQL для поиска имен столбцов из user_tab_colums (системное представление) для этой таблицы и составления этого sql-запроса. Есть ли какой-то более простой способ достичь того же SQL? Обычно я пишу SELECT table. * FROM table; если я хочу увидеть все столбцы. Есть ли способ использовать подобный синтаксис, чтобы сказать, что SELECT все, кроме table.col1, table.col2, table.col3 FROM table;?

Ответы [ 5 ]

2 голосов
/ 17 июня 2011

Невозможно выбрать некоторые столбцы, не перечислив нужные.

Все планы звучат немного странно - возможно, есть лучший способ сделать то, что вы делаете.В Oracle нет ничего необычного в том, чтобы создавать таблицы на лету.

1 голос
/ 17 июня 2011

Как сказано в комментарии, вы можете создать таблицу и затем отбросить три столбца, что является приемлемым, если вы не хотите, чтобы все усложнялось, и если вы соглашаетесь делать неоптимизированные вещи.

1 голос
/ 17 июня 2011

http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:766825833740

Оракул сводной таблицы с неизвестным числом строк, подлежащих повороту

...

Продолжение 31 октября 2006 г. - 18:00 по центральному времениzone:

вам потребуется

a) выполнить запрос для определения количества столбцов

b) использовать эту информацию для создания динамического SQL-запроса, который это делает.

так вот что я сделал, и вам не нужна вторая процедура для этого;Вы можете сделать это прямо в своей основной процедуре:

DROP TABLE dynamic_built_table;

CREATE TABLE dynamic_built_table
  (
    column1 VARCHAR2(1),
    column2 VARCHAR2(1),
    column3 VARCHAR2(1),
    column4 VARCHAR2(1),
    column5 VARCHAR2(1),
    column6 VARCHAR2(1)
  );

DECLARE
  l_sql VARCHAR2(5000);
BEGIN
  l_sql         := 'CREATE OR REPLACE VIEW DYNAMIC_COLUMN_VIEW AS SELECT ';
  FOR l_columns IN
  (SELECT column_name,
      column_id,
      MAX(column_id) over (partition BY table_name) max_column
    FROM user_tab_cols
    WHERE table_name = 'DYNAMIC_BUILT_TABLE'
    AND column_id    > 3
  )
  LOOP
    l_sql                  := l_sql||l_columns.column_name;
    IF l_columns.column_id != l_columns.max_column THEN
      l_sql                := l_sql||',';
    END IF;
  END LOOP;
  l_sql := l_sql||' from dynamic_built_table';
  EXECUTE immediate l_sql;
END;
/

SELECT * FROM DYNAMIC_COLUMN_VIEW;
1 голос
/ 17 июня 2011

С вашим предположением:

 The columns that I don't need to select are column1, column2 and column3 every time

Я могу предложить создать VIEW следующим образом:

CREATE VIEW GOOFY AS SELECT COLUMN4, COLUMN5, ....., COLUMN200 FROM YOUR_ORIGINAL_TABLE;

... и затем

SELECT * from GOOFY;

:-)

0 голосов
/ 17 июня 2011

Где вы их выбираете?Если он находится в блоке PL / SQL, вы можете просто select * (что обычно не рекомендуется!) В курсоре или into что-то и просто игнорировать ненужные биты.Если вы делаете это в SQL * Plus, чтобы проверить, что там, вы можете просто скрыть столбцы из вывода:

column column1 noprint
column column2 noprint
column column3 noprint

select * from plsqltable;

В противном случае, почему бы не создать представление одновременно с созданием таблицы,в той же процедуре, так как вы, вероятно, знаете имена столбцов в этой точке?Или, если вы не можете изменить этот процесс, используйте что-то вроде подхода @Joel Slowik в отдельной процедуре, чтобы воссоздать представление на основе текущего определения таблицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...