可以在Oracle ALTER语句中使用子查询吗?
技术问答
285 人阅读
|
0 人回复
|
2023-09-14
|
给定一个表名和一个列名,我试图动态删除一个我事先不知道名称的Oracle约束。+ i+ O$ C3 c9 s" [0 I9 O# H
我可以通过以下查询找到约束名称:9 h# v" c! Q7 ?' @- W, k
SELECT CONSTRAINT_NAME ! |9 B6 Z3 t4 I) n& t3 g& X
FROM USER_CONS_COLUMNS ) Y2 n" w8 U$ E. F& a
WHERE TABLE_NAME = 'MyTable' AND
o+ D' s0 |5 U5 G2 V7 k COLUMN_NAME='MyColumn' AND POSITION IS NULL
. g6 H$ k2 P n我的第一个想法是使用子查询,但这不起作用,并导致ORA-02250错误:
2 s, I7 G$ _& Q2 d2 MALTER TABLE MyTable 6 N: `& l: n8 g0 O) _; A7 q1 W+ V
DROP CONSTRAINT ($ y" \: m1 Y! p
SELECT CONSTRAINT_NAME , ]; T/ N6 ]7 _+ ]( s3 @) Y& r
FROM USER_CONS_COLUMNS
: Y6 a, ?5 Y' b: r% r WHERE TABLE_NAME = 'MyTable' AND 9 S9 ^1 @: ~% ^, g1 C
COLUMN_NAME='MyColumn' AND POSITION IS NULL)
- o; V: l; \4 {" G4 v到目前为止,我唯一可行的解??决方案是以下解决方案,但感觉不必要的复杂:3 D, x- p; m7 H- L3 ~; n7 E
DECLARE 4 j/ e: F8 X, l1 |5 b
statement VARCHAR2(2000);1 Y" z1 t+ T' H' D8 Y
constr_name VARCHAR2(30);' }/ L0 p+ b! K8 ]5 ]/ m& L- q
BEGIN T' X/ m! p- c. }- S$ B) h, ?
SELECT CONSTRAINT_NAME INTO constr_name $ Q8 Q* D$ G" o( B
FROM USER_CONS_COLUMNS " H; l5 _2 E5 y
WHERE table_name = 'MyTable' AND . T* V) A0 |+ T" Y! O
column_name = 'MyColumn' AND position is null;( _" m3 Q7 F) h0 b3 [
statement := 'ALTER TABLE MyTable DROP CONSTRAINT '|| constr_name;
0 D) O1 T& w Y+ A6 o EXECUTE IMMEDIATE(statement);
2 p4 N8 b* N9 G, G4 aEND;
% r+ ~/ w( Q8 n+ p/ | u+ r3 ?- q/' ]" w8 G8 N7 {0 @
是否有一种方法可以像我最初打算的那样使用子查询来做到这一点?如果不是,那么有人可以建议一种更简洁的方法吗?
2 U% h. b8 ?6 N7 K8 V
. L \3 @$ ~7 Y0 z8 G解决方案:
4 |: V: g; }8 x$ A. P8 J' B' Y # y8 a2 B0 @+ U
1 h9 z9 U2 _1 m+ y( t9 D! m @* S6 ~. h0 W9 P
你不能。SQL和DDL基本上是两种独立的语言。您的解决方案是正确的。 |
|
|
|
|
|