Oracle добавить комментарий к столбцу

Обновлено: 07.07.2024

После того, как курсор объявлен и открыт, каждая строка становится доступной по отдельности с помощью оператора FETCH . В этом операторе указывается, что именно нужно извлечь (столбцы), а также место для хранения извлечённых данных. Кроме того, оператор FETCH автоматически перемещает внутренний указать на строки в пределах курсора для извлечения следующей, а не одной и той же строки снова и снова.

Практический пример

Рассмотрим работу курсора c_vendors . Обратите внимание, что курсор начинается с оператора DECLARE , на этот раз в нём объявляется не только курсор, но и переменные, в которых требуется хранить данные. Эти переменные объявляются очень просто: сначала они именуются, а затем связываются с отдельными столбцами таблицы.

Далее определяется сам курсор c_vendors , а затем он открывается при помощи OPEN . Далее появляется оператор LOOP , который определяет блок циклически повторяющегося кода. Код, который расположен между LOOP и END LOOP , повторно выполняется до тех пор, пока не возникнет условие, вынуждающее выйти из цикла.

В этом цикле одна строка извлекается из курсора в указанные переменные с помощью оператора FETCH . Обратите внимание, что имена столбцов в этом операторе не указаны, и поэтому очень важен порядок следования столбцов. То есть, содержимое первого столбца будет сохранено в первой переменной, содержимое второго столбца во второй и т.д.

Оператор FETCH извлекает строки по очереди, и поэтому на каждом шаге цикла извлекается новая строка, а переменные обновляются новыми значениями из этой строки.

Чтобы прекратить этот цикл, используется оператор EXIT , который осуществляет выход из цикла и прекращает обработку данных в нём. Оператором EXIT можно воспользоваться в любом месте кода.

В нашем примере оператор EXIT WHEN c_vendors%notfound; расположен в конце цикла, указывая Oracle выйти из цикла, когда курсор c_vendors возвратит состояние notfound , указывающее на то, что извлекаемых строк больше не осталось.

Есть ли синтаксис комментария столбца, который позволяет мне указать комментарий столбца непосредственно, где я объявляю столбец в инструкции create table (т.е. inline)? 11g spec ничего не упоминает, на другой странице что-то упоминается, но я не мог заставить его работать. Существует способ указать комментарии после создания таблицы, но я думаю, что это раздражает, что комментарий отделен от определения поля. Я ищу что-то вроде этого (что не работает):

ОТВЕТЫ

Ответ 1

Я боюсь, что "раздражающий" COMMENT ON синтаксис - единственный способ сделать это. SQL Server, PostgreSQL и DB2 используют один и тот же синтаксис (хотя, насколько мне известно, не существует стандартного синтаксиса ANSI для добавления комментариев к объектам базы данных).

MySQL поддерживает способ работы. Я согласен, что это был бы более хороший механизм, но по моему опыту мало кто использует комментарии вообще, что я сомневаюсь, что Oracle когда-нибудь изменит его.

Ответ 2

Я боюсь, что это можно сделать только после создания таблицы, используя синтаксис comment on column . is '' .

Ответ 3

Обходной путь к этому раздражающему синтаксису - также просмотр и редактирование таблиц в Oracles SQLExplorer. Он содержит мастер, который позволяет редактировать комментарии рядом с столбцами. Это даже позволяет легко создавать скрипты alter table.

Моя процедура при редактировании таблиц заключается в том, чтобы вводить изменения в мастере без их фактического выполнения, затем перейдите на вкладку DDL и извлеките SQL оттуда (как обновление, а не полное создание script) и нажмите cancel on Мастер. Затем я помещаю созданный SQL в SQL script, который я пишу. Только когда я закончил с script, я все выполнил; Я не делаю никаких изменений с самим мастером.

Ответ 4

Тест на sqlplus (или аналогичный), но синтаксис выглядит следующим образом:

Обратите внимание, что комментарий будет отображаться в SQLDeveloper (или Toad или независимо от того, что у вас есть), пока вы не откроете указанные свойства таблицы.

Я понимаю, что подобный синтаксис существует для MySQL и других, но он не является правильным ANSI. Это очень полезно.

Набор действий, позволяющих изменять структуру таблицы.

В запросе можно указать сразу несколько действий над одной таблицей через запятую.
Каждое действие — это манипуляция над столбцом.

Существуют следующие действия:

    — добавляет столбец в таблицу; — удаляет столбец; — переименовывает существующий столбец; — сбрасывает все значения в столбце для заданной партиции; — добавляет комментарий к столбцу; — изменяет тип столбца, выражение для значения по умолчанию и TTL; — удаляет какое-либо из свойств столбца; — делает столбец материализованным ( MATERIALIZED ) в кусках, в которых отсутствуют значения.

