【问题标题】:Return Oracle Row into Function/Procedure将 Oracle 行返回到函数/过程
【发布时间】:2019-12-04 20:27:04
【问题描述】:

我需要将以下查询转换为返回相同的函数/过程。 这是查询

SELECT ((SELECT count(*) FROM persona WHERE DTYPE = 'Vendedor' AND ACTIVO = 1) * (SELECT count(*) FROM TIPO_DOCUMENTO WHERE ENTIDAD = 'Vendedor' AND ACTIVO = 1) +
(SELECT count(*) FROM persona WHERE DTYPE = 'Peoneta' AND ACTIVO = 1) * (SELECT count(*) FROM TIPO_DOCUMENTO WHERE ENTIDAD = 'Peoneta' AND ACTIVO = 1)
+
(SELECT count(*) FROM VEHICULO WHERE ACTIVO = 1) * (SELECT count(*) FROM TIPO_DOCUMENTO WHERE ENTIDAD = 'Vehiculo' AND ACTIVO = 1 )) AS total, 
--Vigentes
((SELECT COUNT(*) FROM DOC_PERS WHERE FECHA_VIGENCIA >  SYSDATE +30  AND ACTIVO = 1) +
(SELECT COUNT(*) FROM DOC_VEH WHERE FECHA_VIGENCIA > SYSDATE +30 AND ACTIVO = 1))AS Vigentes,
--PorVencer
((SELECT COUNT(*) FROM DOC_PERS WHERE FECHA_VIGENCIA < SYSDATE +30 AND FECHA_VIGENCIA > SYSDATE + 15  AND ACTIVO = 1) +
(SELECT COUNT(*) FROM DOC_VEH WHERE FECHA_VIGENCIA < SYSDATE +30 AND FECHA_VIGENCIA > SYSDATE +15 AND ACTIVO = 1)) AS PorVencer,
--Criticos
((SELECT COUNT(*) FROM DOC_PERS WHERE FECHA_VIGENCIA < SYSDATE +15 AND FECHA_VIGENCIA > SYSDATE  AND ACTIVO = 1) +
(SELECT COUNT(*) FROM DOC_VEH WHERE FECHA_VIGENCIA < SYSDATE +15 AND FECHA_VIGENCIA > SYSDATE AND ACTIVO = 1)) AS Criticos
FROM DUAL;

我知道如何通过将每个选择放入一个变量来对其进行排序,但我不知道如何从那里返回一行。

我正在使用 dbveaver 来编辑它。

【问题讨论】:

  • 这很重要,但是 - 不幸的是 - 我完全不理解这个问题。你能简化它并再次描述问题吗?你知道,“我有 this 以及如何做 this 来获得 that” - 当然有例子吗?
  • 已编辑,我想要的是把那个长查询变成一个返回相同值的函数或过程

标签: oracle plsql dbeaver


【解决方案1】:

你有没有想过这样的事情:

CREATE OR REPLACE FUNCTION TEST_FUNCTION RETURN NUMBER AS 
CNT1 NUMBER;
CNT2 NUMBER;
TOTAL NUMBER;
BEGIN
  SELECT count(*) INTO CNT1 FROM persona WHERE DTYPE = 'Vendedor' AND ACTIVO = 1 ... etc.;
  SELECT count(*) INTO CNT2 FROM persona WHERE DTYPE = 'Peoneta' AND ACTIVO = 1 ... etc.;
 TOTAL := CNT1 + CNT2 ....; etc
END TEST_FUNCTION;

虽然不是 100% 确定您为什么要这样做。如果您想从函数中返回一个表以便对其执行 SELECT,请查看 here。但是由于您正在计算单个标量值,因此不确定其用途。

【讨论】:

  • 我需要返回包含以下列的单行。总计 - Vigentes - PorVencer - 批评家。不仅仅是一个值
  • 好的,然后看看我输入的链接。
【解决方案2】:

在包中,您可以创建执行查询的游标,然后从函数返回游标 %ROWTYPE 值:

CREATE OR REPLACE PACKAGE COUNT_STUFF_PKG AS
  CURSOR csrCount_stuff IS
    SELECT ((SELECT count(*)
               FROM persona
               WHERE DTYPE = 'Vendedor' AND
                     ACTIVO = 1) *
            (SELECT count(*)
               FROM TIPO_DOCUMENTO
               WHERE ENTIDAD = 'Vendedor' AND
                     ACTIVO = 1) +

            (SELECT count(*)
               FROM persona
               WHERE DTYPE = 'Peoneta' AND
               ACTIVO = 1) *
            (SELECT count(*)
               FROM TIPO_DOCUMENTO
               WHERE ENTIDAD = 'Peoneta' AND
                     ACTIVO = 1) +

            (SELECT count(*)
               FROM VEHICULO
               WHERE ACTIVO = 1) *
            (SELECT count(*)
               FROM TIPO_DOCUMENTO
               WHERE ENTIDAD = 'Vehiculo' AND
                     ACTIVO = 1 )) AS total, 

           --Vigentes
           ((SELECT COUNT(*)
               FROM DOC_PERS
               WHERE FECHA_VIGENCIA >  SYSDATE +30 AND
                     ACTIVO = 1) +
            (SELECT COUNT(*)
               FROM DOC_VEH
               WHERE FECHA_VIGENCIA > SYSDATE +30 AND
                     ACTIVO = 1))AS Vigentes,

           --PorVencer
           ((SELECT COUNT(*)
               FROM DOC_PERS
               WHERE FECHA_VIGENCIA < SYSDATE +30 AND
                     FECHA_VIGENCIA > SYSDATE + 15 AND
                     ACTIVO = 1) +
            (SELECT COUNT(*)
               FROM DOC_VEH
               WHERE FECHA_VIGENCIA < SYSDATE +30 AND
                     FECHA_VIGENCIA > SYSDATE +15 AND
                     ACTIVO = 1)) AS PorVencer,

           --Criticos
           ((SELECT COUNT(*)
               FROM DOC_PERS
               WHERE FECHA_VIGENCIA < SYSDATE +15 AND
                     FECHA_VIGENCIA > SYSDATE  AND
                     ACTIVO = 1) +
            (SELECT COUNT(*)
               FROM DOC_VEH
               WHERE FECHA_VIGENCIA < SYSDATE +15 AND
                     FECHA_VIGENCIA > SYSDATE AND
                     ACTIVO = 1)) AS Criticos
    FROM DUAL;

  FUNCTION COMPUTE_STUFF
    RETURN COUNT_STUFF_PKG.csrCount_stuff%ROWTYPE
END COUNT_STUFF_PKG;

CREATE OR REPLACE PACKAGE BODY COUNT_STUFF_PKG AS
  FUNCTION COMPUTE_STUFF
    RETURN COUNT_STUFF_PKG.csrCount_stuff%ROWTYPE
  IS
    rowCount_stuff  COUNT_STUFF_PKG.csrCount_stuff%ROWTYPE;
  BEGIN
    OPEN csrCount_stuff;

    FETCH csrCount_stuff
      INTO rowCount_stuff;

    CLOSE csrCount_stuff;

    RETURN rowCount_stuff;
  END COMPUTE_STUFF;
END COUNT_STUFF_PKG;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-18
    • 2014-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-12
    相关资源
    最近更新 更多