Вы можете создать функцию из своего SQL-скрипта следующим образом:
CREATE OR REPLACE FUNCTION f_myfunc(date)
RETURNS void AS
$BODY$
CREATE TEMP TABLE t_tmp ON COMMIT DROP AS
SELECT * FROM totalprotein LIMIT 0; -- copy table-structure from table
COPY t_tmp FROM 'c:/TP.csv' DELIMITERS ',' CSV HEADER;
UPDATE anagrafica a
SET pt = t.resultvalue
FROM t_tmp t
WHERE a.data_analisi = $1
AND t.accessionnbr = a.id;
-- Temp table is dropped automatically at end of session
-- In this case (ON COMMIT DROP) after the transaction
$BODY$
LANGUAGE sql;
Вы можете использовать язык SQL для этого вида простого пакета SQL.
Как видите, я сделал несколько изменений в вашем скрипте, которые должны сделать его быстрее, чище и безопаснее.
Основные баллы
Для временного чтения данных в пустую таблицу используйте временную таблицу . Сохраняет много записей на диск и намного быстрее.
Для упрощения процесса я использую вашу существующую таблицу totalprotein
в качестве шаблона для создания (пустой) временной таблицы.
Если вы хотите удалить все строки таблицы, используйте TRUNCATE вместо DELETE FROM. Намного быстрее. В данном конкретном случае вам не нужно ни того, ни другого. Временная таблица удаляется автоматически. Смотрите комментарии в функции.
Как вы обновили anagrafica.pt
, вы бы установили для столбца NULL
, если что-нибудь пойдет не так в процессе (date
не найдено, неправильно date
, id
не найдено ...). Как я переписал ОБНОВЛЕНИЕ, это происходит только в том случае, если найдены соответствующие данные. Я предполагаю, что это то, что вы на самом деле хотите.
Затем запросите ввод данных пользователем в сценарии оболочки и вызовите функцию с датой в качестве параметра. Вот как это может работать в оболочке Linux (как пользовательские postgres, с доступом без пароля (используя метод IDENT
в pg_haba.conf
):
#! /bin/sh
# Ask for date. 'YYYY-MM-DD' = ISO date-format, valid with any postgres locale.
echo -n "Enter date in the form YYYY-MM-DD and press [ENTER]: "
read date
# check validity of $date ...
psql db -p5432 -c "SELECT f_myfunc('$date')"
-c
заставляет psql выполнить отдельную команду SQL и затем завершить работу. Вчера я написал намного больше о psql и его параметрах командной строки в несколько связанном ответе.
Создание соответствующего пакетного файла Windows остается для вас упражнением.
Звонок под Windows
Сообщение об ошибке сообщает вам:
Функция tpimport (неизвестно) не существует
Обратите внимание на строчные буквы: tpimport
. Я подозреваю, что вы использовали смешанные буквы для создания функции. Так что теперь вы должны заключать имя функции в двойные кавычки каждый раз, когда вы его используете.
Попробуйте это (отредактированные цитаты!):
C:\Progra~1\PostgreSQL\8.3\bin\psql -d Total -h localhost -p 5432 -U postgres
-c "SELECT ""TPImport""('%dateimport%')"
Обратите внимание, как я использую одиночные и двойные кавычки здесь. Я думаю, это может работать под Windows. См здесь .
Вы затруднились для себя, когда решили использовать идентификаторы смешанного регистра в PostgreSQL - глупость, против которой я никогда не устаю предупреждать. Теперь вам нужно заключать в кавычки имя функции "TPImport"
каждый раз, когда вы ее используете. Хотя это совершенно законно, я бы никогда не сделал бы это. Я использую строчные буквы для идентификаторов. Всегда. Таким образом, я никогда не путаю строчные и прописные буквы и никогда не использую двойные кавычки.
Окончательное исправление будет состоять в том, чтобы воссоздать функцию с именем в нижнем регистре (просто уберите двойные кавычки, и она будет автоматически свернута в нижний регистр). Тогда имя функции будет работать без кавычек.
Прочитайте основы об идентификаторах здесь .
Кроме того, стоит подумать, что обновление до более поздней версии PostgreSQL 8.3 немного устарело.