2016-11-26 81 views
0

我嘗試執行此操作,但它在默認表空間處發生錯誤。我想給我創建的用戶提供一個默認表空間,但是如何?使用默認表空間創建Oracle用戶循環

BEGIN 
    FOR USERNAME IN (SELECT studentname from students) 
    LOOP 
    EXECUTE IMMEDIATE 'CREATE USER ' || USERNAME.studentname || ' IDENTIFIED BY ' || USERNAME.studentname; 
    EXECUTE IMMEDIATE 'DEFAULT TABLESPACE "USERS"'; 
    EXECUTE IMMEDIATE 'TEMPORARY TABLESPACE "TEMP"'; 
    EXECUTE IMMEDIATE 'GRANT STUDENT TO ' || USERNAME.studentname ;          
    END LOOP; 
END; 


Error report - ORA-00900: invalid SQL statement ORA-06512: at line 5 00900. 00000 - "invalid SQL 
+0

究竟哪個錯誤? –

+1

指定錯誤很有用。你的前三個陳述看起來應該都是單個陳述的一部分。你需要一個'EXECUTE IMMEDIATE'完成整個'CREATE USER'包括默認和臨時表空間。當然,你需要確保在你的DDL語句中有適當的空白(例如'DEFAULT'和'TEMPORARY'之前的空格)。 –

+1

前三行應該是**單**語句。沒有有效的SQL語句'默認tablespace' –

回答

1

您需要前三報表合併成一個,並添加適當的空間。由於使用不區分大小寫的標識符,因此不需要表空間名稱周圍的雙引號。

BEGIN 
    FOR USERNAME IN (SELECT studentname from students) 
    LOOP 
    EXECUTE IMMEDIATE 'CREATE USER ' || USERNAME.studentname || ' IDENTIFIED BY ' || USERNAME.studentname || 
         ' DEFAULT TABLESPACE USERS 
         TEMPORARY TABLESPACE TEMP'; 
    EXECUTE IMMEDIATE 'GRANT UNLIMITED TABLESPACE TO ' || USERNAME.studentname; 
    EXECUTE IMMEDIATE 'GRANT STUDENT TO ' || USERNAME.studentname ;          
    END LOOP; 
END; 

就個人而言,我總是生成SQL語句中的字符串和字符串傳遞給EXECUTE IMMEDIATE。這使得執行諸如記錄執行的SQL語句或記錄哪個語句失敗等事情變得容易。這將使調試變得更容易。