【问题标题】:Checking if the values found by the cursor meet the new condition检查光标找到的值是否满足新条件
【发布时间】:2019-03-16 07:00:05
【问题描述】:

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

这是准备好的程序:

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”表中找到。更具体地说,在这个过程的框架中,我们发现出现在模式上的标识符,并且不包括在列 pk 的这个集体视图中。在我特别的瓶子里,有三个。该过程会告诉我在哪个表中找到了密钥。 一切都很好。但是,我必须为此功能添加另一个。 我在这个 schama 上有大约 132 个表,其中包含列“sourcepk”和“targetpk”。这些列还包含数字键。 现在我想确定一件事: 对于我找到的“typepkstrings”,这两列,即“sourcepk”和“targetpk”都应该为空。

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

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 循环中将上述选择添加到包含 sourcepk 和 targetpk 的表中,然后在 vTYPEPKSTRING 变量上添加 if 条件。是否在给定传递中的 fetch 操作之后,发现 'typepkstring' 是否具有这些列的一些值。然而,什么都没有发生 通常,我遇到新问题时不会中断。我真的需要帮助,至少在定位方面,尽管我不会鄙视代码。 提前感谢您的任何提示。:)

【问题讨论】:

    标签: oracle loops plsql cursors


    【解决方案1】:

    我已经结合、结合并弄清楚了。我放弃了之前的程序构建,并决定重新做一遍。

    我使用了 4 个嵌套游标,其中 2 个是引用游标。一切都根据假设进行。感谢您对上一篇文章的建议。

    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;
    /
    

    直到下一个,再见。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-06
      • 1970-01-01
      • 2022-06-13
      • 1970-01-01
      • 2020-12-16
      • 2019-11-11
      • 1970-01-01
      相关资源
      最近更新 更多