2

要件は次のとおりです。

Oracle Apex アプリケーションを使用して、ユーザー/スキーマを別の Oracle データベースにドロップする必要があります。つまり、Oracle Apex アプリケーションを使用してユーザーをリモートで削除します。

現在、このタスクには以下の手順を使用しています。しかし、多くのリモートデータベースがあるため、これを動的にする方法、つまりDBリンク名を動的に渡す方法があるかどうかを知りたいですDBMS_UTILITY.EXEC_DDL_STATEMENT。そのため、ユーザーがユーザー名とデータベース名を渡し、データベース名に基づいてプロシージャが正しいデータベース/DB リンクに接続し、指定されたユーザーをドロップします。このタスクを達成する他の方法があれば教えてください。

CREATE OR REPLACE 
    PROCEDURE drop_user_proc( 
    p_username VARCHAR2, 
    p_databasename VARCHAR2) 
IS 
    ddl_stmt VARCHAR2(100); 
BEGIN 
    IF p_databasename = ‘REMOTEDB1’ THEN 
        ddl_stmt := 'DROP USER '||p_username||' CASCADE'; 
        dbms_utility.exec_ddl_statement@remotedb1(ddl_stmt); 
END IF; 
END drop_user_proc; 
4

2 に答える 2

3

あなたはこれを試すことができます:

CREATE OR REPLACE 
    PROCEDURE drop_user_proc( 
    p_username VARCHAR2, 
    p_databasename VARCHAR2) 
IS 
    ddl_stmt VARCHAR2(100); 
BEGIN 
    ddl_stmt := 'DROP USER '||p_username||' CASCADE'; 
    execute immediate 'begin dbms_utility.exec_ddl_statement@' || p_databasename || '(:ddl_stmt);  end;' using ddl_stmt;
END drop_user_proc; 
于 2012-09-27T06:22:11.877 に答える
1

dbms_utility.exec_ddl_statementデータベースリンクの名前をプロシージャに渡すことはできません。ただし、動的SQLを使用してプロシージャを呼び出すことはできます。のようなもの(テストされていません-現時点でテストするのに便利なデータベースリンクを備えたデータベースがありません)

EXECUTE IMMEDIATE 'BEGIN dbms_utility.exec_ddl_statement@' || p_dblink ||
                  '(''' || ddl_stmt || '''); END;';
于 2012-09-27T06:22:00.507 に答える