Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 迁移到pgsql时,使用select into的函数出错_Postgresql_Plpgsql_Database Migration - Fatal编程技术网

Postgresql 迁移到pgsql时,使用select into的函数出错

Postgresql 迁移到pgsql时,使用select into的函数出错,postgresql,plpgsql,database-migration,Postgresql,Plpgsql,Database Migration,我正在从sql server迁移到pgsql。 我使用java中创建的脚本来实现这一点,但是当我尝试将这个过程SQL server转换为函数并在bdpgsql中进行测试时,控制台会在paso1部分中显示错误 以下是sql server中的代码: /****** Object: StoredProcedure [dbo].[paBalanceClasificado] Script Date: 30/11/2017 16:38:42 ******/ SET ANSI_NULLS OFF GO

我正在从sql server迁移到pgsql。 我使用java中创建的脚本来实现这一点,但是当我尝试将这个过程SQL server转换为函数并在bdpgsql中进行测试时,控制台会在paso1部分中显示错误

以下是sql server中的代码:

/****** Object:  StoredProcedure [dbo].[paBalanceClasificado]    Script Date: 30/11/2017 16:38:42 ******/
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO
CREATE PROCEDURE [dbo].[paBalanceClasificado]
@empresa int,
@fecha1 smalldatetime,
@fecha2 smalldatetime

AS

SELECT     SUBSTRING(b.codigoCuenta, 1, 1) + '000000' AS Codigo, SUM(a.montoDebe) AS Debe, SUM(a.montoHaber) AS Haber
INTO #PASO1
FROM         movimientosContables a INNER JOIN
                      CuentasContables b ON a.codigoCorto = b.codigoCorto AND b.codigoEmpresa = @empresa
WHERE     (a.codigoEmpresa = @empresa and fechaProceso between @fecha1 and @fecha2)
GROUP BY SUBSTRING(b.codigoCuenta, 1, 1) + '000000'
UNION ALL
SELECT     SUBSTRING(b.codigoCuenta, 1, 2) + '00000' AS Codigo, SUM(a.montoDebe) AS Debe, SUM(a.montoHaber) AS Haber
FROM         movimientosContables a INNER JOIN
                      CuentasContables b ON a.codigoCorto = b.codigoCorto AND b.codigoEmpresa = @empresa
WHERE     (a.codigoEmpresa = @empresa and fechaProceso between @fecha1 and @fecha2)
GROUP BY SUBSTRING(b.codigoCuenta, 1, 2) + '00000'
UNION ALL
SELECT     SUBSTRING(b.codigoCuenta, 1, 4) + '000' AS Codigo, SUM(a.montoDebe) AS Debe, SUM(a.montoHaber) AS Haber
FROM         movimientosContables a INNER JOIN
                      CuentasContables b ON a.codigoCorto = b.codigoCorto AND b.codigoEmpresa = @empresa
WHERE     (a.codigoEmpresa = @empresa and fechaProceso between @fecha1 and @fecha2)
GROUP BY SUBSTRING(b.codigoCuenta, 1, 4) + '000'
UNION ALL
SELECT     SUBSTRING(b.codigoCuenta, 1, 7) AS Codigo, SUM(a.montoDebe) AS Debe, SUM(a.montoHaber) AS Haber
FROM         movimientosContables a INNER JOIN
                      CuentasContables b ON a.codigoCorto = b.codigoCorto AND b.codigoEmpresa = @empresa
WHERE     (a.codigoEmpresa = @empresa and fechaProceso between @fecha1 and @fecha2)
GROUP BY SUBSTRING(b.codigoCuenta, 1,7)
ORDER BY codigo

SELECT     codigo, nombreCuenta, debe, haber,codigocorto
FROM         #Paso1, cuentascontables
WHERE     codigocuenta = codigo AND codigoempresa = @empresa --and 
SUBSTRING(codigoCuenta, 5,3)='000'
order by codigo
GO
这是为PGSql生成的代码,错误在变量paso1中,但我不知道在这行之后是否存在更多错误:

CREATE  OR REPLACE FUNCTION pabalanceclasificado(
p_empresa int , 
p_fecha1 timestamp(0) , 
p_fecha2 timestamp(0) 
)
     RETURNS VOID
 AS $$
    DECLARE
    BEGIN
            select     substring(b.codigocuenta, 1, 1) + '000000' as codigo, sum(a.montodebe) as debe, sum(a.montohaber) as haber
        into #paso1
        from         movimientoscontables a inner join
                              cuentascontables b on a.codigocorto = b.codigocorto and b.codigoempresa = p_empresa
        where     (a.codigoempresa = p_empresa and fechaproceso between p_fecha1 and p_fecha2)
        group by substring(b.codigocuenta, 1, 1) + '000000'
        union all
        select     substring(b.codigocuenta, 1, 2) + '00000' as codigo, sum(a.montodebe) as debe, sum(a.montohaber) as haber
        from         movimientoscontables a inner join
                              cuentascontables b on a.codigocorto = b.codigocorto and b.codigoempresa = p_empresa
        where     (a.codigoempresa = p_empresa and fechaproceso between p_fecha1 and p_fecha2)
        group by substring(b.codigocuenta, 1, 2) + '00000'
        union all
        select     substring(b.codigocuenta, 1, 4) + '000' as codigo, sum(a.montodebe) as debe, sum(a.montohaber) as haber
        from         movimientoscontables a inner join
                              cuentascontables b on a.codigocorto = b.codigocorto and b.codigoempresa = p_empresa
        where     (a.codigoempresa = p_empresa and fechaproceso between p_fecha1 and p_fecha2)
        group by substring(b.codigocuenta, 1, 4) + '000'
        union all
        select     substring(b.codigocuenta, 1, 7) as codigo, sum(a.montodebe) as debe, sum(a.montohaber) as haber
        from         movimientoscontables a inner join
                              cuentascontables b on a.codigocorto = b.codigocorto and b.codigoempresa = p_empresa
        where     (a.codigoempresa = p_empresa and fechaproceso between p_fecha1 and p_fecha2)
        group by substring(b.codigocuenta, 1,7)
        order by codigo
        select     codigo, nombrecuenta, debe, haber,codigocorto
        from         #paso1, cuentascontables
        where     codigocuenta = codigo and codigoempresa = p_empresa --and substring(codigocuenta, 5,3)='000'
        order by codigo
