如果 table 不存在则创建它
Creating a table if it doesn't exist already
我正在尝试创建 table(如果它尚不存在)。我目前正在检查它是否存在于 DBA_TABLES
中,如果该查询 returns 没有然后插入。有没有办法只检查同一条语句,这样我就不必将它分解成单独的查询?
这是我目前拥有的。
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
语句中。
是的,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;
/
我正在尝试创建 table(如果它尚不存在)。我目前正在检查它是否存在于 DBA_TABLES
中,如果该查询 returns 没有然后插入。有没有办法只检查同一条语句,这样我就不必将它分解成单独的查询?
这是我目前拥有的。
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
语句中。
是的,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;
/