1

У меня есть хранимая процедура, написанная в T-SQL, и я хочу сделать ее для PostgreSQL, но я не так хорошо знаком с PostgreSQL.Сохраненная процедура преобразования T-SQL в PostgreSQL

Моя хранимая процедура выглядеть следующим образом:

CREATE PROCEDURE usp_insert_allocated_time 
@fld_project_id INT, 
@fld_allocated_time INT 
AS 

DECLARE @project int; 
SET @project = @fld_project_id; 

DECLARE @allocated int; 
DECLARE @time int; 

BEGIN 

SET @time = (SELECT SUM(fld_allocated_time) 
FROM dbo.tbl_project_timesheet 
WHERE fld_project_id [email protected]) 

SET @allocated = (SELECT fld_allocated_days FROM dbo.tbl_project where fld_id = @project); 

    IF @allocated > @time 
    BEGIN 

    INSERT into dbo.tbl_project_timesheet(fld_project_id,fld_allocated_time) 
    VALUES(@fld_project_id,@fld_allocated_time); 

    END 
     ELSE 
     PRINT 'Not OK'; 

END 

И я должен сделать что-то подобное, но в строке 10, я получаю эту ошибку:

ОШИБКА: неверный входной синтаксис для целого числа: «293,00 "

SQL-состояние: 22P02

Контекст: PL/PgSQL функция "SA_PRJ" .usp_add_timesheet_record_new (целое число, целое число, число, Nu Meric, характер изменения, характер изменения) линии 10 при назначении

CREATE OR REPLACE FUNCTION "SA_PRJ".usp_add_timesheet_record_new(p_uid integer, p_project_id integer, p_allocated_time numeric, p_achieved_time numeric, p_task_desc character varying, p_obs character varying) 
    RETURNS void AS 
$BODY$ 
declare alloc_id integer; 
declare project integer; 
declare allocated integer; 
declare allocated_time integer; 
BEGIN 

    project := p_project_id; 

    allocated_time := (SELECT SUM(fld_allocated_time) 
    FROM "SD_PRJ".tbl_project_timesheet 
    WHERE fld_project_id = project); 

    allocated := (SELECT fld_allocated_days FROM "SD_PRJ".tbl_project where fld_id = project); 

    if not "SA_ADM".usp_check_permission(p_uid, 'SA_PRJ', 'usp_add_timesheet_record') then 
    raise exception 'User ID % no have the permission!', p_uid; 
    end if; 

    select fld_id into alloc_id from "SD_PRJ".tbl_project_allocation where fld_emp_id = p_uid and fld_project_id = p_project_id; 

    BEGIN 
    IF (allocated > allocated_time) THEN 

    INSERT INTO "SD_PRJ".tbl_project_timesheet(fld_emp_id, fld_project_id, fld_is_allocated,fld_allocated_time, fld_achieved_time, fld_task_desc, fld_obs) 
    VALUES (p_uid,p_project_id,coalesce(alloc_id,0), p_allocated_time, p_achieved_time,p_task_desc, p_obs); 

    ELSE 
     RAISE NOTICE 'Not OK!!'; 
    END IF; 
    END; 
END 
$BODY$ 
    LANGUAGE plpgsql VOLATILE 
    COST 100; 

Это более сложный вариант в PostgreSQL за то, что я хочу.

+2

Во-первых, вы должны дать свою версию PostgreSQL, ваша таблица DDL, и что же вы пытаетесь до сих пор !? – Houari

+0

Существует две таблицы: 1.Tbl_project 2.Tbl_project_timesheet – Alienware

ответ

1

Вы действительно не даете достаточно информации, чтобы исправить свою проблему, но сообщение об ошибке довольно наглядное. Вы пытаетесь положить 293,00 в целое число. Здесь я могу воспроизвести:

DO 
$$ 
DECLARE 
    i INT; 
BEGIN 
    i := 293.00; 
    RAISE NOTICE 'i=%', i; 
END 
$$; 

Это поднимет:

ERROR: invalid input syntax for integer: "293.00" 
SQL state: 22P02 
Context: PL/pgSQL function inline_code_block line 6 at assignment 

Вы должны изменить переменную с тем же типом данных, что и данные, которые вы пытаетесь присвоить ему. Например:

DO 
$$ 
DECLARE 
    i NUMERIC(5, 2); 
BEGIN 
    i := 293.00; 
    RAISE NOTICE 'i=%', i; 
END 
$$; 

Это работает и выходы:

NOTICE: i=293.00 
Query returned successfully with no result in 14 ms. 
Смежные вопросы