在 PL/SQL 中更改数据库

Posted

技术标签:

【中文标题】在 PL/SQL 中更改数据库【英文标题】:Changing databases in PL/SQL 【发布时间】:2017-04-28 19:41:11 【问题描述】:

下面的 PL/SQL 代码尝试连接到一个 Oracle 11.2.0.4.0 数据库,执行一个命令,然后对其他三个相同 Oracle 版本的数据库重复连接和命令。代码是:

DECLARE
    PASSWORD VARCHAR2(20);
    PASS_WORD VARCHAR2(20);
    ENVIRONMENT CHAR(1) := 'T';
    USERID INTEGER(10);
    USER_ID_4_ACCTS_TO_BE_DELETED INTEGER(10);
    TYPE ARRAY_T IS VARRAY(4) OF VARCHAR2(4);
    ARRAY ARRAY_T := ARRAY_T('A','BB','CCC','DDDD'');
BEGIN
    USERID := &USER_ID; -- Get user's id from keyboard (assume no change)
    PASSWORD := &PASS_WORD; -- Get user's password from keyboard (assume no change)
    FOR i IN 1..ARRAY.COUNT LOOP
        CONNECT ARRAY(i) || '_UPDADM_' || USERID || '/' || PASSWORD || '.' || '@CM_CM' || ENVIRONMENT || ARRAY(i)
        CALL ADMIN_USERS.DROP_USER(USERID ,'UPDADM');
    END LOOP;
END;
/

第一个连接字符串如下所示: CONNECT A_UPDADM_123456/Password.@CM_CMTA

抛出以下错误。

CONNECT ARRAY(i) || '_UPDADM_' || USERID || '/' || PASSWORD || '.' || '@CM_CM' || ENVIRONMENT || ARRAY(i)

*
ERROR at line 13:
ORA-06550: line 13, column 1:
PLS-00103: Encountered the symbol "CONNECT" when expecting one of the
following:
( begin case declare end exit for goto if loop mod null
pragma raise return select update while with <an identifier>
<a double-quoted delimited-identifier> <a bind variable> <<
continue close current delete fetch lock insert open rollback
savepoint set sql execute commit forall merge pipe purge

【问题讨论】:

你在 PL/SQL 手册的什么地方找到了CONNECT 使用可以轻松编写脚本并在该会话中运行此 PL/SQL 代码的 SQL*Plus 连接到所需的数据库。 另外,在同一范围内有两个变量名为 passwordpass_word 会导致生产代码中的混乱和错误。但是,pass_word 在声明后不会被使用。 (&amp;pass_word 又有所不同了。) 另外,不仅没有connect关键字,也没有call @ramana_k 非常有帮助,您应该重新发布作为答案。 【参考方案1】:

您不能在 PL/SQL 中重新连接到不同的数据库。连接的数据库实例提供运行时环境,因此更改它就像是一个 shell 脚本登录到不同的服务器中间脚本,或者一个正在运行的 Java 进程将自己动态地移交给不同的 JVM。

Switch user in pl/sql code block in sqlplus sessions

AskTOM: How to change user dynamically

在 12c 中,Multitenant 选项可能会为您提供更多选项,但这仍然类似于 DBA 脚本作用于同一数据库中的多个用户,而不是在过程中建立全新的连接。

【讨论】:

以上是关于在 PL/SQL 中更改数据库的主要内容,如果未能解决你的问题,请参考以下文章

(十五)PL/SQL事务

在 PL SQL 循环中更改表添加列

PL/SQL 过程和 Toad 执行?

需要有关使用 PL/SQL 以动态方式将表数据输出到 CSV 的想法

将数据集从 Oracle PL/SQL 传递到 Java 的适当方法

PL/SQL 性能优化 - 根据记录更改计算总和和微分