2016-11-26 11 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

エラーを指定すると便利です。あなたの最初の3つのステートメントは、すべてが1つのステートメントの一部であるように見えます。デフォルトと一時テーブルスペースを含む 'CREATE USER'全体を実行した単一の'即時実行 'が必要です。もちろん、DDLステートメントに適切な空白( 'DEFAULT'や' TEMPORARY'の前のスペースなど)があることを確認したいでしょう。 –

+1

最初の3行は**単一**文でなければなりません。有効なSQL文が 'デフォルトは –

答えて

1

最初の3つのステートメントを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文を記録するか、またはどの文が失敗したかを記録するのが容易になります。それはデバッグをはるかに簡単にするでしょう。

関連する問題