0

一時テーブルでステートメントを使用する手順は次のとおりです。

CREATE OR REPLACE PROCEDURE dept_query (
    p_table        CHAR(10), 
    p_date         CHAR(10),
p_start        CHAR(6) 
)
    LANGUAGE SQL

BEGIN
DECLARE        v_table         VARCHAR(128);
DECLARE        v_colname       VARCHAR(128);
DECLARE      v_month            CHAR(6);
DECLARE      v_int          integer default 0;
DECLARE        stat       VARCHAR(1000);
DECLARE stmt STATEMENT;
.......
set stat = 'insert into cte1 select colname, row_number() over() as row_nbr from syscat.columns where tabname = ?';
PREPARE stmt FROM stat;
execute stmt using p_table;

set stat = "insert into  OH09ZC1.cte3  -- cte, cte1 & cte3 are ordinary tables
    with cte2 (list, cnt, cnt_max) AS 
    (SELECT VARCHAR('', 32000), 0, count(colname) FROM OH09ZC1.cte1
     UNION ALL 
     SELECT 
         case when cte2.list = '' THEN RTRIM(CHAR(cte1.colname)) 
              else cte2.list || ', ' || RTRIM(CHAR(cte1.colname)) end, 
              cte2.cnt + 1, 
              cte2.cnt_max 
     FROM   OH09ZC1.cte1, cte2 
     WHERE  cte1.row_nbr = cte2.cnt + 1 AND cte2.cnt < cte2.cnt_max ) 

select list FROM cte2 where cte2.cnt = cte2.cnt_max fetch first 1 rows only"; 

PREPARE stmt FROM stat;
execute stmt;
......
END;

これにより、テーブル内の列のリストが取得されます。問題は、'insert into OH09ZC1.cte3 with cte2 (list, cnt, cnt_max) AS' には長い名前が含まれていないため、なぜこのエラーが発生するのでしょうか: SQL0107N The name "insert into OH09ZC1.cte3 with cte2 (list , cnt, cnt_max) AS (SELEC" is too long. The maximum length is "128". 'insert into OH09ZC1.cte3' がない場合も同じエラーが発生しました。

4

1 に答える 1

1

set stat = "insert into...-- SQL 文字列リテラルでは、単一引用符を使用する必要があります。二重引用符は識別子を示します"insert into cte3 ..."。識別子としては長すぎるだけでなく、とにかく無効です。

于 2013-09-25T14:36:38.477 に答える