首页 > 解决方案 > pl/sql 函数中的多个查询

问题描述

我在 pl/sql 中有一个函数,我想要三个查询,每个查询都会设置一个变量(存在、撤回和日期),返回的字符串取决于这些变量的组合。

CREATE OR REPLACE FUNCTION get_cat_status (systemId IN NUMBER)
    RETURN VARCHAR2
AS
    status      VARCHAR2 (2000) := 'Null';
    exist       NUMBER := 1;
    withdrawn   NUMBER := 0;
    dates       NUMBER := 0;
BEGIN
    BEGIN
          SELECT DISTINCT result
            INTO exist
            FROM SEEDTEST_RESULT
           WHERE     SEEDTEST_RESULT.RESULT = '1'
                 AND SEEDTEST_RESULT.TEST_TYPE = 'C'
                 AND SEEDTEST_RESULT.SLRN_ID = systemId;
    EXCEPTION
        WHEN NO_DATA_FOUND
        THEN
            exist := 1;
    END;

    BEGIN
      SELECT 1
        INTO withdrawn
        FROM CROP
       WHERE     CROP.SYSTEM_ID = systemId
             AND NVL ( (CROP.ORIG_AREA - NVL (CROP.ADD_AREA, 0)), 0) = 0;

   EXCEPTION
    WHEN NO_DATA_FOUND
    THEN
        withdrawn := 1;
   END;

   BEGIN
      SELECT DATE_3_PROC  --replaced with 1 and works
        INTO dates
        FROM CROP
       WHERE CROP.SYSTEM_ID = systemId;
   EXCEPTION
    WHEN NO_DATA_FOUND
    THEN
        dates := 1;
   END;

    IF (dates = 0 AND withdrawn = 1)
    THEN
        status := 'NO RESULT';
    END IF;

    IF (dates = 1 AND exist = 1)
    THEN
        status := 'REJECTED';
    END IF;

    RETURN (status);
END get_cat_status;

我试图添加它们,但到目前为止它不起作用。有人可以帮忙吗?

标签: oracleplsql

解决方案


这个功能正在做我现在想要的。在第三个查询不起作用之前,因为 DATE_3_PROC 是一个日期,我将它分配给dates一个数字。在原始的 Access 应用程序中,它只检查每个查询是否没有返回记录并更新相应的变量。在 Oracle 中,我将它与into混合在一起,后者已经将值分配给了变量,但这没有意义。现在,当查询没有返回任何记录时,我分配 0 而不是 1,当有记录时它会是 1。

Create or replace FUNCTION get_cat_status(systemId IN Number) 
 RETURN VARCHAR2 
 AS 
   status VARCHAR2(2000) := ' ';
   exist NUMBER;
   withdrawn NUMBER;
   dates NUMBER;
 BEGIN 

  BEGIN
   SELECT DISTINCT 1 INTO exist
   FROM SEEDTEST_RESULT
   WHERE SEEDTEST_RESULT.RESULT = '1'
     AND SEEDTEST_RESULT.TEST_TYPE = 'C'
     AND SEEDTEST_RESULT.SLRN_ID = systemId;
   EXCEPTION
     WHEN NO_DATA_FOUND THEN
       exist := 0;  
   END;  

   BEGIN      
     SELECT 1 INTO withdrawn
    FROM CROP
    WHERE CROP.SYSTEM_ID = systemId
      AND NVL((CROP.ORIG_AREA - NVL(CROP.ADD_AREA, 0)), 0) = 0;
    EXCEPTION
      WHEN NO_DATA_FOUND THEN
        withdrawn := 0;  
  END;

  BEGIN
    SELECT 1 INTO dates 
    FROM CROP
    WHERE CROP.SYSTEM_ID = systemId;
    EXCEPTION
      WHEN NO_DATA_FOUND THEN
        dates := 0;  
  END;      

  IF (dates = 1 and withdrawn = 0) THEN 
    status := 'NO RESULT';
  END IF;
  IF (dates = 0 and exist = 0) THEN 
    status := 'REJECTED';
  END IF;

  RETURN(status); 

END get_cat_status;

推荐阅读