проверка наличия таблицы - PullRequest
0 голосов
/ 19 августа 2011

Можете ли вы помочь мне исправить этот блок кода плз?

`CREATE OR REPLACE FUNCTION TABLE_EXISTS(name VARCHAR(50))
RETURNS BOOLEAN
AS
BEGIN
    DECLARE counttable INTEGER;

    SELECT COUNT(1) INTO counttable FROM USER_TABLES WHERE TABLE_NAME=name;

    if counttable=0 then
    return false
    else
    return true
    end if;
END;
/
IF (TABLE_EXISTS("LEADS_DELETED")) then
DROP TABLE LEADS_DELETED;
end if;
/
CREATE GLOBAL TEMPORARY TABLE LEADS_DELETED
(
    ID NUMBER(19),
    PRIMARY KEY (ID)
) ON COMMIT DELETE ROWS`

Ответы [ 2 ]

2 голосов
/ 19 августа 2011

У вас есть двойные кавычки вокруг имени вашей таблицы "LEADS_DELETED" должно быть "LEADS_DELETED".

Я бы также обернул имя таблицы в вашем запросе тоже UPPER (table_name).

Вытакже необходимо поместить команду DROP TABLE в оболочку EXECUTE IMMEDIATE.

Вы также объявляете свою переменную в месте wrog, ее необходимо объявить перед предложением BEGIN.

CREATE OR REPLACE 
FUNCTION TABLE_EXISTS(name VARCHAR(50)) 
  RETURNS BOOLEAN 
AS 
   counttable INTEGER; 
BEGIN 
   SELECT COUNT(1) 
     INTO counttable 
     FROM USER_TABLES 
    WHERE TABLE_NAME=UPPER(name);      

    if counttable=0 
    then     
       return false     
    else     
       return true     
    end if; 
END; 
/ 

-- I suggest you use a bind variable instead of the literal table name.
IF TABLE_EXISTS('LEADS_DELETED') 
THEN
  EXECUTE IMMEDIATE 'DROP TABLE LEADS_DELETED';
END IF;
/ 

-- Could be
IF table_exists(v_table_name)
THEN
   EXECUTE IMMEDIATE 'DROP TABLE :tablename'
   USING v_table_name;
END IF;
2 голосов
/ 19 августа 2011

Вы можете использовать такую ​​конструкцию, когда хотите создать или воссоздать таблицу (попробуйте удалить и перехватить исключение ORA-00942, которое выдается, когда объект не существует):

DECLARE
   table_does_not_exist exception;
   pragma exception_init(table_does_not_exist, -942);
BEGIN
   EXECUTE IMMEDIATE 'DROP TABLE LEADS_DELETED';
EXCEPTION
   WHEN table_does_not_exist THEN
      NULL;
END;
/

CREATE TABLE ...
...