我有一个名为假期的表格,如下所示
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.请指向正确的方向
答案 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 );
答案 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;