【发布时间】:2018-09-10 13:54:25
【问题描述】:
我的最后一个问题:select with variable parameter in the procedure
好的,我还有一个问题。我想将此过程扩展到另一个元素。好吧,我们已经从 typepkstring 列、模式上的所有表中选择了这些标识符,并且它们不在 Composedtypes 表的 PK 列中。它工作得很好。 除此之外还有一个新条件。在选择了我之前拥有的和已经实现的之后,我现在必须检查这些特定选择的标识符在包含 SOURCEPK 和 TARGETPK 列的表中是否有空字段。 为此,首先尝试将这个问题再次分解为小问题,最好是在特定表上。 这是他从上一个问题中得到的选择:
SELECT DISTINCT METAINFORMATIONS.TYPEPKSTRING
FROM METAINFORMATIONS
LEFT OUTER JOIN COMPOSEDTYPES c
ON METAINFORMATIONS.TYPEPKSTRING = c.PK
WHERE c.PK IS NULL;
我选择做我现在想做的事:
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;
元信息表是一个“自然”满足前面过程条件的表 为了实现她只需要参数化,我认为它应该具有以下外观:
一般在select里面我给CAT2CATREL表的地方比较尊重,设置符合这个select的表名:
选择提取需要的表名:
select table_name from all_tab_columns where column_name='SOURCEPK' OR column_name ='TARGETPK';
此外,数字 8796093055031 应替换为第一个光标或 vTYPEPKSTRING 中的值。但我可以这样做吗?也许我应该创建第二个引用这个值的游标。
我希望我已经清楚地解释了这个问题,因为我可以在 cmets 中解释一次。感谢您的任何建议。 更新问题: 所以,我将前面过程中的选择修改为这个字符:
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 的所有表。这意味着他不是接收到 2 个键,而是为每个表接收 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;
【问题讨论】: