如何在程序中的多个地方使用相同的sql

问题描述 投票:0回答:1

在我的程序中有一个这样的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的东西?

sql oracle plsql
1个回答
0
投票

选项 1:使用 PL/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;
/

选项 2:使用 PL/SQL 集合

如果您可以获得多个与您的查询匹配的

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;
/

选项 3:使用
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;
/

选项 4:创建视图

创建视图:

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;
/

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.