问题
I want to find a CONSTRAINT_NAME in Oracle by SEARCH_CONDITION.
SELECT * FROM ALL_CONSTRAINTS
WHERE TABLE_NAME = 'myTableName';
AND SEARCH_CONDITION = '"myColumn" IS NOT NULL';
ORA-00997: illegal use of LONG datatype.
How to query by SEARCH_CONDITION?
回答1:
SEARCH_CONDITION is LONG so you can't use it for .... very much useful.
For this particular use, I suggest PLSQL routine to write the LONG col into a VARCHAR2(32767) and then apply the check on teh VARCHAR2 variable.
LONGs are an absolute pain.
Also, in your case you can restrict the dataset further by querying ALL_CONS_COLUMNS WHERE column_name = 'colname' and joining the ALL_CONSTRAINTS to get the SERACH_CONDITION.
回答2:
You can write a simple stored procedure:
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;
/
Then you can use it in the query:
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';
来源:https://stackoverflow.com/questions/24865539/query-to-find-constraint-by-search-condition