查询通过SEARCH_CONDITION查找约束

时间:2014-07-21 12:49:47

标签: sql oracle constraints

我希望通过SEARCH_CONDITION在Oracle中找到CONSTRAINT_NAME。

SELECT * FROM ALL_CONSTRAINTS
WHERE TABLE_NAME = 'myTableName';
AND SEARCH_CONDITION = '"myColumn" IS NOT NULL';

ORA-00997:非法使用LONG数据类型。

如何通过SEARCH_CONDITION查询?

3 个答案:

答案 0 :(得分:1)

您可以编写一个简单的存储过程:

CREATE OR REPLACE FUNCTION get_search_condition(
  p_owner           ALL_CONSTRAINTS.OWNER%TYPE,
  p_constraint_name ALL_CONSTRAINTS.CONSTRAINT_NAME%TYPE
) RETURN VARCHAR2
IS
  v_long LONG;
BEGIN
  SELECT SEARCH_CONDITION
  INTO   v_long
  FROM   ALL_CONSTRAINTS
  WHERE  CONSTRAINT_NAME = p_constraint_name
  AND    OWNER           = p_owner
  AND    CONSTRAINT_TYPE = 'C';

  RETURN SUBSTR( v_long, 1, 32760 );
END;
/

然后您可以在查询中使用它:

SELECT CONSTRAINT_NAME,
       get_search_condition( OWNER, CONSTRAINT_NAME ) AS SEARCH_CONDITION
FROM   ALL_CONSTRAINTS
WHERE  OWNER           = 'MYSCHEMA'
AND    TABLE_NAME      = 'MYTABLENAME'
AND    CONSTRAINT_TYPE = 'C'
AND    get_search_condition( OWNER, CONSTRAINT_NAME ) = '"MYCOLUMN" IS NOT NULL';

答案 1 :(得分:0)

SEARCH_CONDITION很长,因此您无法使用它......非常有用。

对于这个特殊用途,我建议PLSQL例程将LONG col写入VARCHAR2(32767),然后对teh VARCHAR2变量应用检查。

LONGs绝对是一种痛苦。

此外,在您的情况下,您可以通过查询ALL_CONS_COLUMNS WHERE column_name =' colname'来进一步限制数据集。并加入ALL_CONSTRAINTS以获得SERACH_CONDITION。

答案 2 :(得分:0)

Oracle 自 12c 起通过向 'SEARCH_CONDITION_VC' 表添加另一列 varchar 数据类型的 CBD_/DBA_/USER_/ALL_CONSTRAINTS 列解决了此问题。