如何从PowerShell执行PL / SQL包?

时间:2011-04-01 17:58:13

标签: oracle powershell plsql package

我正在尝试编写一个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
}

2 个答案:

答案 0 :(得分:2)

我很想不要在这里使用PowerShell。相反,我会使用database link。数据库链接将Database2连接到Database1,并允许我将数据从Database1拉到Database2。

使用

之类的东西创建数据库链接
CREATE DATABASE LINK Database1 CONNECT TO user IDENTIFIED BY password USING 'database1_tns_name';

userpassword替换为Database1上架构所有者的用户名和密码,将database1_tns_name替换为Database2的tnsnames.ora文件中TNS名称为Database1。 (如果Database1的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;

答案 1 :(得分:0)

如果您只是让PowerShell对SQLPLUS执行两次系统调用,并执行从第一次调用的输出生成的SQL脚本,该怎么办?

类似的东西:

  • 对DB 1执行SQL Plus查询,将结果返回到文件中。
  • 读取文件,并为每个用户执行SQL加上DB2。
  • 比较结果员工类型,如果是员工,则再次执行SQL plus。

如果您不想使用SQLPlus,请记住PowerShell可以使用.NET框架,因此您可以实例化几个数据库连接对象并直接执行查询,将结果返回到.NET对象。