在 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 连接到所需的数据库。
另外,在同一范围内有两个变量名为 password
和 pass_word
会导致生产代码中的混乱和错误。但是,pass_word
在声明后不会被使用。 (&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 以动态方式将表数据输出到 CSV 的想法