10

私はas400での作業が初めてで、4つのテーブルを結合するクエリがあります。クエリ自体は問題なく、STRSQL で実行され、結果が表示されます。

私が苦労しているのは、クエリをプログラムで実行できるようにすることです (最終的には、スケジュールされた CL スクリプトから実行されます)。

RUNQRYで実行するクエリを含む物理ファイルを作成しようとしましたが、実際の結果セットではなく、クエリ自体を表示するだけです。

私が間違っていることを誰かが知っていますか?


アップデート

方向性とリソースを提供してくれた皆さんに感謝します。彼らのおかげで、目標を達成することができました。それが誰かを助ける場合、これは私がやったことです(これはすべて独自のライブラリALLOCATEで行われました):

  1. ソース物理ファイル (CRTSRCPF を使用): QSQLSRC を作成し、SQL ステートメントを含む、タイプが TXT の SQLLEAGSEA という名前のメンバーを作成しました。

  2. 別のソース物理ファイル QCLSRC を作成し、タイプが CLP の POPLEAGSEA という名前のメンバーを作成しました。このメンバーは、現行ライブラリーを ALLOCATE に変更し、RUNSQLSTM を使用して照会を実行します (詳細は以下を参照)。実際のコマンドは次のとおりです。

    RUNSQLSTM SRCFILE(QSQLSRC) SRCMBR(SQLLEAGSEA) COMMIT(*NONE) NAMING(*SYS)

  3. 次のコマンドを実行して、(ADDJOBSCDE を使用して) スケジュールされたジョブに CLP を追加しました。

CALL PGM(ALLOCATE/POPLEAGSEA)

RUNSQLSTM に関しては、調査の結果、SELECT ステートメントをサポートしていないため、この関数を使用できないことがわかりました。私が質問で示していなかったのは、結果に対して何をする必要があるかということでした.結果のデータを別のテーブルに挿入するつもりでした.より速く)。事実上、私は SELECT を実行するつもりはありませんでした。私の最終結果は、実際には INSERT です。したがって、私の SQL ステートメント (SQLLEAGSEA 内) は次のように始まります。

ALLOCATE/LEAGSEAS に挿入

選択...何とか何とか何とか...

私の調査によると、RUNSQLSTM は結果を処理するメカニズムがないため、SELECT をサポートしていません。赤ちゃんの一歩を踏み出すのをやめて、同じステートメントで SELECT と INSERT を実行する必要があることに気付いたとき、私の主な問題は解決しました。

みんなありがとう!

4

6 に答える 6

5

このコマンドはRUNSQLSTM、物理ファイル・メンバーまたはストリーム・ファイルで静的 SQL ステートメントを実行することです。

これは非対話型コマンドであるため、結果セットを返そうとする SQL ステートメントは実行されません。

対話式ステートメントを実行する機能など、より詳細な制御が必要な場合は、Qshell db2 ユーティリティーを参照してください。

例えば:

QSH CMD('db2 -f /QSYS.LIB/MYLIB.LIB/MYSRCFILE.FILE/MYSQL.MBR')

db2ユーティリティは *SQL 命名規則のみを受け入れることに注意してください。

于 2012-10-16T20:30:37.830 に答える
4

QMクエリ

必要なすべてのSQLが単一の複雑なSQLステートメントであり、これがそのように聞こえる場合、最善の策はクエリ管理クエリを使用することです(ここのQMクエリマニュアルを参照)

結果は、ディスプレイ、スプール・ファイル、または物理ファイル(つまり、DB2テーブル)に送ることができます。対話式で実行した場合のデフォルトの出力は画面に表示されますが、(スケジュールされた)バッチジョブで実行した場合、デフォルトでスプールファイルレポートになります。

WRKQMQRYQMクエリは、プロンプトモード(Query / 400によく似ています)またはSQLモードでインタラクティブに作成できます。または、コマンドを使用して、ソースからQMクエリをコンパイルできますCRTQMQRY
QMクエリを実行するには、STRQMQRYコマンドを実行します。

RUNSQLコマンド

IBM i 7.1が完全に最新であり、Technology Refresh 4(TR4)がインストールされているシステムを使用している場合は、新しいRUNSQLコマンドを使用して単一のステートメントを実行することもできます。(developerWorksの説明を参照してください)

RUNSQLSTMcmdを使用したSQLスクリプティング

CLから、ソースファイルメンバーから複数のSQLステートメントのSQLスクリプトを実行できます。このための標準のデフォルトのソース・ファイル名はありませんが、QSQLSRCが一般的に使用されます。ソースメンバーには、複数の非対話型SQLステートメントを含めることができます。これは、理論的には結果の送信先がわからないため、SELECTステートメントを(直接)使用できないことを意味します。CL:CLコマンドは、プレフィックスが指定されている場合でも許可されます。SQLステートメントとCLステートメントはどちらもセミコロンで終了する必要があります;。SQLステートメントはデータを画面に直接表示できませんが、同じ制限はスクリプト化されたCLコマンドには適用されません。

コマンドの前にプレフィックス「CL:」を付けることで、コマンドをスクリプトSTRQMQRYに埋め込むことができます。RUNSQLSTMSTRQMQRYは出力を画面、レポート、または出力テーブルに送ることができるため、これは非常に便利です。

