繁体   English   中英

查询前如何声明变量并赋值?

[英]How to declare and assign value to a variable before query?

我有一个复杂的查询,必须使用一个称为SubUnitRate的数字。 此变量来自具有特殊条件的另一个表。 简而言之,我们有:

DECLARE
SUBUNITRATE   NUMBER;
BEGIN
SELECT NVL (NULLIF (CU.SUBUNITRATE, 0), 1)
 INTO SUBUNITRATE
 FROM CURRENCYS CU
      JOIN ACCOUNTS ACC ON CU.ID = ACC.CURRENCY
WHERE ACC.ID = :ACCOUNTID;
END;
SELECT SUBUNITRATE * 100 FROM DUAL;

我的目标是获取(在简单情况下)的结果:

SELECT SUBUNITRATE * 100 FROM DUAL;

但是那怎么可能呢?

PL / SQL块不能将查询结果作为查询返回。 相反,您可以打印出结果。

那么,这是您想要的吗?

DECLARE
    SUBUNITRATE   NUMBER;
BEGIN
    SELECT NVL(NULLIF(CU.SUBUNITRATE, 0), 1)
    INTO SUBUNITRATE
    FROM CURRENCYS CU JOIN
         ACC
         ON CU.ID = ACC.CURRENCY
    WHERE ACC.ID = :ACCOUNTID;

    DBMS_OUTPUT.PUT_LINE(SUBUNITRATE * 100)
END;

假设您想在同一查询中多次使用SUBUNITRATE的值,则可以使用WITH子句:

with cte as ( 
   select case 
            when CU.SUBUNITRATE = 0 then 1 
            else CU.SUBUNITRATE 
          end as SUBUNITRATE
   FROM CURRENCYS CU
   JOIN ACCOUNTS ACC ON CU.ID = ACC.CURRENCY
   WHERE ACC.ID = :ACCOUNTID
    )
select cte.SUBUNITRATE * 100
from cte;

无需PL。 APC的简化解决方案,可以直接在查询中使用的形式(无论您说的是... =次单位,还是说= =(从cte中选择sur)-包括括号在内):

with cte_prelim as (select subunitrate from ... etc.),
cte (sur) as select case when subunit rate is null or subunitrate = 0 then 100
                    else subunitrate * 100 end from cte_prelim)
select...  (your query where you need to use the value)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM