проблема со скриптом создания таблицы через условие if - PullRequest
1 голос
/ 02 октября 2019

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

    case 
    if select count(*) from ALL_TAB_COLS where table_name = 'GPS_TRACKER_DATA' = 0 then
       create table AZUBI.GPS_TRACKER_DATA as select * from KAKATEL.GPS_POSITION
    else end

это ошибка, которую мы получаем

    Error starting at line : 3 in command -
    create table FEZ.GPS_TRACKER_DATA as select * from KAKATEL.GPS_POSITION
    else END
    Error report -
    ORA-00933: SQL command not properly ended
    00933. 00000 -  "SQL command not properly ended"
    *Cause:    
    *Action:

Ответы [ 3 ]

1 голос
/ 02 октября 2019

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

DECLARE
  ALREADY_EXISTS EXCEPTION;
  PRAGMA EXCEPTION_INIT( ALREADY_EXISTS, -955 );
BEGIN
  EXECUTE IMMEDIATE 'CREATE TABLE new_table AS SELECT * FROM existing_table';
EXCEPTION
  WHEN ALREADY_EXISTS THEN
    NULL;
END;
/

db <> fiddle здесь

0 голосов
/ 02 октября 2019

Один из вариантов:

declare
  v_cnt pls_integer;
begin
  select count(*)
    into v_cnt
    from ALL_TAB_COLS
   where table_name = 'GPS_TRACKER_DATA';
  if v_cnt = 0 then
    execute immediate 'create table AZUBI.GPS_TRACKER_DATA as 
                       select * from KAKATEL.GPS_POSITION';
  end if;
end;
/
  • execute immediate необходим для оператора DDL в блоке PL/SQL.
  • , что оператор выбора возвращает не-отрицательное (и даже ненулевое) целое число для любого случая.

Вы можете заменить if..then..end if на case..when then..end case, также:

declare
  v_cnt pls_integer;
begin
  select count(*)
    into v_cnt
    from ALL_TAB_COLS 
   where table_name = 'GPS_TRACKER_DATA';
  case
    when v_cnt = 0 then
      execute immediate 'create table AZUBI.GPS_TRACKER_DATA as
                         select * from KAKATEL.GPS_POSITION';
  end case;
end;
/
0 голосов
/ 02 октября 2019

Это должно быть сделано в блоке PL / SQL:

DECLARE
    V_CNT   NUMBER := 0;
BEGIN
    SELECT
        COUNT(*)
    INTO V_CNT
    FROM
        ALL_TABLES -- USE ALL_TABLES 
    WHERE
        TABLE_NAME = 'GPS_TRACKER_DATA'
        AND OWNER = 'AZUBI'; -- ADDED OWNER CONDITION

    IF V_CNT = 0 THEN
        EXECUTE IMMEDIATE 'create table AZUBI.GPS_TRACKER_DATA as 
                           select * from KAKATEL.GPS_POSITION';
    END IF;
END;
/

Cheers !!

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