创建简单的PL / SQL变量 - 在WHERE子句

时间:2017-03-01 19:04:03

标签: oracle plsql

感谢您的期待...

我花了好几个小时来研究这个问题,而且我不相信在PL / SQL中做一些很难在TSQL中做的事情。

我有一个连接2个表的简单查询:

     Select DISTINCT
      to_char(TO_DATE('1899123000', 'yymmddhh24')+ seg.NOM_DATE, 'mm/dd/yyyy') AS "Record Date"
    , cd.CODE
    , EMP.ID
    , EMP.SHORT_NAME

    FROM
     EWFM.GEN_SEG seg join EWFM.SEG_CODE cd ON seg.SEG_CODE_SK = cd.SEG_CODE_SK
     join EMP on seg.EMP_SK = EMP.EMP_SK
    where NOM_DATE = vMyDate;

我使用Toad Date Point,并且我正在查询Oracle Exadata源。生成的查询将被放入可视化工具,如QlikView或Tableau。我想创建一个简单的变量来使用WHERE子句,如代码所示。

在此示例中,NOM_DATE是一个整数,例如42793(2017年2月27日),您可以在第一行"记录日期"中看到。这里没什么新东西,不是很令人兴奋......直到......我试图创建一个变量来使查询更具动态性。

我尝试了各种各样的例子,但都失败了。如:
declare myDate number(8); Begin myDate := 42793; - 预计将失败ORA-06550 INTO条款

variable nomDate NUMBER
DEFINE nomDate = 42793
EXEC : nomDate := ' & nomDate'
...where NOM_DATE = ( & nomDate) ;

- ORA-00900:无效的SQL语句

variable nomDate NUMBER;
EXEC nomDate := 42793;
select count(DET_SEG_SK) from DET_SEG
where NOM_DATE = :nomDate;

- ORA-00900:无效的SQL语句

还有几个..希望你能得到这个想法。我花了几个小时研究stackoverflow以获得正确的答案,但正如你所看到的,我问你。从简单的声明,如" Var"更复杂的#34; DECLARE,BEGIN,SELECT INTO ...."实际创建函数,使用游标迭代输出....我仍然无法在Where子句中创建一个简单的变量。

请解释我的方式错误。

- Forlorn SQL Dev

3 个答案:

答案 0 :(得分:1)

pin

答案 1 :(得分:1)

由于您使用的是隐式游标,因此必须选择INTO变量。现在我不知道你变量的数据类型,所以我在下面的例子中猜到了,但希望你能明白这一点。

我应该提及另外两件事

  1. 你为什么要把你的日期告诉你。只需使用DATE数据类型。另外,我认为您的格式掩码也是错误的1899123000与yymmddhh24不匹配。
  2. 在显式游标中只需要一行;没有行,你得到NO_DATA_FOUND;不止一个,你得到TOO_MANY_ROWS
  3.   
    Declare 
       myDate number(8) := 42793; 
        /* These 4 variable data types are a guess */
       v_record_date varchar2(8);
       v_cd_code varchar2(10);
       v_emp_id number(4);
       v_emp_short_name varchar2(100);
     BEGIN 
     Select DISTINCT to_char(TO_DATE('1899123000', 'yymmddhh24')
                         + eg.NOM_DATE, 'mm/dd/yyyy') AS "Record Date" 
     , cd.CODE 
     , EMP.ID 
     , EMP.SHORT_NAME 
     INTO v_record_date, v_cd_code, v_emp_id, v_emp_short_name
     FROM EWFM.GEN_SEG seg 
     join EWFM.SEG_CODE cd 
       ON seg.SEG_CODE_SK = cd.SEG_CODE_SK 
     join EMP 
         on seg.EMP_SK = EMP.EMP_SK 
     where NOM_DATE = myDate; 
     END;
     /
    
      

答案 2 :(得分:0)

您将带有getter和setter的变量放在包中。

然后使用包含getter的视图

我个人更喜欢使用一种集合,我可以从表格中选择*(packagage.func(myparam))