2012-02-18 20 views
0
ACCEPT p_username PROMPT 'Enter Username : ' 
ACCEPT p_password PROMPT 'Enter New Password for Username : ' 
VARIABLE g_output VARCHAR2(4000) 
DECLARE 
    CURSOR NAME IS SELECT TABLE_NAME FROM DBA_TABLES 
     WHERE OWNER LIKE '%&p_username%'; 
    DDL_DROP VARCHAR2(200); 
BEGIN 
    FOR TNAME IN NAME 
    LOOP 
     BEGIN 
      EXECUTE IMMEDIATE 'DROP TABLE' || ' ' || TNAME.TABLE_NAME; 
     :g_output := :g_output || ' ' || TNAME.TABLE_NAME; 
     END; 
    END LOOP; 
END; 
/
PRINT g_output 

こんにちは、私はPL/SQLが初めてで、ユーザーの表を削除して最終的に表を削除した後でパスワードを変更するスクリプトを作成しようとしています。 EXECUTE IMMEDIATEコマンドに問題があります。 EXECUTE IMMEDIATE行を削除すると、スクリプトが機能します。ループの中にテーブル名を表示してテストしたところ、テーブルとそれに対応する名前が適切な数になりました。PL/SQL DDL即時実行

ご協力いただきありがとうございます。

提案を反映するようにコードを編集しましたが、それでも機能しませんでした。同じエラーが発生しました。

ACCEPT p_username PROMPT 'Enter Username : ' 
ACCEPT p_password PROMPT 'Enter New Password for Username : ' 
VARIABLE g_output VARCHAR2(4000) 
DECLARE 
    NAME SYS_REFCURSOR; 
    DDL_WORD VARCHAR2(200); 
BEGIN 
    OPEN NAME FOR SELECT TABLE_NAME FROM DBA_TABLES 
     WHERE OWNER LIKE '%&p_username%'; 
    LOOP 
     FETCH NAME INTO DDL_WORD; 
     EXIT WHEN NAME%NOTFOUND; 
     EXECUTE IMMEDIATE 'DROP TABLE "' || DDL_WORD || '" CASCADE CONSTRAINTS'; 
     :g_output := :g_output || ' ' || DDL_WORD; 
    END LOOP; 
    CLOSE NAME; 
END; 
/
PRINT g_output 
+0

データ・ディクショナリ内のすべてが大文字です。 '% 'のような所有者が必要です。上(p_username)|| '%' '。あなたは本当にユーザーあたり1つのテーブルを持っていますか? – Ben

+0

私は14テーブルを持つユーザー名を入力しています。私は自分で作成し、テーブルにはデータがあります。 1行目 – ReiRei

答えて

1

を試みることができる:

ACCEPT p_username PROMPT 'Enter Username : ' 
ACCEPT p_password PROMPT 'Enter New Password for Username : ' 
VARIABLE g_output VARCHAR2(4000) 
DECLARE 
    CURSOR NAME IS SELECT OWNER, TABLE_NAME FROM DBA_TABLES 
     WHERE OWNER LIKE '%&p_username%'; 
    DDL_DROP VARCHAR2(200); 
BEGIN 
    FOR TNAME IN NAME 
    LOOP 
     BEGIN 
      EXECUTE IMMEDIATE 'DROP TABLE' || ' ' || TNAME.OWNER || '.' || TNAME.TABLE_NAME; 
     :g_output := :g_output || ' ' || TNAME.OWNER || '.' || TNAME.TABLE_NAME; 
     END; 
    END LOOP; 
END; 
/
PRINT g_output 
+0

これは動作しますが、スクリプトを実行すると新しいエラーが発生することがあります。ORA-25153:一時表領域が空です – ReiRei

0

コードは正常です。

あなたはこの

BEGIN 

EXECUTE IMMEDIATE (code_text); 

END; 

のように()を試みることができるあなたは、あなたはおそらくDROP文でテーブルの所有者を指定する必要が

c SYS_REFCURSOR; 
BEGIN 
    OPEN c FOR 'SELECT * FROM table'; 
    CLOSE c; 
END; 
+0

DECLARE * ERROR: ORA-00942:表またはビューが ORA-06512存在しない:ライン9 まだ同じエラーで。 – ReiRei

関連する問題