SELECTクエリからの出力をファイルに送信するには、INSERTステートメントまたはCREATETABLEステートメントのいずれかを使用できることに注意してください。

CREATE TABLE newtbl AS
  ( full-select )
  WITH DATA;

または、ジョブのQTEMPライブラリに作成したテーブルに結果を配置するには、次のようにします。

DECLARE GLOBAL TEMPORARY TABLE AS
  ( full-select )
  WITH DATA;

[注:によって使用されるソースを作成する場合、コンパイラーはソースデータの79列のみを使用するため(シーケンスに12を追加し、日付を変更= 91)、CRTQMQRYとして作成することをお勧めします。CRTSRCPF yourlib/QQMQRYSRC RCDLEN(91)ただし、追加のフォーマットを提供するために使用できるQMフォームの場合、CRTQMFORMコンパイラーは81列を使用するためRCDLEN(93)、QQMFORMSRCをお勧めします。]

于 2012-10-17T22:47:40.527 に答える
2

QM Query、RUNSQLSTM、または QShell を使用せずに、CL プログラムで SQL を直接実行することが (現在) 可能です。

これは、CL プログラムでの RUNSQL ステートメントについて説明している記事です...

http://www.mcpressonline.com/cl/the-cl-corner-introducing-the-new-run-sql-command.html

この記事には、サポートされている OS レベルに関する情報と、RUNSQL ステートメントを使用するいくつかの方法の明確な例が含まれています。

于 2013-01-18T21:43:28.237 に答える
2

RUNQRY は、WRKQRY という名前の別のユーティリティによって作成されたクエリを実行できるユーティリティです。ファイルに保持されている SQL ステートメントを本当に処理したい場合は、RUNSQLSTM を試してください。データベース ファイルではなく、ソース物理ファイルを使用してステートメントを格納します。そのソース物理ファイルの標準名は QQMQRYSRC です。そのファイルを作成するには、CRTSRCPF yourlib/QQMQRYSRC. その後、PDM を使用してそのソース PF を操作できます。WRKMBRPDM yourlib/QQMQRYSRC。F6 を使用して、新しいソース メンバーを作成します。ソースタイプをTXTにします。次に、オプション 2 を使用して、SEU というエディターを開始します。SQL ステートメントをこのエディターにコピーして貼り付けます。F3 でソースを保存します。ソースを保存したら、RUNSQLSTM を使用して実行します。

于 2012-10-16T20:32:27.837 に答える
1

もちろん、まったく異なる解決策があります。ステートメントを含むプログラムを作成してコンパイルすることができます。特にプラットフォームに慣れていない場合は、もう少し長く読む必要がありますが、結果をどうするかについて最も柔軟に対応できるはずです. SQL は、C、C++、RPG、RPG/LE、REXX、PL (これが何であるかはわかりません)、および COBOL で使用できます。そうすることで、あるクエリの結果に対して処理可能な方法で反応し、取得した内容に基づいて他のクエリを開始/作成できます。

一部の昔ながらの RPG プログラマーは、RPG に SQL が存在することを否定するためにあらゆることを試みますが、今日では多くの場合、SQL のみを使用して (RPG を知っている人にとっては F-Spec を使用せずに) 直接ファイル アクセスを行わずに RPG プログラムを作成することが可能です。

ソリューションがうまく機能する場合は、完璧です。他に何かする必要がある場合は、次の pdf を調べてみてください: http://publib.boulder.ibm.com/infocenter/iseries/v5r3/topic/rzajp/rzajp.pdf

RPGへの統合はそれほど悪くありません。通常のプログラム フローで動作します。次のようになります (自由形式):

/free
    // init search values:
    searchval = 'Someguy';
    // so the sql query:
    exec sql
      SELECT colum1, colum2
      INTO :var1, :var2
      FROM somelib/somefile
      WHERE keycol=:searchval;
    // now do something with the values:
    some_proc(var1);
/end-free

この中でvar1、 、var2、およびsearchvalは通常の RPG 変数です。引用は不要です。また、データ構造 (外部で定義されたもの、たとえば、ファイル自体のレコード形式が適切に適合する) でも機能します。もちろん、カーソルやループも操作できます。RPG系のプログラムはこれで読みやすくなった気がします。

于 2012-10-24T12:33:43.173 に答える
1

これは 2 つのステップで機能します。

 RUNSQL SQL('CREATE TABLE QTEMP/REPORT AS (SELECT +         
          EXTRACT_DATE , SYSTEM, ODLBNM, SUM( +              
          OBJSIZE_MB ) AS LIB_SIZE FROM +                    
          ZSYSCOM/DISKRPTHST WHERE ODLBNM LIKE +             
          ''SIS%'' GROUP BY EXTRACT_DATE, SYSTEM, +          
          ODLBNM ORDER BY LIB_SIZE DESC) WITH +              
          DATA') COMMIT(*NONE) DATFMT(*USA) DATSEP(/)        

 RUNQRY     QRYFILE((QTEMP/REPORT)) OUTTYPE(*PRINTER) +          
          OUTFORM(*DETAIL) PRTDFN(*NO) PRTDEV(*PRINT)        

最初のステップでは qtemp に一時テーブルの結果を作成し、2 番目のステップ/行ではスプール ファイルに対して一時テーブルのみに対してアドホック クエリを実行します。

ありがとう、マイケル・フリロット

于 2013-06-08T19:20:00.717 に答える