使用游标的过程自动填充Oracle中的列

时间:2018-04-04 12:57:36

标签: sql oracle plsql

我有一个名为假期的表格,如下所示

private void onControl(String st,View v, MotionEvent event){
if(event.getAction() == MotionEvent.ACTION_DOWN){
   requestDisallowInterceptTouchEvent(true);
   new SendMessage().execute("S"+ st);
}
else if(event.getAction() == MotionEvent.ACTION_UP){
   requestDisallowInterceptTouchEvent(false);
   new SendMessage().execute("P "+ st);
}} 

另一个表日期,其中包含2011年的所有日期

date       |hol_name            |hol_id
-----------------------------------------
 01-01-2011|New Year's Day      |1     
02-01-2011 |Substitute Bank Hol |2           |2 

我想创建一个程序,使用光标自动填充 is_holiday 列,使用假期作为查找,然后填充 Y 如果日期是假日, N 如果不是。我只是有点困惑如何去做。创建一个返回0或1的函数然后在过程中使用它来自动填充是否更好?也就是说,如果它返回1,那么光标将插入Y,如果它返回0,它将插入N.请指向正确的方向

3 个答案:

答案 0 :(得分:2)

您可以从表中删除列is_holiday并创建一个类似

的视图
select d.date_id, d.date, nvl2(h.hol_id,'Y','N') as is_holiday 
    from date d left join holidays h on d.date = h.date;

这种方式总是最新的。

但我会将table_name和column_name从DATE重命名为其他内容以避免任何问题。日期是一个保​​留字。

否则,只需简单的更新即可。

update date du set is_holidays = (select nvl2(h.date,'Y','N') from date d left join holidays h on d.date = h.date where d.date = du.date);

答案 1 :(得分:1)

  

我想创建一个自动填充列is_holiday

的过程

可以使用这样的TRIGGER来完成。

CREATE OR REPLACE TRIGGER trg_holiday BEFORE
UPDATE OR INSERT ON DATES
FOR EACH ROW
BEGIN
    SELECT MAX(CASE 
                WHEN date_t = :NEW.date_t
                    THEN 'Y'
                ELSE 'N'
                END)
    INTO :NEW.is_holiday
    FROM holidays;
END;
/

请注意,Date是关键字,不应用于表名和列名。

如果您想要通过procedure,如您所述,您可以在程序中运行MERGE INTO

MERGE INTO DATES t
USING (
    SELECT d.date_id
        ,d.date_t
        ,CASE 
            WHEN h.date_t IS NULL
                THEN 'N'
            ELSE 'Y'
            END AS is_holiday
    FROM dates d
    LEFT JOIN holidays h ON d.date_t = h.date_t
    ) s
    ON (t.date_id = s.date_id)
WHEN MATCHED
    THEN
        UPDATE
        SET t.is_holiday = s.is_holiday;

或者这两个更新

UPDATE Dates d
SET IS_HOLIDAY = 'Y' WHERE EXISTS ( 
                     select 1 FROM holidays  h where h.date_t = d.date_t );

UPDATE Dates d
SET IS_HOLIDAY = 'N' WHERE NOT EXISTS ( 
                     select 1 FROM holidays  h where h.date_t = d.date_t ); 

Demo

答案 2 :(得分:0)

您不需要使用存储过程,因为您可以根据以下查询创建视图。

create view dbo.dates_vw (date_id, dte,is_holiday)
as
  select d.date_id, d.dte,
  case when h.dte is null
    then 'N' else 'Y' end as is_holiday
  from dates d
 left join holidays h
 on d.dte=h.dte;