0

私はいくつかの tcl コードを変更している最中で、作成者はコード内で SQL ステートメントを定義していました。

データベース接続コードやパッケージの require tclodbc ステートメントは含めていませんが、これがテスト ケースのフローのすべてです。

set query "alter table dbo.customer add constraint customer_pk primary key (c_custkey) with (maxdop=$maxdop)"
set maxdop 2

    if {[catch {db $query} err] } {
        puts "SQL ERROR"
        puts [format "ERROR is ===\n%s\n===" $err]
        }

ただし、これをもう少し一般的にして、ファイルから sql を読みたいと思います。(この方法で、プログラムを編集せずに SQL を試すことができます)

だから私は試しました:

set silly_id [open silly.sql" r]
set sql_in   [gets $silly.sql]  

    if {[catch {db $sql_in} err] } {
        puts "SQL ERROR"
        puts [format "ERROR is ===\n%s\n===" $err]
    }

私は、想像できる eval と subst のほぼすべての組み合わせを試しましたが、それでも動作しません。

4

2 に答える 2

2

あなたが探しているコードはこれです:

# Correct pattern for reading from a file
set silly_id [open "silly.sql" r]
set sql_in   [read $silly_id]
close $silly_id

# Do substitutions in the SQL before evaluation
if {[catch {db [subst $sql_in]} err] } {
    puts "SQL ERROR"
    puts [format "ERROR is ===\n%s\n===" $err]
}

ちょっと待って!

このコードには、 の値の問題に対して非常に脆弱であるという大きな$maxdop問題があります(たとえば、信頼されていないユーザーからのものであるために予期しない値を持つ場合)。一般に、代わりにパラメーター化されたクエリを使用する必要があります。ALTER TABLEこれは(ユーザーからの情報を実際に使用してはならない)にとってはそれほど重要ではありませんがSELECT、 、UPDATEINSERTおよびについては、DROPこれまで以上に注意する必要があります。パラメータ化されたステートメントを正しく取得する方がはるかに簡単です。ドキュメントのこの例からわかるように、TclODBC もそれらをサポートしています。

% db statement s "select fullname from article where id=132"
s
%s
{FullName132}
% db statement s2 "select fullname from article where id1=?" 整数
s2
%s2 132
{FullName132}
于 2012-04-23T19:02:11.100 に答える
0

TCL でファイルを開いて読み取る方法を尋ねているだけのようですね。SQL部分が正常に機能しているようです。もしそうなら、これと同じくらい簡単です(ここから取得)

     set fp [open "somefile" r]
     set file_data [read $fp]
     close $fp
于 2012-04-23T16:15:47.047 に答える