Поймать исключение при изменении таблицы в Oracle - PullRequest
4 голосов
/ 02 февраля 2012

Я пытаюсь написать команду в Oracle, которая будет с добавлением или изменением столбца в зависимости от того, существует он или нет.По сути, что-то вроде:

BEGIN

  ALTER TABLE MY_TABLE ADD ( COL_NAME VARCHAR2(100 );

  EXCEPTION WHEN OTHERS THEN
    ALTER TABLE MY_TABLE MODIFY ( COL_NAME VARCHAR2(100) );

END;

Однако Oracle жалуется на наличие команды ALTER внутри BEGIN.Есть ли способ добиться этого с помощью одной команды SQL в Oracle?

Спасибо!

Ответы [ 2 ]

6 голосов
/ 02 февраля 2012

Чтобы поместить DDL в блок PL / SQL, вам необходимо использовать динамический SQL.

Лично я бы проверил, существует ли сначала столбец, а затем выполнил DDL.Что-то вроде

DECLARE
  l_cnt INTEGER;
BEGIN
  SELECT COUNT(*)
    INTO l_cnt
    FROM dba_tab_cols
   WHERE table_name  = 'MY_TABLE'
     AND owner       = <<owner of table>>
     AND column_name = 'COL_NAME';

  IF( l_cnt = 0 )
  THEN
    EXECUTE IMMEDIATE 'ALTER TABLE my_table ADD( col_name VARCHAR2(100) )';
  ELSE
    EXECUTE IMMEDIATE 'ALTER TABLE my_table MODIFY( col_name VARCHAR2(100) )';
  END IF;
END;

Если у вас нет доступа к DBA_TAB_COLS, вы также можете использовать ALL_TAB_COLS или USER_TAB_COLS в зависимости от того, в какой схеме находится таблица и какие у вас есть права на нее..

3 голосов
/ 02 февраля 2012

Я нашел решение на основе этого поста .

DECLARE v_column_exists number := 0;   
BEGIN   
  SELECT COUNT(*) INTO v_column_exists
  FROM ALL_TAB_COLUMNS 
  WHERE TABLE_NAME = 'MY_TABLE'
  AND COLUMN_NAME = 'COL_NAME';

  IF (v_column_exists = 0) THEN
    EXECUTE IMMEDIATE 'ALTER TABLE MY_TABLE ADD ( COL_NAME VARCHAR2(200) )';   
  ELSE
    EXECUTE IMMEDIATE 'ALTER TABLE MY_TABLE MODIFY ( COL_NAME VARCHAR2(200) )';
  END IF;
END; 
...