2016-04-03 67 views
0

我有一个复杂的查询,必须使用一个号码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; 

但怎么可能呢?

+1

mayby你可以创建一个存储的函数submitRate(varchar2 accountID) – Turo

+0

或者根本不使用PL/SQL,而是将其作为子查询。 –

+0

通过“简化”您的查询,您已使我们很难理解您要实现的目标,因此难以用于帮助您。请提供您的实际需求的实际解释。 – APC

回答

2

假设你想使用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; 
2

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; 
+0

正如我所说的,该变量必须用于简化为“SUBUNITRATE * 100”的更复杂的查询中。所以我需要多次使用它。 – Khodabakhsh

0

无需PL。 APC'解决方案,简化并以您可以直接用于查询的形式使用(无论您会说... = subunitrate,比如说...... =(从sur中选择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)