簡體   English   中英

如何將參數從 shell 腳本傳遞到 SQL 腳本?

[英]How to pass a parameter from shell script to SQL script?

我有 2 個腳本 - 一個 shell 和一個 sql。

我的 shell 腳本與此類似:

export nbr=&1 

runsql script_name.sql

我試圖在運行腳本時為 nbr 傳遞參數。

對應的 sql 腳本如下:

insert into table1

select * from table2 

where year='&1'

我得到如下錯誤:

"enter value for year: old 22: where year='$1') 
                       new 22: where year='commit')"

我將通過一個基於我自己的腳本的示例來展示如何輕松處理它。 在這個腳本中,我定義了一個簡單的 function run_sql(DESCR, SCRIPT, DATABASES) ,其中

  • DESCR - 簡短描述
  • SCRIPT - sqlplus run arguments,即腳本名稱及其參數
  • DATABASES - 上面定義的要在其上運行它的 dbname 列表

然后我們可以像這樣輕松地使用它:

run_sql "1st script" "@sql1.sql param1" db1 db2
run_sql "2nd script" "@sql2.sql param1 param2 param3" db1 db2 db3

在這里我們執行:

  • “sql1.sql”在 db1 和 db2 上有 1 個參數
  • “sql2.sql”在 db1、db2 和 db3 上帶有 3 個 arguments

我們將所有 output 保存到自己的日志文件中。

完整示例測試 output: https://gist.github.com/xtender/465fe1121befeed7fe0ae1a3

簡單腳本test.sh

#!/bin/bash

# Here you can define your db connection strings:
db1=xtender/pass@PDB19C_11
db2=xtender/pass@PDB19C_11
db3=xtender/pass@PDB19C_11
#####################################################################
# functions:
# Function syntax: run_sql(DESCR, SCRIPT, DATABASES)
# where
#   DESCR - short description
#   SCRIPT - sqlplus run arguments, ie script name and its parameters
#   DATABASES - list of dbname defined above on which you want to run it
run_sql(){
  local DESCR="$1"; shift
  local SCRIPT="$1"; shift
  local databases=("$@")
  echo =================================================
  echo =   $DESCR
  echo = Going to execute $SCRIPT...
  read -a res -p "Enter 'skip' to skip this step or press Enter to execute: "
  if [[ $res = "skip" ]]
  then
    echo Skipping $SCRIPT...
  else
    echo Executing $SCRIPT...
    for db in "${databases[@]}"
        do
          local cur=${!db}
          echo Executing $SCRIPT on $db - $cur...
          sqlplus -L -S ${cur} $SCRIPT >>log-$db.log 2>&1
          echo Done.
        done
    echo =================================================
  fi
}
#####################################################################


# Here we execute a script "sql1.sql" with one argument "param1" on db1 and db2:
run_sql "1st script" "@sql1.sql param1" db1 db2

# Here we execute a script "sql2.sql" with 3 arguments on db1,db2 and db3:
run_sql "2nd script" "@sql2.sql param1 param2 param3" db1 db2 db3
echo ============================================
echo === Done
echo ============================================

Then we can create sql scripts, for example sql1.sql and sql2.sql : sql1.sql requires one argument and sql2.sql - 3 arguments:

sql1.sql:

select '&1' as output from dual;
exit;

sql2.sql:

select
  '&1' out1,
  '&2' out2,
  '&3' out3
from dual;
exit;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM