2011-08-19 113 views
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` 
+0

你有什么问题?什么不行? –

+0

检查ollie的答案 – MozenRath

回答

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 ... 
+0

将立即尝试此查询 – MozenRath

+0

谢谢了文森特!你救了我的一天! – MozenRath

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; 
+0

嗨下降逻辑是我称之为功能。这是我用来演示为什么我需要该功能的查询。所以没有必要立即执行我认为 – MozenRath

+0

感谢您的努力ollie!也许以后我们可以努力让这个功能工作:) – MozenRath