Oracle 如何从powershell执行PL/SQL包?

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

我正在尝试编写powershell脚本,以帮助跨多个数据库执行一些用户维护任务

  • 数据库1包含我的用户ID和用户类型(例如:员工、分包商等)
  • 数据库2包含一个数据库,其中包含许多PL/SQL包和过程,我可以执行这些包和过程来更新数据库中的信息
这里基本上是我试图用伪代码实现的,但我对PL/SQL包和过程没有太多经验,尤其是在powershell中

是否可以从powershell执行wwsec_api.set_defaultgroup过程

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的用武之地。如果您可以将代码保存在服务器上,那么它可能会更快、更容易管理,也更安全。