我需要创建一个名为YEAR_的表(这里是变量值)
我有一张年份数字表(2010,2012,2014)。我想拿这些并创建表YEAR_2010,YEAR_2012和YEAR_2014。
这需要在循环内完成。
我试着这样做:
CREATE TABLE TEMP_YEAR
( YEAR_COLUMN integer
);
INSERT INTO temp_year
( year_column )
(
select extract(year from datum) from datetest
);
BEGIN
FOR vl AS
c1 cursor for
SELECT year_column FROM temp_year
DO
EXEC SQL execute immediate 'create table YEAR_' || year_column || ' (year integer, name varchar2(50));
END FOR;
END;
/
drop table temp_year;
第一个创建正在运行,因此插入。其余的搞乱了。
首先出现此错误消息(翻译自德语):
EXEC SQL execute immediate 'create table YEAR_' || year_column || ' (year integer, name varchar2(50))
DB21034E SQL statement is wrong.
SQL0104N On " EXEC" follows the invalid Token "SQL". Allowed tokens could be: ":". LINE NUMBER=7. SQLSTATE=42601
目标是在这些年份数字的帮助下创建表格。
有什么想法吗?
提前致谢。
答案 0 :(得分:1)
这个EXEC SQL
来自哪里?声明只是EXECUTE IMMEDIATE
。
http://pic.dhe.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.apdv.plsql.doc/doc/r0055453.html
答案 1 :(得分:0)
Ok 1问题我今天才知道PL / SQL是否被禁用并且必须保持这样状态所以现在它对我来说是如何工作的:
(将结束指标更改为@)
只获得一次临时表:
CREATE TABLE TEMP_YEAR
( YEAR_COLUMN NUMBER
)@
这是程序
CREATE or replace PROCEDURE Year_tab_create ()
LANGUAGE SQL
BEGIN
DECLARE sqlStmt VARCHAR( 32672 );
DECLARE v_numRecords INT DEFAULT 1;
DECLARE v_year INT DEFAULT 0;
DECLARE v_counter INT DEFAULT 0;
DECLARE c1 CURSOR FOR
select year_column from temp_year;
INSERT INTO temp_year
( year_column )
(
select distinct extract(year from datum) from datetest
);
SELECT COUNT(*) INTO v_numRecords FROM temp_year;
OPEN c1;
WHILE v_counter < (v_numRecords)
DO
FETCH c1 INTO v_year;
set sqlStmt = 'create table YEAR_' || v_year || ' (year integer, name varchar(50))';
EXECUTE IMMEDIATE sqlStmt;
SET v_counter = v_counter + 1;
END WHILE;
CLOSE c1;
delete from temp_year;
END
@
希望这也可以帮助其他人。