我以前写过简单的SQL脚本,但我不是专家,所以我甚至不确定我要问的问题是什么。从DB2 SQL脚本,我想从不同表的内容填充表。最终,我将从其他表中引入数据,但我只需要先了解基础知识。我正在尝试从DB2 CLP执行此操作,执行文件。
通过查看手册,我认为这可能有用:
BEGIN ATOMIC
FOR ROW AS
SELECT OSN.SWOSNAME, OSN.SWPLATFORM FROM SASH1.LISTOSNAMES OSN
DO
INSERT INTO SASH1.VALIDOSES
VALUES (ROW.OSN.SWOSNAME, 'IBM', ROW.OSN.SWOSNAME, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'Y', ROW.OSN.SWPLATFORM, NULL);
END FOR;
END
但是,我收到以下错误:
DB21034E The command was processed as an SQL statement because it was not a
valid Command Line Processor command. During SQL processing it returned:
SQL0104N An unexpected token "END-OF-STATEMENT" was found following
"SN.SWPLATFORM, NULL)". Expected tokens may include: "<delim_semicolon>".
LINE NUMBER=6. SQLSTATE=42601
很明显,我不知道我在这里做什么。是否可以执行此类操作(从另一个表中的数据填充表),而无需在数据库中创建SQL过程或函数?
答案 0 :(得分:1)
您正在使事情变得复杂,您需要做的就是插入select的结果,确保指定列名(我使用了col1,...)
INSERT INTO SASH1.VALIDOSES
(col1, col2, ... ,coln)
SELECT SWOSNAME, 'IBM', SWOSNAME, 'Y', SWPLATFORM
FROM SASH1.LISTOSNAMES
请注意,您可能不必指定NULL(默认情况下,除非为您要使用NULL覆盖的列指定了默认值)
答案 1 :(得分:0)
尽管@Lennart所说的过于复杂的事情,如果你坚持使用匿名块意识到整个块是一个单个SQL语句,因此最后必须有一个终结符。由于您还必须具有默认语句终止符,分区在块中,因此块本身必须使用其他字符作为终止符。通常使用“@”,因此您可以在BEGIN ATOMIC ... END
语句后面加上“@”字符并执行文件:
db2 -td@ -f <yourfile>