Подробное описание для каждого действия приведено ниже.

ADD COLUMN

Добавляет в таблицу новый столбец с именем name , типом type , кодеком codec и выражением для умолчания default_expr (смотрите раздел Значения по умолчанию).

Если указано IF NOT EXISTS , запрос не будет возвращать ошибку, если столбец уже существует. Если указано AFTER name_after (имя другого столбца), то столбец добавляется (в список столбцов таблицы) после указанного. Если вы хотите добавить столбец в начало таблицы, используйте FIRST . Иначе столбец добавляется в конец таблицы. Для цепочки действий name_after может быть именем столбца, который добавляется в одном из предыдущих действий.

Добавление столбца всего лишь меняет структуру таблицы, и не производит никаких действий с данными - соответствующие данные не появляются на диске после ALTER-а. При чтении из таблицы, если для какого-либо столбца отсутствуют данные, то он заполняется значениями по умолчанию (выполняя выражение по умолчанию, если такое есть, или нулями, пустыми строками). Также, столбец появляется на диске при слиянии кусков данных (см. MergeTree).

Такая схема позволяет добиться мгновенной работы запроса ALTER и отсутствия необходимости увеличивать объём старых данных.

DROP COLUMN

Удаляет столбец с именем name . Если указано IF EXISTS , запрос не будет возвращать ошибку, если столбца не существует.

Запрос удаляет данные из файловой системы. Так как это представляет собой удаление целых файлов, запрос выполняется почти мгновенно.

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

RENAME COLUMN

Переименовывает столбец name в new_name . Если указано выражение IF EXISTS , то запрос не будет возвращать ошибку при условии, что столбец name не существует. Поскольку переименование не затрагивает физические данные колонки, запрос выполняется практически мгновенно.

ЗАМЕЧЕНИЕ: Столбцы, являющиеся частью основного ключа или ключа сортировки (заданные с помощью ORDER BY или PRIMARY KEY ), не могут быть переименованы. Попытка переименовать эти слобцы приведет к SQL Error [524] .

CLEAR COLUMN

Сбрасывает все значения в столбце для заданной партиции. Если указано IF EXISTS , запрос не будет возвращать ошибку, если столбца не существует.

Как корректно задать имя партиции, см. в разделе Как задавать имя партиции в запросах ALTER.

COMMENT COLUMN

Добавляет комментарий к таблице. Если указано IF EXISTS , запрос не будет возвращать ошибку, если столбца не существует.

Каждый столбец может содержать только один комментарий. При выполнении запроса существующий комментарий заменяется на новый.

Посмотреть комментарии можно в столбце comment_expression из запроса DESCRIBE TABLE.

MODIFY COLUMN

Запрос изменяет следующие свойства столбца name :

Значение по умолчанию

Примеры изменения кодеков сжатия смотрите в разделе Кодеки сжатия столбцов.

Примеры изменения TTL столбца смотрите в разделе TTL столбца.

Если указано IF EXISTS , запрос не возвращает ошибку при условии, что столбец не существует.

Запрос также может изменять порядок столбцов при помощи FIRST | AFTER , смотрите описание ADD COLUMN.

При изменении типа, значения преобразуются так, как если бы к ним была применена функция toType. Если изменяется только выражение для умолчания, запрос не делает никакой сложной работы и выполняется мгновенно.

Изменение типа столбца - это единственное действие, которое выполняет сложную работу - меняет содержимое файлов с данными. Для больших таблиц, выполнение может занять длительное время.

Выполнение запроса ALTER атомарно.

Запрос ALTER на изменение столбцов реплицируется. Соответствующие инструкции сохраняются в ZooKeeper, и затем каждая реплика их применяет. Все запросы ALTER выполняются в одном и том же порядке. Запрос ждёт выполнения соответствующих действий на всех репликах. Но при этом, запрос на изменение столбцов в реплицируемой таблице можно прервать, и все действия будут осуществлены асинхронно.

MODIFY COLUMN REMOVE

Удаляет какое-либо из свойств столбца: DEFAULT , ALIAS , MATERIALIZED , CODEC , COMMENT , TTL .

Пример

Удаление свойства TTL:

Смотрите также

MATERIALIZE COLUMN

Материализует столбец таблицы в кусках, в которых отсутствуют значения. Используется, если необходимо создать новый столбец со сложным материализованным выражением или выражением для заполнения по умолчанию ( DEFAULT ), потому как вычисление такого столбца прямо во время выполнения запроса SELECT оказывается ощутимо затратным. Чтобы совершить ту же операцию для существующего столбца, используйте модификатор FINAL .

Пример

Результат:

Ограничения запроса ALTER

