首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ORACLE中的数据加密,仅使用视图

ORACLE中的数据加密,仅使用视图
EN

Stack Overflow用户
提问于 2016-10-07 18:25:58
回答 2查看 33关注 0票数 0

我在处理视图。我有一份有付款条件的定购单(30天,2期30天(30/60)等)和其他东西:

代码语言:javascript
复制
PO    SUPPLIER    DELIVERY_DATE PAYMENT_TERMS
1     A           2016-11-10    30 DAYS
2     B           2016-11-10    30/60 DAYS

我想看一下付款时间表。由于许可,我不能使用表,只能使用视图,而且为此我遇到了很多麻烦(尝试了用于更新的物化视图,没有运气,因为ORACLE抛出的查询非常复杂)。

这就是我想要的:

代码语言:javascript
复制
PO    SUPPLIER    DELIVERY_DATE PAYMENT_TERMS PAYMENT_DATE AMOUNT
1     A           2016-11-10    30 DAYS       2016-12-10   100%
2     B           2016-11-10    30/60 DAYS    2016-12-10   50%
2     B           2016-11-10    30/60 DAYS    2017-01-10   50%

有小费吗?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-07 18:42:42

那么,您似乎需要决定Payment_Terms的每个不同值真正意味着什么,因为没有内置的规则将" 30 /60天“解释为”30天后支付50%的一次付款,60天后再支付50%“。因此,我理解为什么查询太复杂,无法自动更新物化视图。具体来说,需要在输出中为一行输入创建多个行通常需要相对复杂的逻辑(使用UNION、花哨的JOIN语句等)。

您仍然可以使用物化视图,但是您需要自己强制刷新它(定期使用,或者在必要时使用触发器)。

无论哪种方式,获得所需内容的查询(多个查询之一)可能如下所示:

代码语言:javascript
复制
-- build the records for 30 DAYS
select po, supplier, delivery_date, payment_terms, (delivery_date + 30) as payment_date, 100 as amount
from The_Table
where payment_terms = '30 DAYS'
union all
-- build the records for the FIRST payment for 30/60
select po, supplier, delivery_date, payment_terms, (delivery_date + 30) as payment_date, 50 as amount
from The_Table
where payment_terms = '30/60 DAYS'
union all
-- build the records for the SECOND payment for 30/60
select po, supplier, delivery_date, payment_terms, (delivery_date + 60) as payment_date, 50 as amount
from The_Table
where payment_terms = '30/60 DAYS'

希望这能有所帮助。

票数 1
EN

Stack Overflow用户

发布于 2016-10-07 19:54:56

下面的解决方案假设"30“是表示”月“的一种传统方法--所有计算都是基于月份而不是天数。如果“天”的字面意思是“天”,那么解决方案就很容易适应。我假设"payment_terms“标记总是完全按照您提供的格式(两种可能性之一),而第二个数字,如果它存在,则是第一个数字的确切倍数。我又增加了两行测试。我想不出为什么这不能变成一个快速的、可刷新的物化视图。(不确定是否要更新--您希望通过此视图更新哪些内容?)

注:如果最后一列中的百分比要用于进一步的计算,则不应该将它们变成字符串(以%符号结尾);相反,它们应该是数字,比如1.0000、0.3333或0.5000。

代码语言:javascript
复制
with
     inputs ( po, supplier, delivery_date, payment_terms ) as (
       select 1, 'A', date '2016-11-10', '30 DAYS'     from dual union all
       select 2, 'B', date '2016-11-10', '30/60 DAYS'  from dual union all
       select 3, 'C', date '2015-03-13', '90 DAYS'     from dual union all
       select 4, 'D', date '2015-10-01', '90/270 DAYS' from dual
     ),
     prep ( po, supplier, delivery_date, payment_terms, freq, num ) as (
       select po, supplier, delivery_date, payment_terms,
              to_number(regexp_substr(payment_terms, '\d+', 1, 1)) / 30,
              nvl(to_number(regexp_substr(payment_terms, '\d+', 1, 2)) /
                    to_number(regexp_substr(payment_terms, '\d+', 1, 1)),  1)
       from inputs
     )
select po, supplier, delivery_date, payment_terms,
       add_months ( delivery_date, freq * level ) as payment_date,
       to_char(100/num, '999.99') || '%' as payment_amount
from prep
connect by level <= num
       and prior po = po
       and prior sys_guid() is not null
order by po, payment_date
;


        PO S DELIVERY_DATE PAYMENT_TERMS PAYMENT_DATE PAYMENT_AMOUNT
---------- - ------------- ------------- ------------ --------------
         1 A 10-NOV-2016   30 DAYS       10-DEC-2016   100.00%
         2 B 10-NOV-2016   30/60 DAYS    10-DEC-2016    50.00%
         2 B 10-NOV-2016   30/60 DAYS    10-JAN-2017    50.00%
         3 C 13-MAR-2015   90 DAYS       13-JUN-2015   100.00%
         4 D 01-OCT-2015   90/270 DAYS   01-JAN-2016    33.33%
         4 D 01-OCT-2015   90/270 DAYS   01-APR-2016    33.33%
         4 D 01-OCT-2015   90/270 DAYS   01-JUL-2016    33.33%
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39923689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档