检查游标找到的值是否满足新条件

Checking if the values found by the cursor meet the new condition

所以我又回到了在示意图中搜索键/标识符的过程。

这是准备好的程序:

CREATE OR REPLACE PROCEDURE SIEROT(i_table_name VARCHAR2) IS
  strSelect      VARCHAR2(32767);
  c                  SYS_REFCURSOR;

  vTYPEPKSTRING  PRODUCTS.TYPEPKSTRING%TYPE;

  TYPE c_list IS TABLE of PRODUCTS.TYPEPKSTRING%type INDEX BY binary_integer; 
  TYPEPK_list c_list; 
  counter integer := 0; 
BEGIN 
  strSelect := 'SELECT DISTINCT i.TYPEPKSTRING ' ||
               '  FROM ' || i_table_name || ' i ' ||
               '  LEFT OUTER JOIN COMPOSEDTYPES c ' ||
               '    ON i.TYPEPKSTRING = c.PK ' ||
               '  WHERE c.PK IS NULL';

    OPEN c FOR strSelect;


  FETCH c INTO vTYPEPKSTRING;

  WHILE c%FOUND LOOP
    counter := counter + 1; 
    TYPEPK_list(counter) := vTYPEPKSTRING; 

    dbms_output.put_line('TABLE: '||i_table_name||'('||counter||'):'||TYPEPK_list(counter)); 

    FETCH c INTO vTYPEPKSTRING;
  END LOOP; 

  CLOSE c;
EXCEPTION
  WHEN OTHERS THEN
    IF c%ISOPEN THEN
      CLOSE c;
    END IF;
END SIEROT;

电话是这样的:

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
        SIEROT(ind.table_name);
    EXCEPTION 
        WHEN NO_DATA_FOUND THEN
        null;
    END; 
  END LOOP;
END;

此过程在架构中查找 'typepkstring' 的所有值。这些是键的值,可以在PK列的'composedtypes' table中找到。更具体地说,在这个过程的框架中,我们找到了出现在模式上但不包含在 pk 列中的这个集体视图中的标识符。在我特别的瓶子里,有三个。该过程告诉我在哪个 table 中找到了密钥。 一切都很好。但是,我必须为此功能添加另一个。 我在这个 schama 上有大约 132 tables,其中包含列 'sourcepk' 和 'targetpk'。这些列还包含数字键。 现在我想确定一件事: 这两列,即 'sourcepk' 和 'targetpk' 对于我找到的 'typepkstrings' 应该是空的。

我知道如何找到包含有趣列的 table:

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

一般来说,我想转换这部分程序:

FETCH c INTO vTYPEPKSTRING;

  WHILE c%FOUND LOOP
    counter := counter + 1; 
    TYPEPK_list(counter) := vTYPEPKSTRING; 

    dbms_output.put_line('TABLE: '||i_table_name||'('||counter||'):'||TYPEPK_list(counter)); 

    FETCH c INTO vTYPEPKSTRING;
  END LOOP; 

我试图在 for 循环中添加上面的 select 到 tables,其中包含 sourcepk 和 targetpk,然后是 vTYPEPKSTRING 变量的 if 条件。在给定传递中的提取操作之后,发现 'typepkstring' 是否具有这些列的某些值。然而,没有任何结果 通常,我遇到新问题不会中断。我真的需要帮助,至少在定位方面,尽管我不会轻视代码。 预先感谢您的任何提示。:)

我结合,结合,想通了。放弃了之前的程序构建,决定从头再来。

我使用了 4 个嵌套游标,其中 2 个是引用游标。一切都按照假设进行。感谢上期post.

的指教
CREATE OR REPLACE PROCEDURE SIEROTKA
IS
    t_name           VARCHAR2(30);
    od_typePK      PRODUCTS.TYPEPKSTRING%TYPE;
    t_nameST       VARCHAR(30);
    od_Source  cat2prodrel.SOURCEPK%TYPE;
    od_Target  cat2prodrel.TARGETPK%TYPE;

    sv_tname VARCHAR2(32767);
    Get_typePK      SYS_REFCURSOR;

    sv_tnameST      VARCHAR2(32767);
    Get_Sierotki         SYS_REFCURSOR;

    CURSOR Get_PK_TN
    IS
        SELECT table_name FROM all_tab_columns
        WHERE column_name='TYPEPKSTRING' AND
        table_name!='COMPOSEDTYPES';

    CURSOR Get_ST_TN
    IS
        SELECT DISTINCT table_name from all_tab_columns
        WHERE column_name='SOURCEPK' OR 
        column_name='TARGETPK';

BEGIN

    OPEN Get_PK_TN;
    LOOP
        FETCH Get_PK_TN INTO t_name;
        EXIT WHEN Get_PK_TN%NOTFOUND;

        sv_tname := 'SELECT DISTINCT i.TYPEPKSTRING FROM ' || t_name || ' i LEFT OUTER JOIN COMPOSEDTYPES c ON i.TYPEPKSTRING=c.PK WHERE c.PK IS NULL';

        OPEN Get_typePK FOR sv_tname;
        LOOP
            FETCH Get_typePK INTO od_typePK;
            IF Get_typePK%FOUND THEN
                    dbms_output.put_line('Znalezione Sirotka to: ' || t_name || ' --------- ' || od_typePK);
            ELSE
                    EXIT WHEN Get_typePK%NOTFOUND;
            END IF;

            OPEN Get_ST_TN;
            LOOP
                FETCH Get_ST_TN INTO t_nameST;
                EXIT WHEN Get_ST_TN%NOTFOUND;

                sv_tnameST := 'SELECT SOURCEPK, TARGETPK FROM ' || t_nameST || ' WHERE PK=' || od_typePK || '';

                OPEN Get_Sierotki FOR sv_tnameST;
                LOOP
                    FETCH Get_Sierotki INTO od_Source, od_Target;
                    IF Get_Sierotki%FOUND THEN
                            dbms_output.put_line('Jednak to nie sierotka, bo posiada wpis: ' || t_name || ' --------- ' || od_typePK || ' ____________ ' || t_namest || ' --------- ' || od_Source || ' --------- ' || od_Target);
                    ELSE
                            EXIT WHEN Get_Sierotki%NOTFOUND;
                    END IF;    
                END LOOP;
                CLOSE Get_Sierotki;

            END LOOP;
            CLOSE Get_ST_TN;

        END LOOP;
        CLOSE Get_typePK;

    END LOOP;
    CLOSE Get_PK_TN;

END;

为此,在开始结束块中进行简单的一行调用:

set serveroutput on
BEGIN
    SIEROTKA;
END;
/

下次再见。