【发布时间】: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