4

DB2 sqlを理解しようとする課題に直面しています(注:私はMS SQL Serverから来ています):P。

これがシナリオです。1つにはIDとその他の詳細があり、もう1つには各IDに対応する他の多くの情報がある2つのテーブルがあります。

  ID              Info for ID
_______      ____> _______
|     |     /      |     |
|  T1 |<---------> |  T2 |
|_____|     \____> |_____|

SQL Serverから来て、私は次のようなスクリプトを実行することに慣れています。

Declare @ID  int
Declare @ID1 int

select @ID=ID from T1 where col1 = @ID1

select * from T2 where ID = @ID

これはすべて正常に実行され、ID1に対応するIDを取得します。これを使用して、T2からIDに関するすべての情報を取得できます。

悲しいことに、DB2では、これは私の顔の中で爆発します。このクエリをもう一度実行すると、私は永遠に失望します:(。

私はいくつかの調査を行い、これを書きました(変数宣言でさえ立ち往生しています)。

--#SET TERMINATOR @
BEGIN ATOMIC
DECLARE UID char(30);
END @

他の人にとってはうまくいきましたが、次のエラーが発生します:

BEGIN ATOMIC
DECLARE UID char(30);
END

ILLEGAL USE OF KEYWORD ATOMIC.  TOKEN  WAS EXPECTED. SQLCODE=-199, SQLSTATE=42601, DRIVER=3.63.108

他の情報:

IBM DB2 for z / OS V9.1 IBM Data Studio V3.1.1.0

[編集:DECLAREを使用]私が試したもう1つのことは、うまくいきませんでした。

CREATE VARIABLE UID CHAR(30) DEFAULT 'USERID'; 
select * from testdb2.T1 A WHERE A.UID=v_UID;
--some other activity goes here
--and here
DROP VARIABLE UID;

TIA、Abhinav


2016年5月13日更新(13日の金曜日)

ストアドプロシージャを作成することが、これを修正する唯一の方法です:(

4

2 に答える 2

3

コマンドは、DB2 10forLUWで正常に機能します。データスタジオのバージョンは、CLPから同じように機能するため、重要ではありません。サンプルデータベースでこのコードをテストしました。

BEGIN ATOMIC
 DECLARE UID char(30);
 SET UID = 200280;
 SELECT FIRSTNME, LASTNAME FROM ANDRES.EMPLOYEE WHERE EMPNO = UID;
END @

おそらく、使用しているz / OSバージョンはインラインSQL(Beginアトミック)をサポートしていません。私はzOSDBAではありません。また、LUW、iSeries、zOSの間にはSQLの違いがたくさんあることを知っています。

クロスプラットフォームの互換性を確認してください。これは、問題を理解するのに非常に優れたブログです:https ://www.ibm.com/developerworks/mydeveloperworks/blogs/SQLTips4DB2LUW/entry/crossplatformsqlrefv4?lang=en

于 2012-10-21T02:23:05.040 に答える
2

最初のケースの基本的な構文は次のとおりです。

create variable id_var  integer;
create variable id_var1 integer;

set id_var = 100;

set id_var1 = (select id from t1 where id = id_var);

select * from t2 where id = id_var1;

ただし、この例では、変数を列名として使用しようとしています。

CREATE VARIABLE UID CHAR(30) DEFAULT 'USERID'; 
select * from testdb2.T1 A WHERE A.UID=v_UID;
--some other activity goes here
--and here
DROP VARIABLE UID;

残念ながら、DB2ではそれを行うことはできません。そのようなことをする唯一の方法は、動的SQLステートメントを作成して実行することです。これは一種の混乱です。文字列でSQLコマンドを作成し、それを準備して実行します。SELECTまた、動的SQLで直接使用することにも制限があります。このルートをたどるよりも、問題を解決する別の設計を考える方がおそらく良いでしょう。

于 2012-10-22T08:43:16.387 に答える