检查游标找到的值是否满足新条件
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;
/
下次再见。
所以我又回到了在示意图中搜索键/标识符的过程。
这是准备好的程序:
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;
/
下次再见。