Запрос ALTER позволяет создавать и удалять отдельные элементы (столбцы) вложенных структур данных, но не вложенные структуры данных целиком. Для добавления вложенной структуры данных, вы можете добавить столбцы с именем вида name.nested_name и типом Array(T) - вложенная структура данных полностью эквивалентна нескольким столбцам-массивам с именем, имеющим одинаковый префикс до точки.

Отсутствует возможность удалять столбцы, входящие в первичный ключ или ключ для сэмплирования (в общем, входящие в выражение ENGINE ). Изменение типа у столбцов, входящих в первичный ключ возможно только в том случае, если это изменение не приводит к изменению данных (например, разрешено добавление значения в Enum или изменение типа с DateTime на UInt32 ).

Если возможностей запроса ALTER не хватает для нужного изменения таблицы, вы можете создать новую таблицу, скопировать туда данные с помощью запроса INSERT SELECT, затем поменять таблицы местами с помощью запроса RENAME, и удалить старую таблицу. В качестве альтернативы для запроса INSERT SELECT , можно использовать инструмент clickhouse-copier.

Запрос ALTER блокирует все чтения и записи для таблицы. То есть если на момент запроса ALTER выполнялся долгий SELECT , то запрос ALTER сначала дождётся его выполнения. И в это время все новые запросы к той же таблице будут ждать, пока завершится этот ALTER .

Для таблиц, которые не хранят данные самостоятельно (типа Merge и Distributed), ALTER всего лишь меняет структуру таблицы, но не меняет структуру подчинённых таблиц. Для примера, при ALTER-е таблицы типа Distributed , вам также потребуется выполнить запрос ALTER для таблиц на всех удалённых серверах.

Добрый день! Мы команда системных аналитиков одного из подразделений управления данными «Ростелекома». В нашей компании насчитывается более 300 неоднородных источников данных — такое многообразие необходимо для поддержки работы Ростелекома по всем многочисленным направлениям. Мы изучаем источники данных и по необходимости частично выгружаем в контур хранилища.

В этом процессе выделяется две подзадачи: определение стратегии сбора данных из таблиц источника в зависимости от их свойств и подготовка таблиц-«приемников» хранилища данных. Для этого мы используем различные GUI и средства реверс-инжиниринга. Кроме того, при сборе информации системный аналитик начинает обрастать пулом вспомогательных запросов к информационным таблицам СУБД (преимущественно Oracle). В этой статье я поделюсь «джентльменским набором» таких скриптов, используемых нашей командой.

Для начала небольшое пояснение ко всем приведенным скриптам:

  • Во многих скриптах для агрегации строк используется xmlagg, так как listagg не может обработать слишком длинные строки, получающиеся в результате конкатенации.
  • Во всех скриптах кроме «Процедуры, функции и пакеты» целевые таблицы задаются через таблицу filter в блоке «with». Заполняется наименование схемы и наименование таблицы.
  • К каждому скрипту прилагается один или несколько сценариев использования, описание спецификации (результирующего набора), а также список используемых системных таблиц (для оценки возможности использования на конкретной БД).

Скрипт «Информация о таблицах»

Наименование колонки
Комментарий
SCHEMA_NAME
Наименование схемы данных (OWNER)
TABLE_NAME
Наименование таблицы
COMMENTS
Комментарий к таблице
HEIGHT
Количество строк в таблице (приблизительно)
WIDTH
Количество столбцов
DATETIME_COLUMNS
Столбцы с временнЫми типами данных и столбцы, исходя из наименования, предположительно являющиеся временнЫми метками (паттерны – %period%, %date%, %time%)
AVG_ROW_LEN
Средняя длина строки в байтах
PART_KEY
Столбцы по которым осуществлено партиционирование
SUBPART_KEY
Столбцы по которым осуществлено субпартиционирование

Используемые системные таблицы: all_tab_columns, all_tab_comments, all_tab_statistics, all_part_key_columns, all_subpart_key_columns.

Запрос полезен для определения стратегии выгрузки данных из системы источника. Если на рассматриваемой таблице построен первичный ключ, то можно организовать выгрузку с последующим выделением «инкремента» по нему. При наличии метки времени — например, в технических полях с информацией о вставке данных или об обновлении — можно организовать выгрузку только измененных/добавленных записей за период времени. Информация о структуре партиций может пригодиться при создании аналогичной таблицы-«приемника».

Тело запроса:

Скрипт «Партиции и субпартиции»

Наименование колонки
Комментарий
SCHEMA_NAME
Наименование схемы данных (OWNER)
TABLE_NAME
Наименование таблицы
PART_KEY
Столбцы по которым осуществлено партиционирование
PARTITION_NAME
Наименование партиции
PARTITION_POSITION
Номер партиции
PARTITION_HEIGHT
Количество строк в партиции
SUBPART_KEY
Столбцы по которым осуществлено субпартиционирование
SUBPARTITION_NAME
Наименование субпартиции
SUBPARTITION_POSITION
Номер субпартиции
SUBPARTITION_HEIGHT
Количество строк в субпартиции

