oracle SELECT不将数据存储在PL/SQL变量中

bmvo0sr5  于 2023-03-22  发布在  Oracle
关注(0)|答案(2)|浏览(149)

好了,我又做了一个脚本,我需要在PL/SQL变量中存储一些数据。现在由于某种原因,我不能存储所说的数据。我尝试了没有INTO语句的查询本身,以证明查询是否是错误的,我得到了我期望的结果。但是一旦我到达匿名块,INTO不起作用,输出说没有找到数据。
这是剧本。

SET SERVEROUTPUT ON;
VAR TP1 VARCHAR2(30);
EXEC TP1 := &TIPO_PROPIEDAD_1;
DBMS_OUTPUT.PUT_LINE(:TP1);
DECLARE
    V_CANT_1 PROPIEDAD.NRO_PROPIEDAD%TYPE;
    V_TOTAL_1 PROPIEDAD.VALOR_ARRIENDO%TYPE;
    V_DESC_1 TIPO_PROPIEDAD.DESC_TIPO_PROPIEDAD%TYPE;
BEGIN
-- CONSULTA 1
    SELECT
        COUNT(PR.NRO_PROPIEDAD),
        SUM(PR.VALOR_ARRIENDO),
        TP.DESC_TIPO_PROPIEDAD
        INTO
            V_CANT_1,
            V_TOTAL_1,
            V_DESC_1
    FROM
        PROPIEDAD PR INNER JOIN TIPO_PROPIEDAD TP
        ON PR.ID_TIPO_PROPIEDAD = TP.ID_TIPO_PROPIEDAD
    WHERE
        TP.ID_TIPO_PROPIEDAD = :TP1
    GROUP BY
        TP.DESC_TIPO_PROPIEDAD;
   
    DBMS_OUTPUT.PUT_LINE('RESUMEN DE : ' || V_DESC_1);
    DBMS_OUTPUT.PUT_LINE('TOTAL DE PROPIEDADES : ' || V_CANT_1);
    DBMS_OUTPUT.PUT_LINE('VALOR TOTAL ARRIENDO : ' || V_TOTAL_1);
END;

这里我将同时使用PROPIEDAD和TIPO_PROPIEDAD的数据类型,以备有人需要帮助。
PROPIEDAD:

Nombre                  ¿Nulo?   Tipo         
----------------------- -------- ------------ 
NRO_PROPIEDAD           NOT NULL NUMBER(6)       
VALOR_ARRIENDO          NOT NULL NUMBER(7)       
ID_TIPO_PROPIEDAD       NOT NULL VARCHAR2(1)

TIPO_PROPIEPAD:

Nombre              ¿Nulo?   Tipo         
------------------- -------- ------------ 
ID_TIPO_PROPIEDAD   NOT NULL VARCHAR2(1)  
DESC_TIPO_PROPIEDAD NOT NULL VARCHAR2(30)

我也会把错误写在这里。

Informe de error -
ORA-01403: No se ha encontrado ningún dato
ORA-06512: en línea 7
01403. 00000 -  "no data found"
*Cause:    No data was found from the objects.
*Action:   There was no data from the objects which may be due to end of fetch.

此外,当我运行不带绑定变量的查询作为普通查询时,它确实会找到数据:

SELECT
        COUNT(PR.NRO_PROPIEDAD),
        SUM(PR.VALOR_ARRIENDO),
        TP.DESC_TIPO_PROPIEDAD
    FROM
        PROPIEDAD PR INNER JOIN TIPO_PROPIEDAD TP
        ON PR.ID_TIPO_PROPIEDAD = TP.ID_TIPO_PROPIEDAD
    WHERE
        TP.ID_TIPO_PROPIEDAD = 'A'
    GROUP BY
        TP.DESC_TIPO_PROPIEDAD;

结果:

COUNT(PR.NRO_PROPIEDAD) SUM(PR.VALOR_ARRIENDO) TP.DESC_TIPO_PROPIEDAD
7                       3445000                Casa sin Amoblar
7vhp5slm

7vhp5slm1#

根据您发布的内容,您错过或忽略了脚本将产生的早期错误;这个:

EXEC TP1 := &TIPO_PROPIEDAD_1;

应该是

