我的最后一个问题: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;
元信息表是“自然”满足上一过程条件的表 为了实现她只需要参数化的功能,我认为它应该具有以下外观:
通常在选择CAT2CATREL表的位置时,设置符合此选择的表名:
选择以提取需要的表名
select table_name from all_tab_columns where column_name='SOURCEPK' OR column_name ='TARGETPK';
此外,数字8796093055031应该替换为第一个游标或vTYPEPKSTRING中的值。但是我可以这样行动吗?也许我应该创建第二个引用此值的游标。
我希望我已经清楚地解释了这个问题,因为我可以在评论中解释一次。感谢您的任何建议。 更新问题: 因此,我将前面过程中的选择修改为该字符:
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的所有表。这意味着他没有收到例如两个键,而是为每个表接收了两个相同的键。我以某种方式尝试过计算,但是在出口我什么也没收到。 修改后的通话:
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;
答案 0 :(得分:0)
就替换8796093055031而言,您可以仅将第一条语句用作第二条语句中的子查询:
SELECT DISTINCT m.TYPEPKSTRING
FROM METAINFORMATIONS m
LEFT OUTER JOIN CAT2CATREL d
ON m.TYPEPKSTRING = d.TYPEPKSTRING
WHERE d.sourcepk IS NULL AND
d.targetpk IS NULL AND
m.typepkstring IN (SELECT DISTINCT m2.TYPEPKSTRING
FROM METAINFORMATIONS m2
LEFT OUTER JOIN COMPOSEDTYPES c2
ON m2.TYPEPKSTRING = c2.PK
WHERE c2.PK IS NULL);
对于其余的内容,如果我了解您要尝试做的事情,在我看来,您将需要使用动态SQL,如上一个问题的答案所示。