我正在尝试创建表(如果尚不存在)。我目前正在检查它是否首先存在,DBA_TABLES并且该查询是否不返回任何内容,然后插入。有没有一种方法可以只检查同一条语句,因此我不必将其分解为单独的查询?
DBA_TABLES
这就是我目前所拥有的。
BEGIN SELECT COUNT(*) INTO lvnTableExists FROM DBA_TABLES WHERE Table_Name = 'SOME_TABLE'; IF lvnTableExists = 0 THEN EXECUTE IMMEDIATE 'CREATE TABLE SOME_TABLE AS (SELECT * FR0M OTHER_TABLE)'; END IF; END;
这是我要的东西。
DECLARE sql VARCHAR2(100000); BEGIN sql := 'CREATE TABLE SOME_TABLE ' || 'AS (SELECT * FROM OTHER_TABLE) ' || 'WHERE NOT EXISTS (SELECT NULL ' || 'FROM DBA_OBJECTS d WHERE d.Object_Name = 'SOME_TABLE' AND ' || 'd.Owner = 'SOME_TABLE')'; EXECUTE IMMEDIATE sql; END;
问题是,您不能WHERE NOT EXISTS在CREATE TABLE AS语句中添加一个。
WHERE NOT EXISTS
CREATE TABLE AS
是的,Oracle没有该功能真是可惜。我敢肯定会有一天。在此之前,如果您想编写一个PL / SQL包装器,为什么不那样做:
DEClARE table_exists_already exception; pragma exception_init(table_exists_already, -955 ); BEGIN EXECUTE IMMEDIATE 'CREATE TABLE SOMETABLE...'; EXCEPTION WHEN table_exists_already THEN DBMS_OUTPUT.PUT_LINE('Table sometable already exists'); END; /