EXEC :TP1 := '&TIPO_PROPIEDAD_1';

如果没有冒号,您对TP1的引用将被视为局部变量,而不是您声明的绑定变量,您将看到“PLS-00201:标识符'TP 1'必须声明为”“(在它提示您输入绑定值之后,这可能会使您认为该部分正在工作)。这意味着当您稍后在where子句中使用实际绑定变量时,它仍然为null,因此没有匹配项。
如果没有单引号,它将把替换值A视为另一个标识符而不是字符串,并且绑定变量仍然为null。
您的DBMS_OUTPUT.PUT_LINE(:TP1);调试也将错误与“未知的命令”,因为您正在调用一个PL/SQL块外;你可以使用PRINT TP1(带或不带冒号!)。

vfhzx4xs

vfhzx4xs2#

它不工作,因为没有匹配的行,所以抛出(不言自明的)异常NO_DATA_FOUND
如果你想输出一行,那么就在整个结果集中进行聚合:

DECLARE
    V_CANT_1 PROPIEDAD.NRO_PROPIEDAD%TYPE;
    V_TOTAL_1 PROPIEDAD.VALOR_ARRIENDO%TYPE;
    V_DESC_1 TIPO_PROPIEDAD.DESC_TIPO_PROPIEDAD%TYPE;
BEGIN
-- CONSULTA 1
  SELECT COUNT(PR.NRO_PROPIEDAD),
         SUM(PR.VALOR_ARRIENDO),
         MAX(TP.DESC_TIPO_PROPIEDAD)
  INTO   V_CANT_1,
         V_TOTAL_1,
         V_DESC_1
  FROM   PROPIEDAD PR INNER JOIN TIPO_PROPIEDAD TP
         ON PR.ID_TIPO_PROPIEDAD = TP.ID_TIPO_PROPIEDAD
  WHERE  TP.ID_TIPO_PROPIEDAD = :TP1;
   
  DBMS_OUTPUT.PUT_LINE('RESUMEN DE : ' || V_DESC_1);
  DBMS_OUTPUT.PUT_LINE('TOTAL DE PROPIEDADES : ' || V_CANT_1);
  DBMS_OUTPUT.PUT_LINE('VALOR TOTAL ARRIENDO : ' || V_TOTAL_1);
END;
/

它将始终返回一行,并应输出:

RESUMEN DE : 0
TOTAL DE PROPIEDADES : 
VALOR TOTAL ARRIENDO :

因为没有匹配的行,所以计数将是0,没有SUM,也没有描述。
或者,您可以处理异常:

DECLARE
    V_CANT_1 PROPIEDAD.NRO_PROPIEDAD%TYPE;
    V_TOTAL_1 PROPIEDAD.VALOR_ARRIENDO%TYPE;
    V_DESC_1 TIPO_PROPIEDAD.DESC_TIPO_PROPIEDAD%TYPE;
BEGIN
-- CONSULTA 1
  BEGIN
    SELECT COUNT(PR.NRO_PROPIEDAD),
           SUM(PR.VALOR_ARRIENDO),
           TP.DESC_TIPO_PROPIEDAD
    INTO   V_CANT_1,
           V_TOTAL_1,
           V_DESC_1
    FROM   PROPIEDAD PR INNER JOIN TIPO_PROPIEDAD TP
           ON PR.ID_TIPO_PROPIEDAD = TP.ID_TIPO_PROPIEDAD
    WHERE  TP.ID_TIPO_PROPIEDAD = :TP1
    GROUP BY
           TP.DESC_TIPO_PROPIEDAD;
  EXCEPTION
    WHEN NO_DATA_FOUND THEN
      V_CANT_1 := 0;
      V_TOTAL_1 := NULL;
      V_DESC_1 := NULL;
    WHEN TOO_MANY_ROWS THEN
      -- Do something to handle this as well.
      RAISE;
  END;

  DBMS_OUTPUT.PUT_LINE('RESUMEN DE : ' || V_DESC_1);
  DBMS_OUTPUT.PUT_LINE('TOTAL DE PROPIEDADES : ' || V_CANT_1);
  DBMS_OUTPUT.PUT_LINE('VALOR TOTAL ARRIENDO : ' || V_TOTAL_1);
END;
/

fiddle

相关问题