2017-05-03 11 views
3

私はDB2の動的なループにFORループの静的SQL文から次のスクリプトを変換したいと思います。具体的にはプロシージャのパラメータからtablenameを取り出し、FOR DOループ内のSQL文で使用します。forループ内のDB2プロシージャの変数としてTablename

出発点は、このスクリプトです:

CREATE PROCEDURE P() 
LANGUAGE SQL 
BEGIN ATOMIC 
DECLARE fullname CHAR(40); 

FOR v AS cur1 CURSOR FOR 
      SELECT firstnme, midinit, lastname FROM employee 
DO 
    SET fullname = v.lastname || ',' || v.firstnme 
       ||' ' || v.midinit; 
    INSERT INTO tnames VALUES (fullname); 
END FOR; 
END 

私はこのような何かやりたい:

CREATE PROCEDURE P(IN TABLENAME VARCHAR(128) DEFAULT 'TABLE1') 
LANGUAGE SQL 
BEGIN ATOMIC 
DECLARE fullname CHAR(40); 

FOR v AS cur1 CURSOR FOR 
      SELECT firstnme, midinit, lastname FROM TABLENAME 
DO 
    SET fullname = v.lastname || ',' || v.firstnme 
       ||' ' || v.midinit; 
    INSERT INTO tnames VALUES (fullname); 
END FOR; 
END 

これを実行する方法はありますか?私はSTATEMENTを試しましたが、FOR LOOPと動作させることはできません。

+0

何のためにまだ解決していますが、中にカーソルを必要としませんあなたの最初のスクリプト。実際、なぜあなたがtnamesテーブルが必要なのかはわかりません。 –

+0

@ダンブルクックは返事をありがとう。 'DO .. END FOR'文の中にあるものは本当に問題ではありません。私は他の何かをするでしょう、私はただそれを単純にしたいと思っていました。実際の問題は、プロシージャのパラメータに応じて異なるテーブルで同じ操作を実行していることです。 – deltascience

+0

エラーが発生していますか、または問題は何ですか? – Rams

答えて

0

私はそれがこの方法を使用してFOR LOOPせずに作業を取得するために管理:

CREATE OR REPLACE PROCEDURE P(IN TABLENAME VARCHAR(100) DEFAULT 'TABLE1') 
LANGUAGE SQL 
BEGIN 
    DECLARE fname VARCHAR(100); 
    DECLARE mdinit VARCHAR(100); 
    DECLARE lname VARCHAR(100); 
    DECLARE dumy VARCHAR(100) DEFAULT 'POP'; 
    DECLARE stmt STATEMENT; 
    DECLARE cur1 CURSOR FOR stmt; 

    SET text = 'SELECT firstnme, midinit, lastname FROM ' || TABLENAME; 
    PREPARE stmt FROM text; 
    OPEN cur1; 
    fetch_loop: 
     LOOP FETCH cur1 INTO fname,mdinit,lname; 
     EXECUTE IMMEDIATE 'update '|| TABLENAME || ' set midinit=' || dumy || ' where firstname = ' || fname; 
     END LOOP fetch_loop; 
    CLOSE cur1; 
END 

しかし、あなたの質問を行うにはFOR LOOP

関連する問題