Oracle SQL оператор if на основе параметра, переданного через. sh скрипт - PullRequest
0 голосов
/ 04 августа 2020

У меня есть сценарий оболочки, который вызывает некоторые SQL вот так

sqlplus system/$password@$instance @./oracle/mysqlfile.sql $var1 $var2 $var3

Затем в mysqlfile. sql, я определяю такие свойства:

DEFINE var1=&1
DEFINE var2=&3
DEFINE var3=&3

Позже в файл, я вызываю другой SQL скрипт:

// i wish to wrap this in a if statement - pseudo-code
if(var3="true") do the following
@./oracle/myOthersqlfile.sql &&varA &&varB 

Я не уверен, как это реализовать, любые предложения приветствуются

Ответы [ 2 ]

1 голос
/ 04 августа 2020

Вы можете (ab) использовать переменные подстановки:

set termout off
column var3_path new_value var3_path
select case
  when '&var3' = 'true' then './oracle/myOthersqlfile.sql &&varA &&varB'
  else '/dev/null'
  end as var3_path
from dual;
set termout on

@&var3_path

Запрос между командами set termout - которые просто скрывают вывод запроса - использует выражение case, чтобы выбрать реальный путь к файлу или фиктивный файл; Я использовал / dev / null, но у вас может быть собственный файл no-op, который ничего не делает, если это понятнее. Результатом запроса является псевдоним var3_path. Строка new_value перед тем, как превратить это в переменную подстановки. Затем @ расширяет эту переменную.

Итак, если var3 - «истина», то выполняется:

@./oracle/myOthersqlfile.sql &&varA &&varB

(или, фактически, с varA и varB переменные уже заменены их фактическими значениями), и если это ложь, он запускает:

@/dev/null

, который ничего не делает, тихо.

Вы можете set verify on вокруг этого кода, чтобы увидеть, когда и где происходит подстановка.

0 голосов
/ 04 августа 2020

Вы не можете реализовать процедурную логику c в sqlplus. У вас есть следующие варианты:

  • Реализовать IF-THEN-ELSE logi c внутри сценария оболочки, который запускает sqlplus.
  • Используйте PL / SQL, но затем ваш SQL сценарий должен вызываться как процесс внутри анонимного блока, а не как внешний сценарий.

В вашем случае самый простой способ - изменить сценарий оболочки.

#/bin/bash
#
# load environment Oracle variables
sqlplus system/$password@$instance @./oracle/mysqlfile.sql $var1 $var2 $var3
# if then
if [ $var3 == "true" ]
then 
   sqlplus system/$password@$instance @./oracle/myOthersqlfile.sql 
fi 

Вы должны понимать, что sqlplus - это просто CLI (интерфейс командной строки). Таким образом, вы не можете применить к нему процедурный лог c.

Я понятия не имею, что вы делаете в этих сценариях sql (запуск DML, создание файлов и т. Д. c), но лучший подход было бы преобразовать их в PL / SQL, тогда вы можете применить любой logi c, который вам нужен.

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