我在针对postgresql数据库运行的.sql文件中有以下代码:
INSERT INTO widget (username)
SELECT i
FROM generate_series(100, 150) AS t(i);
INSERT INTO widget2
SELECT generate_series(100, 150), 'statictext', generate_series(100, 150);
我通过执行类似“psql -U myuser -d widgets -f addwidgets.sql”的操作来运行它 但现在我需要参数化这些项目。所以我改为创建了这个版本:
DECLARE startnum INTEGER;
DECLARE endnum INTEGER;
startnum:=100;
endnum:=150;
INSERT INTO widget (username)
SELECT i
FROM generate_series(startnum, endnum) AS t(i);
INSERT INTO widget2
SELECT generate_series(startnum, endnum), 'statictext', generate_series(startnum, endnum);
但它爆炸,因为它不喜欢我的startnum / endnum变量。错误消息是:
psql:addwidgets.sql:1: ERROR: syntax error at or near "INTEGER"
LINE 1: DECLARE startnum INTEGER;
在搜索答案时,我发现它可能与我在psql中使用的语言有关。现在我正在谷歌搜索如何找出我的数据库引擎设置为理解的脚本语言。 但与此同时,如果您有任何建议,我会很感激。
编辑1
所以我发现了这个:
testbox:/tmp# psql -U postgres -d widgets -c "select * from pg_language;"
lanname | lanowner | lanispl | lanpltrusted | lanplcallfoid | laninline | lanvalidator | lanacl
----------+----------+---------+--------------+---------------+-----------+--------------+--------
internal | 10 | f | f | 0 | 0 | 2246 |
c | 10 | f | f | 0 | 0 | 2247 |
sql | 10 | f | t | 0 | 0 | 2248 |
plpgsql | 10 | t | t | 11864 | 11865 | 11866 |
也许我应该在我的.sql文件的顶部指定我正在使用的语言?它也可以帮助我知道我猜哪些文档可供参考。 :)
答案 0 :(得分:1)
使用匿名阻止:https://www.postgresql.org/docs/9.6/static/sql-do.html
DO [LANGUAGE lang_name]代码
示例:
DO $$
DECLARE startnum INTEGER;
endnum INTEGER;
BEGIN
startnum:=100;
endnum:=150;
INSERT INTO widget (username)
SELECT i
FROM generate_series(startnum, endnum) AS t(i);
INSERT INTO widget2
SELECT generate_series(startnum, endnum), 'statictext',
generate_series(startnum, endnum);
END $$
;