2016-05-20 24 views
0

bashスクリプトから、ストアド・プロシージャをpythonスクリプトからコールしようとしています。スクリプトの呼び出しは正常に動作しますが、問題はありません。問題はPRIMARY_KEYSフィールドのパラメータにあります。単一PKで、それが正常に動作しますが、複数のPKすなわち、A, B, Cのために、私はOracleエラーを取得:ORA-01756: quoted string not properly terminatedbashスクリプトからストアド・プロシージャをコールすると、ORA-01756:引用符付きの文字列が正しく終了しない

のPython:

... 
cmd = 'sh pkg_mypkg.sh \'%s\' \'%s\' my_sp_which_adds_a_primary_key \'%s\'' % db_login_str db_table primary_keys 
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=TRUE) 
... 

バッシュ:

DB_LOGIN_STR=$1 
DB_TABLE=$2 
FUNC_TO_EXEC=$3 
PRIMARY_KEYS=$4 

... 

function my_sp_which_adds_a_primary_key() { 
    SP_RES=`sqlplus -silent $1 <<-EOM 
    ... 
    BEGIN 
    pkg_mypkg.my_sp_which_adds_a_primary_key($2, $3); 
    END; 
    ... 
    EOM` 
    echo $SP_RES 
} 

... 

function main() { 
    case $FUNC_TO_EXEC in 
    "my_sp_which_adds_a_primary_key") 
     my_sp_which_adds_a_primary_key(DB_LOGIN_STR, DB_TABLE, PRIMARY_KEYS);; 
    esac 
} 

main 

SP:

procedure my_sp_which_adds_a_primary_key(db_table in varchar2, primary_keys in varchar2) 
is 
begin 
execute immediate 'alter table ' || db_table || ' add constraint ' || db_table || '_PK primary_key (' || primary_keys || ') parallel 8'; 
end my_sp_which_adds_a_primary_key; 

免責事項として、私はテステストウィンドウでこの関数をPLSQLのUIインターフェイスの中で直接テストし、それは複数のw /複数でうまく動作しますPKs私が理解できないBash内で実行されたときに、格納されたprocにどのように渡っているかに問題があります。私は\'\'%s\'\'\'%s\'\'\"%s\""%s"の組み合わせを試してみました。正しいフォーマットが何であるかはっきりしていません。事前に

おかげで、私が試してみた

答えて

0

最初のものは、このようなあなたのPythonコードからコマンドを呼び出すことです:

cmd = ["pkg_mypkg.sh", db_login_str, db_table, "my_sp_which_adds_a_primary_key", primary_keys] 
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 

the documentationから(私の強調):

args should be a sequence of program arguments or else a single string. By default, the program to execute is the first item in args if args is a sequence. If args is a string, the interpretation is platform-dependent and described below. See the shell and executable arguments for additional differences from the default behavior. Unless otherwise stated, it is recommended to pass args as a sequence.

また、私はと、shへの呼び出しを削除しました。これらは両方とも問題を引き起こす可能性があり、前者の場合はです。代わりにpkg_mypkg.shが適切なシバンで実行可能であることを単に保証する必要があります。再びドキュメント:

On Unix with shell=True , the shell defaults to /bin/sh . If args is a string, the string specifies the command to execute through the shell. This means that the string must be formatted exactly as it would be when typed at the shell prompt. This includes, for example, quoting or backslash escaping filenames with spaces in them. If args is a sequence, the first item specifies the command string, and any additional items will be treated as additional arguments to the shell itself.


それはそこにあなたが前の$せずに変数を呼び出しているが、あるかもしれない、と私はにSPのテキストを置くことをお勧めしたいどのような問題を言うのは難しいの完全なシェルスクリプトを見ずにbackticksの中のheredocのような構造に頼るのではなく、ファイルです。 http://shellcheck.net/は、エラーと非標準的な使用を見つけるのに役立ちます。

+0

ありがとう、私はすぐにそれらをテストするつもりです。今のところ、 'PRIMARY_KEY' var内の空白を削除したので、' A、B、C'は 'A、B、C'になりました。 「A、B、C」がちょうど「A」になったところで、うごめきなことが起こっていました。 – Qbert

関連する問題