Bash сценарии & PL SQL Процедура - PullRequest
0 голосов
/ 22 апреля 2020

Я пытался заставить его работать часами ... Но я предполагаю, что это вне моего понимания ...

Вот моя проблема: я пытаюсь запустить скрипт оболочки, который сначала выполняет SQL запросить сбор данных в переменную $ tmp, затем запустить процедуру PL / SQL с использованием содержимого $ tmp. Процедура PL / SQL должна называться X time, где X - номер строки из запроса SQL, лучше всего иметь одно соединение для каждой строки из вывода SQL.

Итак, вот что я попробовал:

1 - SQL ЗАПРОС: Сохраните WANTED_DATA в $ tmp var, чтобы позже использовать его в процедуре PL SQL. Например, скажем, "WANTED_DATA" = "123, 321; 789, 987;" Эта часть работает нормально, но при необходимости ее можно изменить, если результат сохраняется в переменной.

#!/bin/sh
function SQL_REQ {
    tmp=$(`$APP_SQL -S $USR/$PWD@$DB <<-eof
    select  WANTED_DATA
    from TABLE
    exit
    eof`)
    PLSQL_Proc #This call the second function
}

2 - PL SQL Процедура: А вот и сложная часть. Функция, которая будет запускать процедуру PL SQL, используя "$ tmp" из предыдущего запроса в процедуре PL SQL. Другая проблема, с которой я столкнулся, заключается в том, что даже если эта работа сработает, она будет подключаться и отключаться от базы данных для каждой строки (разделенной символом «;») $ tmp.

function PLSQL_Proc {
     while IFS=; read -r WANTED_DATA
     do
          $APP_SQL -S $USR/$PWD@$DB<<-eof
          DECLARE
               result varchar2(100);
          BEGIN
               result := scripts.remove_data("$WANTED_DATA");
          END;
          /
          eof
          done <<< "$tmp"
}

Текущая ошибка (и):

'123, 321' : Command not found - at line 12 (= line Done <<< "$tmp")

scripts.remove_data() : invalid number of arguments

NB:

-Использование Redhat (предыдущая версия - еще не потребовалось время для обновления, ха-ха), и Oracle DB

Если кто-либо из вас есть идея, пожалуйста, дайте мне знать.

Спасибо,

1 Ответ

0 голосов
/ 23 апреля 2020

Хорошо, не так уж сложно в конце концов, это можно сделать даже в одной функции:

   function PLSQL_Proc 
    {
         while IFS=; read -r WANTED_DATA
    #In case WANTED_DATA are multiple row, need to add a separator to 
    # read after -r option, like : -d';'
    #Then concatenate a ";" after WANTED_DATA, like :  WANTED_DATA||';'
         do
              $APP_SQL -S $USR/$PWD@$DB<<-eof
              DECLARE
                   result varchar2(100);
              BEGIN
                   result := scripts.remove_data("$WANTED_DATA");
              END;
              /
              eof

             done <<< `$APP_SQL -S $USR/$PWD@$DB <<-eof
                    select WANTED_DATA
                    from TABLE
                    exit
                    eof`
    }
...