select 中的光标输出使用

cursor output use in select

我的最后一个问题:

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

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

我select正在做我现在想得到的:

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;

元信息table是一个table,"naturally"满足前面程序的条件 为了实现她只需要参数化的东西,我觉得应该是下面的样子:

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

select 提取 table 需要的名称:

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

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

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

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 的所有 table。这意味着他不是收到 2 个密钥,而是每个 table 收到 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;

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