0

你能帮我纠正这个代码块吗?

`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`
4

2 回答 2

2

当您想要创建或重新创建表时,您可以使用这样的构造(尝试删除并捕获当对象不存在时抛出的 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 ...
于 2011-08-19T08:32:25.070 回答
2

你的表名“LEADS_DELETED”应该是“LEADS_DELETED”。

我也会用 UPPER(table_name) 将 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;
于 2011-08-19T08:33:06.597 回答