などのステートメントが正常に準備され、カーソルが、その後再度オープン心に留めておくべき事はDECLARE
文が実行可能ではないということです。これはコンパイル時の宣言です。 PREPARE
およびOPEN
が実行可能です。
以下は、動的SQLを使用する完全に機能するプログラムです。DeclareCursor
サブルーチンが実際に呼び出されることはありません。重要なのは、PREPARE
ステートメントが実行されたときのgSqlStmtのステートメントです。
**FREE
ctl-opt main(mymain);
ctl-opt option(*srcstmt);
dcl-c QUOTE const('''');
dcl-s gSqlStmt varchar(500);
dcl-proc MyMain;
dcl-s company char(3);
dcl-s part char(25);
dcl-s desc char(30);
dcl-s msg char(50);
dcl-s selComp char(3);
selComp = 'A06';
gSqlStmt = 'select pmco#, pmpart, pmdesc'
+ ' from pdpmast'
+ ' where pmco# = ' + QUOTE + selComp + QUOTE;
exsr OpenCursor;
exsr FetchData;
exec SQL close C1;
selComp = 'A15';
gSqlStmt = 'select pmco#, pmpart, pmdesc'
+ ' from pdpmast'
+ ' where pmco# = ' + QUOTE + selComp + QUOTE;
exsr OpenCursor;
exsr FetchData;
exec SQL close C1;
*INLR = *ON;
return;
begsr DeclareCursor;
exec SQL
declare C1 cursor for S1;
endsr;
begsr OpenCursor;
exec SQL prepare S1 from :gSqlStmt;
exec SQL open C1;
endsr;
begsr FetchData;
exec sql fetch next from C1 into :company, :part, :desc;
msg = company + ':' + part + ':' + %subst(desc:1:20);
dsply msg;
endsr;
end-proc;
任意のエラー処理を持っていないまた、上記直接ステートメントに、入力変数、selCompを連結するの悪い習慣を含有します。 SQLインジェクション攻撃のため、これはどの言語でも良い考えではありません。
パラメータマーカーを使用するより優れたバージョンは以下のとおりです。ステートメントはもう変更する必要はありません。だから私はそれを一度しか準備する必要はありません。レコードの選択は、OPEN ... USING...
ステートメントが呼び出された時点のselCompの値によって決まります。
**FREE
ctl-opt main(mymain);
ctl-opt option(*srcstmt);
dcl-s gSqlStmt varchar(500);
dcl-proc MyMain;
dcl-s company char(3);
dcl-s part char(25);
dcl-s desc char(30);
dcl-s msg char(50);
dcl-s selComp char(3);
gSqlStmt = 'select pmco#, pmpart, pmdesc'
+ ' from pdpmast'
+ ' where pmco# = ?';
exec SQL prepare S1 from :gSqlStmt;
selComp = 'A06';
exsr OpenCursor;
exsr FetchData;
exec SQL close C1;
selComp = 'A15';
exsr OpenCursor;
exsr FetchData;
exec SQL close C1;
*INLR = *ON;
return;
begsr DeclareCursor;
exec SQL
declare C1 cursor for S1;
endsr;
begsr OpenCursor;
exec SQL open C1 using :selComp;
endsr;
begsr FetchData;
exec sql fetch next from C1 into :company, :part, :desc;
msg = company + ':' + part + ':' + desc;
dsply msg;
endsr;
end-proc;
ただし、ここでは動的SQLは実際には必要ありません。ホスト変数を持つ静的なステートメントは正常に動作します。静的SQLでは、は必要ありません。また、OPEN
にはselCompを指定する必要はありません。コンパイル時に自動的に行われます。
**FREE
ctl-opt main(mymain);
ctl-opt option(*srcstmt);
dcl-s gSqlStmt varchar(500);
dcl-proc MyMain;
dcl-s company char(3);
dcl-s part char(25);
dcl-s desc char(30);
dcl-s msg char(50);
dcl-s selComp char(3);
selComp = 'A06';
exsr OpenCursor;
exsr FetchData;
exec SQL close C1;
selComp = 'A15';
exsr OpenCursor;
exsr FetchData;
exec SQL close C1;
*INLR = *ON;
return;
begsr DeclareCursor;
exec SQL
declare C1 cursor for
select pmco#, pmpart, pmdesc
from pdpmast
where pmco# = :selComp;
endsr;
begsr OpenCursor;
exec SQL open C1;
endsr;
begsr FetchData;
exec sql fetch next from C1 into :company, :part, :desc;
msg = company + ':' + part + ':' + desc;
dsply msg;
endsr;
end-proc;
あなたのコードや、あなたがやろうとしていることのいくつかの例を示します。実行の間にステートメントをどのように変更したいのですか?どのようなエラーメッセージが表示されますか? – Charles
ポストは、ただちにSQL文を作成します。その後、それを実行します。 order by節がすぐに変化しているのが分かります。 – danny117