光标输出在select

时间:2018-09-10 13:54:25

标签: oracle cursor procedure

我的最后一个问题: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;

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

通常在选择CAT2CATREL表的位置时,设置符合此选择的表名:

选择以提取需要的表名

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

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

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

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的所有表。这意味着他没有收到例如两个键,而是为每个表接收了两个相同的键。我以某种方式尝试过计算,但是在出口我什么也没收到。 修改后的通话:

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;

1 个答案:

答案 0 :(得分:0)

就替换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,如上一个问题的答案所示。