Как выполнить пакет PL / SQL из powershell? - PullRequest
3 голосов
/ 01 апреля 2011

Я пытаюсь написать скрипт powershell, чтобы помочь с некоторыми задачами обслуживания пользователей в нескольких базах данных.

  • База данных 1 содержит мой идентификатор пользователя и тип пользователя (например, сотрудник, субподрядчик и т. Д.)
  • База данных 2 содержит базу данных со многими пакетами PL / SQL и процедурами, которые я могу выполнить для обновления информации в этой базе данных.

Вот, по сути, то, что я пытаюсь выполнить в псевдокоде, но у меня нет большого опыта работы с пакетами и процедурами PL / SQL, особенно из powershell.

Можно ли выполнить процедуру wwsec_api.set_defaultgroup из powershell?

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 ]

2 голосов
/ 01 апреля 2011

Я бы не хотел использовать PowerShell здесь. Вместо этого я бы использовал ссылку на базу данных . Ссылка на базу данных соединит Database2 с Database1 и позволит перетащить данные из Database1 в Database2.

Вы создаете ссылку на базу данных, используя что-то вроде

CREATE DATABASE LINK Database1 CONNECT TO user IDENTIFIED BY password USING 'database1_tns_name';

Замените user и password на имя пользователя и пароль владельца схемы в базе данных Database1, а database1_tns_name на имя TNS для Database1 в файле tnsnames.ora базы данных2. (Вам может понадобиться создать запись для базы данных Database1, если она еще не существует в файле tnsnames.ora базы данных Database2.)

Затем я бы запустил блок PL / SQL, аналогичный приведенному ниже, в Database2:

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;
0 голосов
/ 01 апреля 2011

Что если у вас только PowerShell, сделайте два системных вызова SQLPLUS и выполните сценарий SQL, который вы сгенерируете из результатов первого вызова?

Что-то вроде:

  • Выполнить запрос SQL Plus для БД 1, вернуть результаты в файл.
  • Прочитать файл и для каждого пользователя выполнить SQL plus для DB2.
  • Сравните тип сотрудника результата, если это сотрудник, затем снова выполните SQL plus.

Если вы не хотите использовать SQLPlus, помните, что PowerShell может использовать .NET Framework, поэтому вы можете создать пару объектов Database Connection и выполнить ваши запросы напрямую, возвращая результаты в объекты .NET.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...