如何在 netezza sql 中创建 'Macro'
How to create 'Macro' in netezza sql
除了使用不同年份的数据外,我必须使用相同的命令创建多个表。例如:
create temp table test_2002 as
select *
from claim
where purchase_year = '2002';
create temp table test_2003 as
select *
from claim
where purchase_year = '2003';
.....
我想创建10张表,比如test_2002、test2003、test2004等,但是又不想重复写10次。那么有没有办法简化这个过程,比如写一个宏?
提前致谢!
即使有办法(我不知道有没有),这似乎更像是文本编辑器的一项任务。查看
- Notepad++
- Vim
或者,如果你真的很绝望,在拖动 10 行年份后,在 excel 中使用这个公式。
="create temp table test_" & A1 & " as select * from claim where purchase_year = '" & A1 & "';"
如果你不能使用一个好的文本编辑器的宏函数来生成文本(这可能是你应该做的),并且绝对必须完全用你可以从 SQL 调用的东西来完成Netezza 上的接口,那么存储过程是您唯一的希望。
这是一个示例存储过程...
CREATE OR REPLACE PROCEDURE SP_CREATE_LOOP(INTEGER, INTEGER)
RETURNS INTEGER
LANGUAGE NZPLSQL AS
BEGIN_PROC
DECLARE
pStartVal ALIAS FOR ;
pCount ALIAS FOR ;
vSQL varchar(30000);
BEGIN
for i in 1 .. pCount LOOP
vSQL := 'CREATE TABLE CLAIM_' || pStartVal + i-1 || ' as SELECT * from CLAIM WHERE PURCHASE_YEAR = ' || pStartVal + i-1 || ';';
EXECUTE IMMEDIATE vSQL;
END LOOP;
END;
END_PROC;
..以及它创造的东西。
TESTDB.ADMIN(ADMIN)=> \d
List of relations
Schema | Name | Type | Owner
--------+-------+-------+-------
ADMIN | CLAIM | TABLE | ADMIN
(1 row)
TESTDB.ADMIN(ADMIN)=> exec SP_CREATE_LOOP(2000,5);
SP_CREATE_LOOP
----------------
(1 row)
TESTDB.ADMIN(ADMIN)=> \d
List of relations
Schema | Name | Type | Owner
--------+------------+-------+-------
ADMIN | CLAIM | TABLE | ADMIN
ADMIN | CLAIM_2000 | TABLE | ADMIN
ADMIN | CLAIM_2001 | TABLE | ADMIN
ADMIN | CLAIM_2002 | TABLE | ADMIN
ADMIN | CLAIM_2003 | TABLE | ADMIN
ADMIN | CLAIM_2004 | TABLE | ADMIN
(6 rows)
您可以找到 Stored Procedures in Netezza here 的文档。
除了使用不同年份的数据外,我必须使用相同的命令创建多个表。例如:
create temp table test_2002 as
select *
from claim
where purchase_year = '2002';
create temp table test_2003 as
select *
from claim
where purchase_year = '2003';
.....
我想创建10张表,比如test_2002、test2003、test2004等,但是又不想重复写10次。那么有没有办法简化这个过程,比如写一个宏?
提前致谢!
即使有办法(我不知道有没有),这似乎更像是文本编辑器的一项任务。查看
- Notepad++
- Vim
或者,如果你真的很绝望,在拖动 10 行年份后,在 excel 中使用这个公式。
="create temp table test_" & A1 & " as select * from claim where purchase_year = '" & A1 & "';"
如果你不能使用一个好的文本编辑器的宏函数来生成文本(这可能是你应该做的),并且绝对必须完全用你可以从 SQL 调用的东西来完成Netezza 上的接口,那么存储过程是您唯一的希望。
这是一个示例存储过程...
CREATE OR REPLACE PROCEDURE SP_CREATE_LOOP(INTEGER, INTEGER)
RETURNS INTEGER
LANGUAGE NZPLSQL AS
BEGIN_PROC
DECLARE
pStartVal ALIAS FOR ;
pCount ALIAS FOR ;
vSQL varchar(30000);
BEGIN
for i in 1 .. pCount LOOP
vSQL := 'CREATE TABLE CLAIM_' || pStartVal + i-1 || ' as SELECT * from CLAIM WHERE PURCHASE_YEAR = ' || pStartVal + i-1 || ';';
EXECUTE IMMEDIATE vSQL;
END LOOP;
END;
END_PROC;
..以及它创造的东西。
TESTDB.ADMIN(ADMIN)=> \d
List of relations
Schema | Name | Type | Owner
--------+-------+-------+-------
ADMIN | CLAIM | TABLE | ADMIN
(1 row)
TESTDB.ADMIN(ADMIN)=> exec SP_CREATE_LOOP(2000,5);
SP_CREATE_LOOP
----------------
(1 row)
TESTDB.ADMIN(ADMIN)=> \d
List of relations
Schema | Name | Type | Owner
--------+------------+-------+-------
ADMIN | CLAIM | TABLE | ADMIN
ADMIN | CLAIM_2000 | TABLE | ADMIN
ADMIN | CLAIM_2001 | TABLE | ADMIN
ADMIN | CLAIM_2002 | TABLE | ADMIN
ADMIN | CLAIM_2003 | TABLE | ADMIN
ADMIN | CLAIM_2004 | TABLE | ADMIN
(6 rows)
您可以找到 Stored Procedures in Netezza here 的文档。