【问题标题】:Reuse CTE after For LOOPFor LOOP 后重用 CTE
【发布时间】:2021-01-29 14:54:02
【问题描述】:

在我正在编写的程序中,我执行了几个步骤。在该过程的先前版本中,多个步骤将数据插入到被误用作临时数据的表中。但是,我插入的数据大于表的最大列大小(NVARCHAR2(2000))。这就是我重写程序以使用 CTE 而不是归档表格的原因。我重写了我用来匹配模板的forloop,如这个问题1 所示。但是,该过程的下一步应使用相同的 CTE 数据。我如何访问这个?如何将代码中“Step8”之后的部分与上面的部分合并?

我的代码的匿名部分:

FOR rec IN (.
WITH ELEMENT_CTE (Row1, Row2, Row3)
AS
(
...
)
,

EXPRESSIONS_CTE(Row1, Row2, Row3, Row4) 
AS
(
...
)

SELECT Row1,Row2, Row3, Row4 FROM EXPRESSIONS_CTE ) 

LOOP
    IF rec.Row1 = '3' THEN
    EXECUTE IMMEDIATE 'INSERT INTO SCHEMA.CMW_TABLENAMEONE...;
    COMMIT;
    ELSIF rec.Row1 = '5' THEN
    EXECUTE IMMEDIATE 'INSERT INTO SCHEMA.CMW_TABLENAMETWO...;
    COMMIT;
    END IF;
  END LOOP;

-- Step 8 
INSERT INTO SCHEMA.CMW_TABLENAMEONE (T1Row1, T1Row2, T1Row3)
SELECT DISTINCT Row1
     , Row2
     , NULL Row3
FROM EXPRESSIONS_CTE
WHERE Row1 = 3
MINUS
SELECT DISTINCT T1Row1
     , T1Row2
     , NULL T1Row3
FROM SCHEMA.CMW_TABLENAMEONE
;

【问题讨论】:

  • CTE 的范围仅限于查询。

标签: sql oracle stored-procedures common-table-expression


【解决方案1】:

如果您经常使用相同的 CTE,为什么不创建一个 视图 并在任何地方使用它?这也将解决您当前的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多