从 USER_CONSTRAINTS 中选择 CONSTRAINT_NAME 时约束名称无效

Invalid Constraint name when selecting CONSTRAINT_NAME from USER_CONSTRAINTS

我想获取所有 canstraint_name,这样我就可以在 java 中生成 ddl: 对于每个 canstraint_name 我要执行:

DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'CONSTRAINTS',true);
DBMS_METADATA.GET_DDL('CONSTRAINT','Constraint_name','hr');

我试图执行这条语句:

selectSQL = "SELECT CONSTRAINT_NAME FROM USER_CONSTRAINTS WHERE OWNER='" +Schemas+ "'";

我得到一长串约束,包括无效的约束,例如:pdpzZlEqTgUxb7qMBM8w==[=15=]

执行时产生错误:

 DBMS_METADATA.GET_DDL('CONSTRAINT','pdpzZlEqTgUxb7qMBM8w==[=14=]','hr')

can't find pdpzZlEqTgUxb7qMBM8w==[=16=] in Schemas='hr' (the error it's in French)

来自 GET_DDL 的错误消息表明这些约束属于删除的表(尽管这些名称以 BIN$ 开头)。您无法检索这些的 DDL。如果你不想要它们,你可以做一个

purge recyclebin;

在从 user_constraints 检索约束之前。

或者在检索约束列表时排除它们:

SELECT constraint_name 
FROM user_constraints 
WHERE constraint_name NOT LIKE 'BIN$%';

这个查询:

SELECT CONSTRAINT_NAME FROM USER_CONSTRAINTS WHERE OWNER='" +Schemas+ "'";

确实没有意义。 USER_CONSTRAINTS 将只列出当前用户拥有的约束。使用 USER_CONSTRAINTS 时,您永远不会从不同的模式中获得约束。

如果你想从不同的模式中获取约束,你需要使用ALL_CONSTRAINTS

如果您确实需要当前用户的约束,您可以安全地删除 WHERE 子句。