回答

收藏

可以在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基本上是两种独立的语言。您的解决方案是正确的。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则