2016-12-23 6 views
0

У меня есть следующий код в файл .sql, что я бегу от моей базы данных 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 виджетов -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. Прямо сейчас я googling, как узнать, какой язык сценариев мой механизм базы данных настроен для понимания. Но в то же время, если у вас есть предложения, я был бы признателен.

EDIT 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

Я не думаю, что вы можете просто написать сырец PL/PgSQL , вы можете создавать с ним функции. –

+0

функция как в сохраненной proc? я не думаю, что это то, что я хочу делать ... если, конечно, я должен. этот скрипт будет работать как часть процесса инициализации базы данных и засеять его некоторыми необходимыми данными. – Happydevdays

+2

вы не можете смешивать PL/pgSQL с простым SQL. Вам, по крайней мере, нужно поместить код PL/pgSQL в блок 'DO': https://www.postgresql.org/docs/current/static/sql-do.html –

ответ

1

Использовать анонимный блок: https://www.postgresql.org/docs/9.6/static/sql-do.html

DO [ЯЗЫК 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 $$ 
;