Sql 如何在查询前声明变量并为其赋值?

Sql 如何在查询前声明变量并为其赋值?,sql,oracle,plsql,Sql,Oracle,Plsql,我有一个复杂的查询,必须使用一个名为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;

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

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;

假设您希望在同一查询中多次使用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)

不需要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)

正如我所说,这个变量必须用于更复杂的查询,简化为“SUBUNITRATE*100”。所以我需要在以后多次使用它。正如我所说的,这个变量必须在更复杂的查询中使用,简化为“SUBUNITRATE*100”。因此,我需要在以后多次使用它。也许你可以创建一个存储功能SubmitrateArchar2 AccountId,或者根本不使用PL/SQL,而是将其作为子查询。通过简化查询,我们很难理解你想要实现的目标,也很难使用它来帮助你。请提供您实际需求的实际说明。将其设为函数并返回*100?也许你可以创建一个存储功能SubmitrateArch2 AccountId,或者根本不使用PL/SQL,而是将其作为子查询。通过简化你的查询,我们很难理解你想要实现什么,也很难使用它来帮助你。请提供您实际需求的实际说明。将其设为函数并返回*100?