I am trying to run my stored procedure scripts . There are 21 scripts amongst them 18 successfully executed but 3 of them are not executing. One of the script which is failing is given below (I am using PostgreSQL 9.5)
CREATE OR REPLACE FUNCTION create_temp_eid_table (tempPatientMappingTableName IN text ,errorMsg OUT text)
RETURNS text AS $body$
BEGIN
EXECUTE 'create table ' || tempPatientMappingTableName || ' (
ENCOUNTER_MAP_ID varchar(200) NOT NULL,
ENCOUNTER_MAP_ID_SOURCE varchar(50) NOT NULL,
PROJECT_ID VARCHAR(50) NOT NULL,
PATIENT_MAP_ID varchar(200),
PATIENT_MAP_ID_SOURCE varchar(50),
ENCOUNTER_ID varchar(200) NOT NULL,
ENCOUNTER_ID_SOURCE varchar(50) ,
ENCOUNTER_NUM numeric,
ENCOUNTER_MAP_ID_STATUS varchar(50),
PROCESS_STATUS_FLAG char(1),
UPDATE_DATE timestamp,
DOWNLOAD_DATE timestamp,
IMPORT_DATE timestamp,
SOURCESYSTEM_CD varchar(50)
) WITH OIDS';
EXECUTE 'CREATE INDEX idx_' || tempPatientMappingTableName || '_eid_id ON ' || tempPatientMappingTableName || ' (ENCOUNTER_ID, ENCOUNTER_ID_SOURCE, ENCOUNTER_MAP_ID, ENCOUNTER_MAP_ID_SOURCE, ENCOUNTER_NUM)';
EXECUTE 'CREATE INDEX idx_' || tempPatientMappingTableName || '_stateid_eid_id ON ' || tempPatientMappingTableName || ' (PROCESS_STATUS_FLAG)';
EXCEPTION
WHEN OTHERS THEN
RAISE NOTICE '%%%', SQLSTATE, ' - ' , SQLERRM;
END;
$body$
LANGUAGE PLPGSQL;
i am getting error stating that
" org.postgresql.util.PSQLException: ERROR: too many parameters specified for RAISE
Where: compilation of PL/pgSQL function "create_temp_eid_table" near line 23".
Please check the image for clear error message.
Hey !
We’re trying to upgrade a 1.3.0 datamodel using PUM, but run into a surprising issue… The initial datamodel isn’t 100% vanilla, but this looks like something else.
Here’s the error when running pum upgrade -p pg_qgep_source -t qgep_sys.pum_info -d delta -u 1.4.0
Upgrade...
Applying delta 1.3.1 delete_channel_when_no_reach... FEHLER: zu viele Parameter für RAISE angegeben
CONTEXT: Kompilierung der PL/pgSQL-Funktion »on_reach_delete« nahe Zeile 20
It looks like a typo :
RAISE NOTICE 'Removing channel (%%) since no reach is left', channel_id;
should be
RAISE NOTICE 'Removing channel (%) since no reach is left', channel_id;
But shouldn’t that have been picked up by CI ?
Postgres version : PostgreSQL 11.4, compiled by Visual C++ build 1914, 64-bit
Я пытаюсь указать более двух параметров в уведомлении о повышении ставки, но не могу ¿Как мне это сделать?
CREATE OR REPLACE FUNCTION TABLA_MULT(numeric) RETURNS void AS '
DECLARE
texto1 TEXT := ''multiplicado por '';
texto2 TEXT := '' es igual a '';
BEGIN
RAISE NOTICE ''TABLA DE MULTIPLICAR DEL %'',$1;
RAISE NOTICE ''=========================='';
FOR i IN 1..10 LOOP
DECLARE result numeric := ($1*i);
BEGIN
RAISE NOTICE ''El número %'',i,texto1,$1,texto2,result;
END;
END LOOP;
END; ' LANGUAGE 'plpgsql';
2 ответа
Как описано в руководстве вам нужен один %
для каждого параметра, который следует заменить:
Количество аргументов должно соответствовать количеству заполнителей
%
в строке формата, иначе во время компиляции функции возникнет ошибка.
Итак, вам нужно:
RAISE NOTICE 'El número % % % % %',i,texto1,$1,texto2,result;
1
a_horse_with_no_name
9 Апр 2020 в 22:55
Не относится конкретно к вашему вопросу, но вы можете исследовать Postgres с ценой в долларах Строковые константы. Это избавляет вас от необходимости использовать двойные кавычки в теле функции. Таким образом, ваша функция (изначально опубликованная вами становится):
CREATE OR REPLACE FUNCTION TABLA_MULT(numeric) RETURNS void AS $$
DECLARE
texto1 TEXT := 'multiplicado por ';
texto2 TEXT := ' es igual a ';
BEGIN
RAISE NOTICE 'TABLA DE MULTIPLICAR DEL %',$1;
RAISE NOTICE '==========================';
FOR i IN 1..10 LOOP
DECLARE result numeric := ($1*i);
BEGIN
RAISE NOTICE 'El número %',i,texto1,$1,texto2,result;
END;
END LOOP;
END; $$ LANGUAGE 'plpgsql';
Также было бы выгодно систематически делать отступы в коде.
0
Belayer
10 Апр 2020 в 01:56
Я застрял с ошибкой слишком много параметров, указанных для RAISE для указанного ниже RAISE. Однако я не нахожу синтаксической проблемы.
l_task_source_id:= adapter.array_search('prps',g_status.ip_source_tables);
l_check_stmt := ' select max(stufe::numeric) from ' || g_status.source_tables[l_task_source_id] ;
execute l_check_stmt into l_max_hierarchy_level;
raise notice ' Max hierarchy level : %',l_max_hierarchy_level;
Ваш ответ
Введите минимум 50 символов
Пишу функцию с триггером для таблицы payments. Функция проверяет, что стоимость заказа больше 400.00 и
меняет вводимую сумму на сумму с учетом 10% скидки. Функция почему-то не работает, вроде конструкция и синтаксис
правильные. Выводится сообщение об ошибке:
ОШИБКА: недостаточно параметров для RAISE
КОНТЕКСТ: компиляция функции PL/pgSQL «check_discount» в районе строки 5
Подскажите, пожалуйста, в чем тут проблема.
Oracle 11 SQL | ||
|