在我的程序中有一个这样的sql
select well_id from well where date = trunc(sysdate) - 1
并且这个sql在多个地方用作查询条件
update well_status set ... = ...
where well_id in (select well_id from well where date = trunc(sysdate) - 1)
update well_info set ... = ...
where well_id in (select well_id from well where date = trunc(sysdate) - 1)
我如何使用此sql作为变量或不需要在其他sql中重复此sql的东西?
如果您只能得到与您的查询匹配的单个
well_id
值:
CREATE PROCEDURE update_well
IS
v_well_id WELL.WELL_ID%TYPE;
BEGIN
SELECT well_id
INTO v_well_id
FROM well
WHERE date_column = trunc(sysdate) - 1;
update well_status
set status = NULL
where well_id = v_well_id;
update well_info
set info = NULL
where well_id = v_well_id;
END;
/
如果您可以获得多个与您的查询匹配的
well_id
值:
CREATE TYPE number_list IS TABLE OF NUMBER;
CREATE OR REPLACE PROCEDURE update_well
IS
v_well_ids number_list;
BEGIN
SELECT well_id
BULK COLLECT INTO v_well_ids
FROM well
WHERE date_column = trunc(sysdate) - 1;
update well_status
set status = NULL
where well_id MEMBER OF v_well_ids;
update well_info
set info = NULL
where well_id MEMBER OF v_well_ids;
END;
/
SQL_MACRO
(来自 Oracle 21)定义宏:
CREATE FUNCTION get_yesterday_well_id
RETURN VARCHAR2 SQL_MACRO(TABLE)
IS
BEGIN
RETURN 'SELECT well_id FROM well WHERE date_column = TRUNC(sysdate) - 1';
END;
/
然后在您的程序中使用它:
CREATE OR REPLACE PROCEDURE update_well
IS
BEGIN
update well_status
set status = NULL
where well_id IN (SELECT * FROM get_yesterday_well_id());
update well_info
set info = NULL
where well_id IN (SELECT * FROM get_yesterday_well_id());
END;
/
创建视图:
CREATE VIEW yesterday_well_id__v (well_id) AS
SELECT well_id FROM well WHERE date_column = TRUNC(sysdate) - 1;
然后在程序中使用视图:
CREATE OR REPLACE PROCEDURE update_well
IS
BEGIN
update well_status
set status = NULL
where well_id IN (SELECT well_id FROM yesterday_well_id__v);
update well_info
set info = NULL
where well_id IN (SELECT well_id FROM yesterday_well_id__v);
END;
/