END;
$$ LANGUAGE plpgsql;
控制台显示:

ERROR:  error de sintaxis en o cerca de «#»
LÍNEA 11:   into #paso1
> Terminated with exit code 0.

但我认为这并不重要,因为我知道这不是实现这一功能的方法。。。我不知道如何正确地执行该函数中有多个错误:

在SQL中使用| |完成。所以substringb.codigocuenta,1,1+'000000'应该是substringb.codigocuenta,1,1 | | 000000' 不允许从开始。所以paso1是一个非法的变量名 您没有输入变量paso1。 您可以在单个变量中包含多行,因此看起来您希望在过程中返回查询结果。 您需要将函数声明为returns table not returns void 要从PL/pgSQL函数返回结果集,需要使用。您不能只编写select语句而不对结果执行任何操作。 但是您不需要PL/pgSQL来返回查询结果。一个SQL函数就足够了

CREATE  OR REPLACE FUNCTION pabalanceclasificado(p_empresa int, p_fecha1 timestamp(0), p_fecha2 timestamp(0))
     RETURNS table (codigo varchar, debe bigint, bigint haber)
 AS $$
  select codigo, nombrecuenta, debe, haber,codigocorto
  from (
      select     substring(b.codigocuenta, 1, 1) || '000000' as codigo, sum(a.montodebe) as debe, sum(a.montohaber) as haber
      from  movimientoscontables a 
         inner join cuentascontables b on a.codigocorto = b.codigocorto and b.codigoempresa = p_empresa
      where     (a.codigoempresa = p_empresa and fechaproceso between p_fecha1 and p_fecha2)
      group by substring(b.codigocuenta, 1, 1) || '000000'

      union all

      select     substring(b.codigocuenta, 1, 2) || '00000' as codigo, sum(a.montodebe) as debe, sum(a.montohaber) as haber
      from         movimientoscontables a inner join
                            cuentascontables b on a.codigocorto = b.codigocorto and b.codigoempresa = p_empresa
      where     (a.codigoempresa = p_empresa and fechaproceso between p_fecha1 and p_fecha2)
      group by substring(b.codigocuenta, 1, 2) || '00000'

      union all

      select     substring(b.codigocuenta, 1, 4) || '000' as codigo, sum(a.montodebe) as debe, sum(a.montohaber) as haber
      from  movimientoscontables a 
         inner join cuentascontables b on a.codigocorto = b.codigocorto and b.codigoempresa = p_empresa
      where     (a.codigoempresa = p_empresa and fechaproceso between p_fecha1 and p_fecha2)
      group by substring(b.codigocuenta, 1, 4) || '000'

      union all
      select     substring(b.codigocuenta, 1, 7) as codigo, sum(a.montodebe) as debe, sum(a.montohaber) as haber
      from         movimientoscontables a 
         inner join cuentascontables b on a.codigocorto = b.codigocorto and b.codigoempresa = p_empresa
      where     (a.codigoempresa = p_empresa and fechaproceso between p_fecha1 and p_fecha2)
      group by substring(b.codigocuenta, 1,7)
   ) t
     join cuentascontables 
       on codigocuenta = codigo 
      and codigoempresa = p_empresa --and substring(codigocuenta, 5,3)='000'
   order by codigo;
$$ 
LANGUAGE sql;
要使用该功能,请使用:

select *
from pabalanceclasificado(42, current_timestamp, current_timestamp);

错误消息是什么?我在您的问题中找不到它。控制台显示:错误:ERROR de sintaxis en o cerca de«LÍNEA 11:into paso1>终止,退出代码为0。但我认为这并不重要,因为我知道这不是实现这一功能的方法。。。我不知道CoreCtli怎么认为“into paso1”的第一个问题是pgsql没有为变量使用分隔符。尝试在所有位置将其更改为“paso1”。综上所述,它仍然以MS SQL为中心。。可能会有各种各样的问题,但我首先要更改变量名。我在pgsql 9.6中运行您的代码,控制台显示:test.sql:41:ERROR:ERROR de sintaxis en o cerca de«select»LÍNEA 35:select codigo、nombrecumenta、debe、haber、codigocorto;^以退出代码0终止。@JoséZuñiga:对不起,代码中的复制和粘贴太多。查看我的编辑