Используемые системные таблицы: all_tab_partitions, all_tab_subpartitions, all_part_key_columns, all_subpart_key_columns.

Скрипт будет полезен для получения характеристик (наименование, размеры) партиций при их непосредственном использовании в качестве источников данных.

Тело запроса:

Скрипт «Атрибутный состав таблиц»

Используемые системные таблицы: all_tables, all_constraints, all_cons_columns, all_tab_columns, all_col_comments, v$nls_parameters.

Этот скрипт будет полезен для подготовки таблиц-«приемников» в хранилище данных, когда нужна подробная информация о таблице, ее взаимосвязях с другими таблицами, а также полном атрибутном составе. Через вспомогательную таблицу filter2 задается фильтрация таблиц, для которых осуществляется поиск ссылок (от и к). По умолчанию берутся таблицы из всех схем, кроме системных.

Тело запроса:

Скрипт «Процедуры, функции и пакеты»

Наименование колонки
Комментарий
SCHEMA_NAME
Наименование схемы данных (OWNER)
NAME
Наименование процедуры/функции/пакета/заголовка пакета
BODY
Тело
TYPE
Тип (PACKAGE BODY, PACKAGE, FUNCTION, PROCEDURE)
WRAPPED
Флаг «Закодировано тело или нет (wrapped)»

Используемые системные таблицы: all_source

ALTER TABLE: команда изменения структуры таблиц в Oracle

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

Структуру таблицы можно менять, то есть добавлять новые колонки в таблицу, удалять колонки из таблицы, менять типы данных у заданной колонки. Также, если таблица нам больше не нужна или просто надоела, существует возможность такую таблицу удалить.

Теория и практика

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

Все эти команды объединяет то, что они начинаются с ключевой команды ALTER TABLE .

Добавление колонки

Добавляем новую колонку к нашей таблице.

Синтаксис:

TABLE_NAME – наименование таблицы.

Column_NAME – наименование колонки.

Column_type – тип данных колонки ( VARCHAR (n) или NUMBER или DATE ).

Примеры:

Пусть у нас есть таблица GOODS, необходимо добавить колонку itemprice типа NUMBER , цена изделия.

Пусть у нас есть таблица MANS, необходимо добавить колонку DATEreg типа DATE , дата регистрации, и колонку patronymic – отчество VARCHAR2 (50) .

Удаление колонки

Также мы можем удалить колонку из заданной таблицы с помощью специальной SQL-команды DROP COLUMN .

Синтаксис:

Примеры:

Пусть у нас есть таблица GOODS, необходимо удалить колонку COLOR .

Пусть у нас есть таблица MANS, необходимо удалить колонку YEAROLD .

Меняем тип данных для колонки таблицы.

Синтаксис изменения типа колонки:

Сolumn_NAME – наименование колонки.

Data_type – тип данных колонки ( VARCHAR (n) или NUMBER или DATE ).

Примеры:

– заменить в таблице MANS тип поля NAME на VARCHAR2 (90) ;

– заменить в таблице GOODS тип поля INSERT_DATE на DATE;

Удаление таблицы из базы данных Oracle

Синтаксис команды SQL для удаления таблицы:

Здесь TABLE_NAME – наименование таблицы.

Примеры:

– удалить таблицу DOC ;

– удалить таблицу ITEMS ;

– удалить таблицу BILLING_PERIOD со связанными данными в таблице PERIODS.

Важные замечания

  1. При выполнении действий по изменению структуры таблицы следует быть особенно осторожным, следует тщательно взвешивать свои действия: восстановление таблицы в прежнем виде может быть затруднительно или невозможно.
  2. Если вы используете команды изменения типов данных и встречаетесь с ошибкой ORA-01439 , модифицируемый столбец при смене типа данных должен быть пуст. Сохраните данные в столбце и используйте специальные преобразования, о которых будет рассказано в следующих шагах.
  3. В некоторых случаях удаление таблицы или колонки таблицы будет запрещено, поскольку могут быть еще таблицы со связанными данными. Требуется сначала удалить данные в связанных таблицах, а уже затем удалять таблицу либо колонку. Или же воспользоваться специальной командой DROP CASCADE.

Возможные вопросы

Да, вполне, и для этого есть две команды:

Универсальный же синтаксис предполагает использование ALTER TABLE .

Примеры:

Переименуем таблицу с названием STAFF в EMP:

Переименуем таблицу с названием TRADES в TRADE:

Можно ли переименовать столбец в таблице?

Да, синтаксис команды:

Пример:

Переименовать колонку с наименованием NAME в таблице STAFF в колонку LASTNAME :

Читайте также: