如何在postgresql中使用for循环创建多个表?
例如:我需要创建c_emloyee、r_employee、i_employee等。
! /bin/sh
#Invoke postgre
SQLVARCHAR="varchar"
SQLINTEGER="integer"
SQLBIGINT="bigint"
SQLSMALLINT="smallint"
SQLTINYINT="smallint"
SQLCIDR="cidr"
SQLBINARY="varbinary"
SQLTIME="timestamp"
SQLMACADDRESS="macaddr"
prefix[0]=c_
prefix[1]=r_
prefix[2]=s_
prefix[3]=i_
echo ${prefix[0]}
echo ${prefix[1]}
echo ${prefix[2]}
echo ${prefix[3]}
psql -d postgres <<EOF
BEGIN
FOR i IN 0 1 2 3 LOOP
create table ${prefix[i]}employee (e_name $SQLVARCHAR(32) primary key, type $SQLTINYINT not null, description $SQLVARCHAR(128), ip_address $SQLCIDR);
END LOOP;
END;发布于 2012-12-12 23:40:17
你犯了两个错误:
FOR、BEGIN ... END等是PL/PgSQL的一部分,而不是常规SQL。您不能在普通SQL中使用这些,您需要一个DO块或CREATE OR REPLACE FUNCTION。i上编写了PL/PgSQL FOR循环,然后在bash变量展开中引用i。在生成PL/PgSQL函数文本时,在变量i存在之前就会扩展它。如果您只需将psql -d postgres替换为cat,则可以清楚地看到后一个问题,因此它将打印您要运行的生成的SQL:
BEGIN
FOR i IN 0 1 2 3 LOOP
create table c_employee (e_name varchar(32) primary key, type smallint not null, description varchar(128), ip_address cidr);
END LOOP;
END;如您所见,${prefix[i]}计算为c_,因为未定义的i被bash视为零。因此,您的prefix数组中的其他条目将永远不会被使用。
你需要:
DO块或CREATE OR REPLACE FUNCTION以及函数调用来执行PL/PgSQL代码;EXECUTE format(...)运行动态SQL或者,您可以在一个CREATE TABLE循环中生成普通的bash语句,完全消除了PL/PgSQL的需求。我会使用这种方法,因为它要简单得多。
for p in ${prefix[*]}; do
echo "create table ${p}employee (e_name $SQLVARCHAR(32) primary key, type $SQLTINYINT not null, description $SQLVARCHAR(128), ip_address $SQLCIDR);"
done | psql顺便说一句,没有像postgre这样的东西。我想你的意思是"Postgres“或"PostgreSQL”。
你可能想要bytea而不是varbinary。不管怎么说,SQL类型作为变量是什么?你想要写一个DDL生成系统吗?如果是这样的话,不要重新发明那个轮子,那里已经有很多轮子了。
而且,如果您正在做这样的事情,那么您很有可能需要阅读模式(如果您试图做多租户)、表分区等等。
https://stackoverflow.com/questions/13841773
复制相似问题