2

要求如下:

通过 Oracle Apex 应用程序,我需要在另一个 Oracle 数据库中删除用户/模式。即,使用 Oracle Apex 应用程序远程删除用户。

目前,我正在使用以下过程来完成此任务。但是,由于有很多远程数据库,所以,我想知道有没有办法使这个动态化,即动态传递数据库链接名称DBMS_UTILITY.EXEC_DDL_STATEMENT。因此,用户将传递用户名和数据库名,并且基于数据库名,该过程将连接到正确的数据库/数据库链接并删除给定的用户。如果还有其他方法可以完成此任务,请告诉我。

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 回答