【问题标题】:cursor output use in select光标输出在选择中的使用
【发布时间】:2018-09-10 13:54:25
【问题描述】:

我的最后一个问题:select with variable parameter in the procedure

好的,我还有一个问题。我想将此过程扩展到另一个元素。好吧,我们已经从 typepkstring 列、模式上的所有表中选择了这些标识符,并且它们不在 Composedtypes 表的 PK 列中。它工作得很好。 除此之外还有一个新条件。在选择了我之前拥有的和已经实现的之后,我现在必须检查这些特定选择的标识符在包含 SOURCEPK 和 TARGETPK 列的表中是否有空字段。 为此,首先尝试将这个问题再次分解为小问题,最好是在特定表上。 这是他从上一个问题中得到的选择:

SELECT DISTINCT METAINFORMATIONS.TYPEPKSTRING
               FROM  METAINFORMATIONS
               LEFT OUTER JOIN COMPOSEDTYPES c 
               ON METAINFORMATIONS.TYPEPKSTRING = c.PK 
               WHERE c.PK IS NULL;

我选择做我现在想做的事:

SELECT DISTINCT METAINFORMATIONS.TYPEPKSTRING 
               FROM METAINFORMATIONS
               LEFT OUTER JOIN CAT2CATREL d
               ON METAINFORMATIONS.TYPEPKSTRING = d.TYPEPKSTRING
               WHERE d.sourcepk IS NULL AND d.targetpk IS NULL AND metainformations.typepkstring=8796093055031;

元信息表是一个“自然”满足前面过程条件的表 为了实现她只需要参数化,我认为它应该具有以下外观:

一般在select里面我给CAT2CATREL表的地方比较尊重,设置符合这个select的表名:

选择提取需要的表名:

select table_name from all_tab_columns where column_name='SOURCEPK' OR column_name ='TARGETPK';

此外,数字 8796093055031 应替换为第一个光标或 vTYPEPKSTRING 中的值。但我可以这样做吗?也许我应该创建第二个引用这个值的游标。

我希望我已经清楚地解释了这个问题,因为我可以在 cmets 中解释一次。感谢您的任何建议。 更新问题: 所以,我将前面过程中的选择修改为这个字符:

strSelect := 'SELECT DISTINCT m.TYPEPKSTRING ' ||
  ' FROM ' || i_table_name || ' m ' ||
  ' LEFT OUTER JOIN ' || is_table_name || ' d ' ||
  ' ON m.TYPEPKSTRING = d.TYPEPKSTRING ' ||
  ' WHERE d.sourcepk IS NULL AND ' ||
        ' d.targetpk IS NULL AND ' ||
        ' m.typepkstring IN (select count(*) from (SELECT DISTINCT m2.TYPEPKSTRING ' ||
                            ' FROM ' || i_table_name || ' m2 ' ||
                            ' LEFT OUTER JOIN COMPOSEDTYPES c2 ' ||
                            '  ON m2.TYPEPKSTRING = c2.PK ' ||
                            ' WHERE c2.PK IS NULL)) ';

由于如此构造的过程,我得到了我想要的键,但该条目适用于在修改后的调用中满足 select 的所有表。这意味着他不是接收到 2 个键,而是为每个表接收 2 个相同的键。我尝试以某种方式计数,但后来我在出口处没有收到任何东西。 修改后的调用:

set serveroutput on
DECLARE
    ind integer := 0;
BEGIN
FOR ind IN (select table_name from all_tab_columns where column_name='TYPEPKSTRING' AND table_name!='COMPOSEDTYPES')
  LOOP
       BEGIN
            FOR inds IN (select distinct table_name from all_tab_columns where column_name='SOURCEPK' OR column_name ='TARGETPK')
                LOOP
                  BEGIN
                    SIEROT(ind.table_name,inds.table_name);
            EXCEPTION 
                WHEN NO_DATA_FOUND THEN
                null;
                  END;
                END LOOP;
            END; 
  END LOOP;
END;

【问题讨论】:

    标签: oracle cursor procedure


    【解决方案1】:

    就替换 8796093055031 而言,您可以将第一条语句用作第二条语句中的子查询:

    SELECT DISTINCT m.TYPEPKSTRING 
      FROM METAINFORMATIONS m
      LEFT OUTER JOIN CAT2CATREL d
        ON m.TYPEPKSTRING = d.TYPEPKSTRING
      WHERE d.sourcepk IS NULL AND
            d.targetpk IS NULL AND
            m.typepkstring IN (SELECT DISTINCT m2.TYPEPKSTRING
                                 FROM  METAINFORMATIONS m2
                                 LEFT OUTER JOIN COMPOSEDTYPES c2
                                   ON m2.TYPEPKSTRING = c2.PK 
                                 WHERE c2.PK IS NULL);
    

    至于其余部分,如果我了解您要执行的操作,在我看来,您需要使用动态 SQL,如您上一个问题的答案所示。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-10
      • 2018-05-20
      • 2021-10-04
      • 2014-07-16
      • 1970-01-01
      • 2018-10-06
      • 2015-08-12
      • 1970-01-01
      相关资源
      最近更新 更多