Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Oracle更新查询-游标_Sql_Oracle - Fatal编程技术网

Sql Oracle更新查询-游标

Sql Oracle更新查询-游标,sql,oracle,Sql,Oracle,我想从SecondTable更新FirstTable,但是有很多复杂的地方。 这是主要查询: UPDATE x.FirstTable Table1 set Table1.UpdatedColumn = ( SELECT Table2.V_PROD_CODE FROM y.SecondTable Table2 WHERE Table2.XX_V_ACCOUNT_ID1 = Table1.XX_V_ACCOUNT_ID1 AND Table2.XX_V_ACCOUNT_ID2 = T

我想从SecondTable更新FirstTable,但是有很多复杂的地方。 这是主要查询:

UPDATE x.FirstTable Table1
set Table1.UpdatedColumn = (
  SELECT Table2.V_PROD_CODE
  FROM y.SecondTable Table2
  WHERE Table2.XX_V_ACCOUNT_ID1 = Table1.XX_V_ACCOUNT_ID1
  AND Table2.XX_V_ACCOUNT_ID2 = Table1.XX_V_ACCOUNT_ID2
  AND Table2.XX_V_ACCOUNT_ID3 = Table1.XX_V_ACCOUNT_ID3
  AND  Table2.c_Date between '17-Apr-2018' and '27-Apr-2018'
  AND Table2.c_DATE = Table1.c_date)
WHERE Table1.c_date between '17-Apr-2018' and '27-Apr-2018'
AND length(Table1.xx_v_account_id1) = 12;
时间太长了,所以我考虑创建一个光标:

create or replace procedure wco as
  cursor UpdateCursor is 
    SELECT Table2.V_PROD_CODE
    FROM y.SecondTable Table2
    INNER JOIN x.FirstTable Table1 on SUBSTR(Table1.V_CAST_REF_CODE, 6, 8) = SUBSTR(Table2.V_CAST_REF_CODE, 6, 8)
    WHERE Table2.XX_PRODUCT_CODECCOUNT_ID1 = Table1.XX_PRODUCT_CODECCOUNT_ID1
    AND Table2.XX_PRODUCT_CODECCOUNT_ID2 = Table1.XX_PRODUCT_CODECCOUNT_ID2
    AND Table2.XX_PRODUCT_CODECCOUNT_ID3 = Table1.XX_PRODUCT_CODECCOUNT_ID3
    AND  Table2.fic_mis_date between '17-Apr-2018' and '27-Apr-2018'
    AND Table2.c_DATE = Table1.c_date
for update;
    v_PRODUCT_CODE Table2.V_PROD_CODE%type;

begin
  open UpdateCursor;
  loop
    fetch UpdateCursor into v_PRODUCT_CODE;
    exit when UpdateCursor%notfound;

    update XXBADWH.xxba_dwh_instrument_master INST
    set INST.v_product_code = v_PRODUCT_CODE 
    WHERE current of UpdateCursor
    AND INST.fic_mis_date between '17-Apr-2018' and '27-Apr-2018'
    AND length (INST.xx_v_account_id1) = 12;
  end loop;

  close UpdateCursor;
end;


exec wco;

drop procedure wco;
这个查询有什么问题?还有更好的做法吗?

对于此查询:

UPDATE x.FirstTable Table1
    SET Table1.UpdatedColumn = (
            SELECT Table2.V_PROD_CODE
           FROM y.SecondTable Table2
           WHERE Table2.XX_V_ACCOUNT_ID1 = Table1.XX_V_ACCOUNT_ID1 AND
                 Table2.XX_V_ACCOUNT_ID2 = Table1.XX_V_ACCOUNT_ID2 AND
                 Table2.XX_V_ACCOUNT_ID3 = Table1.XX_V_ACCOUNT_ID3 AND
                 Table2.c_Date between DATE '2018-04-17'  and DATE '2018-04-27' AND
                 Table2.c_DATE = Table1.c_date
          )
WHERE Table1.c_date between DATE '2018-04-17' and DATE '2018-04-27' AND
      length(Table1.xx_v_account_id1) = 12;
您需要在
表1(长度(xx_v_账户id1)、c_日期)
表2(xx_v_账户id1、xx_v_账户ID2、xx_v_账户ID3、c_日期)


我将从索引开始(在
select
select语句中测试)。游标很少是获得更好性能的途径。

解释计划是什么?为什么您希望逐行更新比单个更新语句更快?那么我如何优化它?是什么让您认为查询有问题?错误消息?结果不正确???第一个查询花费的时间太长,第二个查询有错误,但显然第二个查询没有解决我们的主要问题,即性能,因为我使用的是游标