Oracle 如何从powershell执行PL/SQL包?
我正在尝试编写powershell脚本,以帮助跨多个数据库执行一些用户维护任务Oracle 如何从powershell执行PL/SQL包?,oracle,powershell,plsql,package,Oracle,Powershell,Plsql,Package,我正在尝试编写powershell脚本,以帮助跨多个数据库执行一些用户维护任务 数据库1包含我的用户ID和用户类型(例如:员工、分包商等) 数据库2包含一个数据库,其中包含许多PL/SQL包和过程,我可以执行这些包和过程来更新数据库中的信息 这里基本上是我试图用伪代码实现的,但我对PL/SQL包和过程没有太多经验,尤其是在powershell中 是否可以从powershell执行wwsec_api.set_defaultgroup过程 SELECT userID FROM Database2
- 数据库1包含我的用户ID和用户类型(例如:员工、分包商等)
- 数据库2包含一个数据库,其中包含许多PL/SQL包和过程,我可以执行这些包和过程来更新数据库中的信息
SELECT userID FROM Database2.users
while (userID){
SELECT employeeType FROM Database1.users WHERE Database2.users.userID = Database1.users.userID
If employeeType = 'Employee' then
run Database2 PL/SQL package procedure wwsec_api.set_defaultgroup(ID, USER)
end if
}
如果您只是让PowerShell对SQLPLUS进行两次系统调用,并执行从第一次调用的输出生成的SQL脚本,该怎么办 比如:
- 对DB 1执行SQL Plus查询,将结果返回到文件中
- 读取文件,并对每个用户针对DB2执行SQL plus
- 比较结果employee type,如果是employee,则再次执行SQL plus
如果您不想使用SQLPlus,请记住PowerShell可以使用.NET framework,因此您可以实例化几个数据库连接对象并直接执行查询,将结果返回到.NET对象中。我不想在这里使用PowerShell。相反,我会使用一个。数据库链接将Database2连接到Database1,并允许我将数据从Database1拉到Database2 您可以使用以下内容创建数据库链接
CREATE DATABASE LINK Database1 CONNECT TO user IDENTIFIED BY password USING 'database1_tns_name';
用数据库1上架构所有者的用户名和密码替换user
和password
,用数据库2的tnsnames.ora
文件中数据库1的tns名称替换Database1\u tns\u name
。(如果Database2的tnsnames.ora
文件中不存在Database1的条目,则可能需要为其创建条目。)
然后,在Database2上运行类似于以下内容的PL/SQL块:
DECLARE
v_employeeType users.employeeType@Database1%TYPE;
BEGIN
FOR user_rec IN (SELECT userID FROM users)
LOOP
SELECT employeeType INTO v_employeeType
FROM users@Database1
WHERE userID = user_rec.userID;
IF v_employeeType = 'Employee' THEN
-- Check the parameters of this procedure - where does ID come from,
-- and do you really want to use the built-in function USER, which
-- returns the name of the currently-connected user?
wwsec_api.set_defaultgroup(ID, USER);
END IF;
END LOOP;
END;
这种方法会起作用,但有一些问题(也许有办法解决?)我需要能够安排它每天运行,也能够随意运行。此外,我需要能够更新script/sql/program,我们的DBA能够很好地锁定数据库(他们应该这样做)。如果我找不到从我的电脑上运行此程序的方法,我肯定会走这条路。@professionalaftermal:你可以创建一个过程,而不是匿名块。然后,您可以随时从SQL*Plus调用它,也可以使用DBMS_调度程序对其进行调度。这正是PL/SQL的用武之地。如果您可以将代码保存在服务器上,那么它可能会更快、更容易管理,也更安全。