【问题标题】:checking if table exists function检查表是否存在函数
【发布时间】:2011-08-19 07:53:22
【问题描述】:

你能帮我纠正一下这段代码吗?

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

【问题讨论】:

  • 你的问题是什么?什么不起作用?

标签: sql oracle sql-function


【解决方案1】:

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

【讨论】:

    【解决方案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;
    

    【讨论】:

    • 嗨,drop 逻辑是我调用函数的地方。这是一个查询,我用来演示为什么我需要这个函数。所以我认为不需要立即执行
    • 感谢您的努力,奥利!也许以后我们可以努力让这个功能工作:)
    猜你喜欢
    • 2022-11-15
    • 2012-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-22
    • 2011-10-23
    • 2010-11-10
    • 2014-02-18
    相关资源
    最近更新 更多