I have the following code written in SQL Server but I am migrating to PostgreSQL in this way I have errors.
This is my SQLserver code:
CREATE FUNCTION Teltonika_FunElement(
@Raw VARCHAR(MAX)
,@Tipo INT
)
RETURNS @Elements2 TABLE(ID INT, Nombre VARCHAR(MAX), Value VARCHAR(MAX))
AS
BEGIN
DECLARE @Elements TABLE(ID INT, Nombre VARCHAR(MAX), Value VARCHAR(MAX))
DECLARE
@i INT=1
,@y INT=1
,@Len INT
---------------------------------------------------------------------------
IF @Tipo=1
BEGIN
SET @Len = LEN(@Raw)/4
WHILE @i<=@Len
BEGIN
INSERT INTO @Elements
SELECT
dbo.Mux_FUN_HexadecimalToDec_v2(SUBSTRING(@Raw, @y, 2))
,NULL
,SUBSTRING(@Raw, @y+2, 2)
SET @y=@y+4
SET @i = @i+1
END
END
---------------------------------------------------------------------------
---------------------------------------------------------------------------
IF @Tipo=2
BEGIN
SET @Len = LEN(@Raw)/6
WHILE @i<=@Len
BEGIN
INSERT INTO @Elements
SELECT
dbo.Mux_FUN_HexadecimalToDec_v2(SUBSTRING(@Raw, @y, 2))
,NULL
,SUBSTRING(@Raw, @y+2, 4)
SET @y=@y+6
SET @i = @i+1
END
END
---------------------------------------------------------------------------
---------------------------------------------------------------------------
IF @Tipo=4
BEGIN
SET @Len = LEN(@Raw)/10
WHILE @i<=@Len
BEGIN
INSERT INTO @Elements
SELECT
dbo.Mux_FUN_HexadecimalToDec_v2(SUBSTRING(@Raw, @y, 2))
,NULL
,SUBSTRING(@Raw, @y+2, 8)
SET @y=@y+10
SET @i = @i+1
END
END
---------------------------------------------------------------------------
---------------------------------------------------------------------------
---------------------------------------------------------------------------
IF @Tipo=8
BEGIN
SET @Len = LEN(@Raw)/18
WHILE @i<=@Len
BEGIN
INSERT INTO @Elements
SELECT
dbo.Mux_FUN_HexadecimalToDec_v2(SUBSTRING(@Raw, @y, 2))
,NULL
,SUBSTRING(@Raw, @y+2, 16)
SET @y=@y+18
SET @i = @i+1
END
END
---------------------------------------------------------------------------
INSERT INTO @Elements2
SELECT
E.ID
,PropertyName
,CASE
WHEN (TypeParser = 'INT' AND Active=1) THEN CONVERT(VARCHAR(255), dbo.Mux_FUN_HexadecimalToDec_v2(Value))
WHEN (TypeParser = 'DECIMAL(18,1)/1000' AND Active=1) THEN CONVERT(VARCHAR(255), (dbo.Mux_FUN_HexadecimalToDec_v2(Value)/1000))
ELSE Value
END Value
FROM @Elements E
LEFT JOIN Mux_Teltonika_Tbl_ElementsConf TE ON TE.PropertyID=E.ID
RETURN
END
so far I managed to write this in postgres:
CREATE OR REPLACE FUNCTION Teltonika_FunElement(
Raw CHARACTER VARYING,
Tipo INTEGER
)
RETURNS Elements2 TEMP TABLE(ID INT, Nombre CHARACTER VARYING, Value1 CHARACTER VARYING)
AS
BEGIN
DECLARE Elements TEMP TABLE(ID INT, Nombre CHARACTER VARYING, Value1 CHARACTER VARYING)
DECLARE
i INT=1;
y INT=1;
Len1 INT;
---------------------------------------------------------------------------
IF Tipo=1 THEN
Len1 := LENGTH(Raw)/4;
WHILE i<=Len1
LOOP
INSERT INTO Elements
SELECT
hex_to_int(SUBSTRING(Raw FROM y FOR 2))
,NULL
,SUBSTRING(Raw FROM y+2 FOR 2);
y := y+4;
i := i+1;
END LOOP;
END IF;
---------------------------------------------------------------------------
---------------------------------------------------------------------------
IF Tipo = 2 THEN
BEGIN
Len1 := LENGTH(Raw)/6;
WHILE i<=Len1
LOOP
INSERT INTO Elements
SELECT
hex_to_int(SUBSTRING(Raw FROM y FOR 2))
,NULL
,SUBSTRING(Raw FROM y+2 FOR 4);
y := y+6;
i := i+1;
END LOOP;
END IF;
---------------------------------------------------------------------------
---------------------------------------------------------------------------
IF Tipo = 4 THEN
Len1 := LENGTH(Raw)/10;
WHILE i<=Len1
LOOP
INSERT INTO Elements
SELECT
hex_to_int(SUBSTRING(Raw FROM y FOR 2))
,NULL
,SUBSTRING(Raw FROM y+2 FOR 8);
y := y+10;
i := i+1;
END LOOP;
END IF;
---------------------------------------------------------------------------
---------------------------------------------------------------------------
---------------------------------------------------------------------------
IF Tipo = 8 THEN
Len1 := LENGTH(Raw)/18;
WHILE i<=Len1
LOOP
INSERT INTO Elements
SELECT
hex_to_int(SUBSTRING(Raw FROM y FOR 2))
,NULL
,SUBSTRING(Raw FROM y+2 FOR 16);
y := y+18;
i := i+1;
END LOOP;
END IF;
---------------------------------------------------------------------------
INSERT INTO Elements2
SELECT
E.ID
,PropertyName
,CASE
WHEN (TypeParser = 'INT' AND Active=1); THEN (hex_to_int(Value1):: VARCHAR)
WHEN (TypeParser = 'DECIMAL(18,1);/1000' AND Active=1); THEN (hex_to_int(Value1)/1000)::VARCHAR)
ELSE Value
END Value
FROM Elements E
LEFT JOIN Teltonika_Tbl_ElementsConf TE ON TE.PropertyID=E.ID;
RETURN
END;
I get the following error:
ERROR: syntax error at or near "TEMP"
LINE 5: RETURNS Elements2 TEMP TABLE (ID INT, Name CHARACTER VARYIN ...
Thank you very much for your help