ওরাকল: যদি টেবিলের অস্তিত্ব থাকে


343

আমি ওরাকল ডাটাবেসের জন্য কিছু মাইগ্রেশন স্ক্রিপ্ট লিখছি এবং আশা করছিলাম যে ওরাকেলের মাইএসকিউএল এর মতো কিছু রয়েছে IF EXISTS নির্মাণের ।

বিশেষত, যখনই আমি মাইএসকিউএলে একটি টেবিলটি ফেলে রাখতে চাই, আমি এর মতো কিছু করি

DROP TABLE IF EXISTS `table_name`;

এইভাবে, টেবিলটি উপস্থিত না থাকলে, DROPত্রুটি তৈরি করে না এবং স্ক্রিপ্টটি চালিয়ে যেতে পারে।

ওরাকল এর কি একই রকম প্রক্রিয়া আছে? আমি বুঝতে পেরেছি যে টেবিলের উপস্থিতি রয়েছে কিনা তা পরীক্ষা করতে আমি নীচের ক্যোয়ারীটি ব্যবহার করতে পারি

SELECT * FROM dba_tables where table_name = 'table_name';

তবে এটির সাথে বেঁধে দেওয়ার সিনট্যাক্সটি DROPআমার সাথে পালাচ্ছে।

উত্তর:


585

সর্বোত্তম এবং কার্যকর উপায় হ'ল "টেবিল পাওয়া যায় নি" ব্যতিক্রম ধরা: এটি টেবিলের দু'বার উপস্থিত রয়েছে কিনা তা পরীক্ষা করার ওভারহেডকে এড়িয়ে চলে; এবং এই সমস্যায় ভুগছেন না যে যদি ডিআআরপি অন্য কোনও কারণে ব্যর্থ হয় (তবে এটি গুরুত্বপূর্ণ হতে পারে) ব্যতিক্রমটি কলারের কাছে উত্থাপিত হয়:

BEGIN
   EXECUTE IMMEDIATE 'DROP TABLE ' || table_name;
EXCEPTION
   WHEN OTHERS THEN
      IF SQLCODE != -942 THEN
         RAISE;
      END IF;
END;

অ্যাডেন্ডেন্ডাম রেফারেন্সের জন্য, অন্যান্য বস্তুর ধরণের সমতুল্য ব্লকগুলি এখানে:

ক্রম

BEGIN
  EXECUTE IMMEDIATE 'DROP SEQUENCE ' || sequence_name;
EXCEPTION
  WHEN OTHERS THEN
    IF SQLCODE != -2289 THEN
      RAISE;
    END IF;
END;

দৃশ্য

BEGIN
  EXECUTE IMMEDIATE 'DROP VIEW ' || view_name;
EXCEPTION
  WHEN OTHERS THEN
    IF SQLCODE != -942 THEN
      RAISE;
    END IF;
END;

ট্রিগার

BEGIN
  EXECUTE IMMEDIATE 'DROP TRIGGER ' || trigger_name;
EXCEPTION
  WHEN OTHERS THEN
    IF SQLCODE != -4080 THEN
      RAISE;
    END IF;
END;

সূচক

BEGIN
  EXECUTE IMMEDIATE 'DROP INDEX ' || index_name;
EXCEPTION
  WHEN OTHERS THEN
    IF SQLCODE != -1418 THEN
      RAISE;
    END IF;
END;

স্তম্ভ

BEGIN
  EXECUTE IMMEDIATE 'ALTER TABLE ' || table_name
                || ' DROP COLUMN ' || column_name;
EXCEPTION
  WHEN OTHERS THEN
    IF SQLCODE != -904 AND SQLCODE != -942 THEN
      RAISE;
    END IF;
END;

ডাটাবেস লিঙ্ক

BEGIN
  EXECUTE IMMEDIATE 'DROP DATABASE LINK ' || dblink_name;
EXCEPTION
  WHEN OTHERS THEN
    IF SQLCODE != -2024 THEN
      RAISE;
    END IF;
END;

উপাদানযুক্ত দেখুন

BEGIN
  EXECUTE IMMEDIATE 'DROP MATERIALIZED VIEW ' || mview_name;
EXCEPTION
  WHEN OTHERS THEN
    IF SQLCODE != -12003 THEN
      RAISE;
    END IF;
END;

আদর্শ

BEGIN
  EXECUTE IMMEDIATE 'DROP TYPE ' || type_name;
EXCEPTION
  WHEN OTHERS THEN
    IF SQLCODE != -4043 THEN
      RAISE;
    END IF;
END;

বাধ্যতা

BEGIN
  EXECUTE IMMEDIATE 'ALTER TABLE ' || table_name
            || ' DROP CONSTRAINT ' || constraint_name;
EXCEPTION
  WHEN OTHERS THEN
    IF SQLCODE != -2443 AND SQLCODE != -942 THEN
      RAISE;
    END IF;
END;

সময়সূচী কাজ

BEGIN
  DBMS_SCHEDULER.drop_job(job_name);
EXCEPTION
  WHEN OTHERS THEN
    IF SQLCODE != -27475 THEN
      RAISE;
    END IF;
END;

ব্যবহারকারী / স্কিমা

BEGIN
  EXECUTE IMMEDIATE 'DROP USER ' || user_name;
  /* you may or may not want to add CASCADE */
EXCEPTION
  WHEN OTHERS THEN
    IF SQLCODE != -1918 THEN
      RAISE;
    END IF;
END;

প্যাকেজ

BEGIN
  EXECUTE IMMEDIATE 'DROP PACKAGE ' || package_name;
EXCEPTION
  WHEN OTHERS THEN
    IF SQLCODE != -4043 THEN
      RAISE;
    END IF;
END;

কার্যপ্রণালী

BEGIN
  EXECUTE IMMEDIATE 'DROP PROCEDURE ' || procedure_name;
EXCEPTION
  WHEN OTHERS THEN
    IF SQLCODE != -4043 THEN
      RAISE;
    END IF;
END;

ক্রিয়া

BEGIN
  EXECUTE IMMEDIATE 'DROP FUNCTION ' || function_name;
EXCEPTION
  WHEN OTHERS THEN
    IF SQLCODE != -4043 THEN
      RAISE;
    END IF;
END;

tablespace- র

BEGIN
  EXECUTE IMMEDIATE 'DROP TABLESPACE' || tablespace_name;
EXCEPTION
  WHEN OTHERS THEN
    IF SQLCODE != -959 THEN
      RAISE;
    END IF;
END;

সমার্থক

BEGIN
  EXECUTE IMMEDIATE 'DROP SYNONYM ' || synonym_name;
EXCEPTION
  WHEN OTHERS THEN
    IF SQLCODE != -1434 THEN
      RAISE;
    END IF;
END;

13
এবং কোনও ব্যবহারকারীকে ফেলে দেওয়ার জন্য, এসকিউএলকিউডি উপেক্ষা করার জন্য -1918।
অ্যান্ড্রু সোয়ান

14
একটি পদ্ধতি লিখতে হবে তা কি করে? এটি করার আরও ভাল উপায় নেই?
উইলসন ফ্রেইটাস

8
যদি আমি অনেক EXECUTE IMMEDIATE 'DROP TABLE mytable';বাক্য যুক্ত করি (স্ক্রিপ্টের প্রতিটি টেবিলের জন্য একটি), আমি কি প্রত্যেকটির জন্য একটি ব্যতিক্রম হ্যান্ডলার লাগাতে পারি, বা সমস্ত ব্লকগুলিতে সমস্ত বার্তা মোড়ানো যথেষ্ট BEGIN ... EXCEPTION ... END;?
22-22 এ Throoze

8
@ jpmc26: এমএস এসকিউএল এর সমতুল্য IF OBJECT_ID('TblName') IS NOT NULL DROP TABLE TblName। দেখে মনে হচ্ছে একটি এসকিউএল ভাষার ক্রিয়াপদটি দামের সাথে আনুপাতিক।

6
@ জেফ্রেইম্প আপনি এমনটি ভাবেন নি তবে আমি আবার সময় এবং সময় পেয়েছি যে ওরাকল সব কিছু শক্ত করে তোলে। যখন আপনি প্রতি অস্পষ্ট সিনট্যাক্স ত্রুটি প্রতি এক ঘন্টা গড়ে ব্যয় করেন বা অন্য ডেটাবেজে (যেমন শর্তাধীন কোনও উপাদান ড্রপ করা হয়) তেমন স্পষ্ট এবং সহজ কিছু কীভাবে করবেন তা বোঝার চেষ্টা করছেন এবং এই ধরণের সমস্যাগুলি প্রতিদিন পপ আপ হয়, তখন এটি যুক্ত হয়। ফাস্ট।
jpmc26

135
declare
   c int;
begin
   select count(*) into c from user_tables where table_name = upper('table_name');
   if c = 1 then
      execute immediate 'drop table table_name';
   end if;
end;

এটি বর্তমান স্কিমে কোনও সারণী বিদ্যমান কিনা তা যাচাই করার জন্য। প্রদত্ত টেবিলটি ইতিমধ্যে ভিন্ন স্কিমায় বিদ্যমান কিনা তা পরীক্ষা করার জন্য আপনাকে এর all_tablesপরিবর্তে ব্যবহার করতে হবেuser_tables শর্তটিall_tables.owner = upper('schema_name')


34
+1 এটি ভাল কারণ কী করবেন তা বোঝার জন্য ব্যতিক্রম ডিকোডিংয়ের উপর রিলে যাবেন না। কোডটি ম্যানটেন করা এবং বোঝা সহজ হবে
দাইতাঙ্গিও

4
@ ডাইটাঙ্গিওর সাথে সম্মত হন - পারফরম্যান্স সাধারণত রান-একবার ডিপ্লোয়মেন্ট স্ক্রিপ্টগুলির সাহায্যে ট্রাম্প রক্ষণাবেক্ষণযোগ্যতা দেয় না।
পেটিস

1
এখানে অন্তর্নিহিত-প্রতিশ্রুতিবদ্ধ কোনও ভূমিকা পালন করে কিনা তা আমি আগ্রহী। আপনি নির্বাচন এবং ড্রপ একই লেনদেনের মধ্যে থাকতে চান। [কার্যকরভাবে কার্যকর করা হতে পারে যে কোনও পরবর্তী ডিডিএল উপেক্ষা করে ignoring ]
ম্যাথিউ

2
@ ম্যাথহে, ডিআরওপি হ'ল একটি ডিডিএল কমান্ড, সুতরাং এটি প্রথমে একটি কমিট জারি করবে, টেবিলটি ফেলে দেবে এবং তারপরে একটি দ্বিতীয় কমিট জারি করবে। অবশ্যই, এই উদাহরণে কোনও লেনদেন নেই (যেহেতু এটি কেবল একটি কোয়েরি জারি করেছে) সুতরাং এটি কোনও পার্থক্য রাখে না; তবে ব্যবহারকারী যদি এর আগে কিছু ডিএমএল জারি করে থাকে তবে কোনও ডিডিএল কার্যকর হওয়ার আগে তা স্পষ্টভাবে প্রতিশ্রুতিবদ্ধ হবে।
জেফ্রি কেম্প

28

আমি একই সন্ধান করছি কিন্তু আমার সাহায্যের জন্য একটি পদ্ধতি লিখে শেষ করেছি:

CREATE OR REPLACE PROCEDURE DelObject(ObjName varchar2,ObjType varchar2)
IS
 v_counter number := 0;   
begin    
  if ObjType = 'TABLE' then
    select count(*) into v_counter from user_tables where table_name = upper(ObjName);
    if v_counter > 0 then          
      execute immediate 'drop table ' || ObjName || ' cascade constraints';        
    end if;   
  end if;
  if ObjType = 'PROCEDURE' then
    select count(*) into v_counter from User_Objects where object_type = 'PROCEDURE' and OBJECT_NAME = upper(ObjName);
      if v_counter > 0 then          
        execute immediate 'DROP PROCEDURE ' || ObjName;        
      end if; 
  end if;
  if ObjType = 'FUNCTION' then
    select count(*) into v_counter from User_Objects where object_type = 'FUNCTION' and OBJECT_NAME = upper(ObjName);
      if v_counter > 0 then          
        execute immediate 'DROP FUNCTION ' || ObjName;        
      end if; 
  end if;
  if ObjType = 'TRIGGER' then
    select count(*) into v_counter from User_Triggers where TRIGGER_NAME = upper(ObjName);
      if v_counter > 0 then          
        execute immediate 'DROP TRIGGER ' || ObjName;
      end if; 
  end if;
  if ObjType = 'VIEW' then
    select count(*) into v_counter from User_Views where VIEW_NAME = upper(ObjName);
      if v_counter > 0 then          
        execute immediate 'DROP VIEW ' || ObjName;        
      end if; 
  end if;
  if ObjType = 'SEQUENCE' then
    select count(*) into v_counter from user_sequences where sequence_name = upper(ObjName);
      if v_counter > 0 then          
        execute immediate 'DROP SEQUENCE ' || ObjName;        
      end if; 
  end if;
end;

আশাকরি এটা সাহায্য করবে


আমি প্রোক উপরে তৈরি করার পরে। delobject, আমি এটি নিম্নলিখিত এসকিউএল জারি কল করার চেষ্টা করেছি। তবে এটি কার্যকর হয়নি। ডেলোবজেক্ট ('মাই টেবিল', 'টেবিল'); আমি নিম্নলিখিত ত্রুটিটি পাচ্ছি -------------------------------- কমান্ডের 1 লাইন থেকে ত্রুটি শুরু হয়েছে: ডেলোবজেক্ট ('মাই টেবিল) ',' সারণী ') ত্রুটি প্রতিবেদন: অজানা আদেশ
শায়ে

1
এক্সেকিউট কমান্ড - এক্সিকিউট ডেলোবজেক্ট ('মাই টেবিল', 'টেবিল') ব্যবহার করুন;
ইদানুদা

13

কেবলমাত্র একটি পূর্ণ কোড পোস্ট করতে চেয়েছিলেন যা একটি টেবিল তৈরি করবে এবং যদি জেফ্রির কোড ব্যবহার করে ইতিমধ্যে এটি উপস্থিত থাকে তবে তা ফেলে দেবে (আমার কাছে নয়, তাকে!)!

BEGIN
    BEGIN
         EXECUTE IMMEDIATE 'DROP TABLE tablename';
    EXCEPTION
         WHEN OTHERS THEN
                IF SQLCODE != -942 THEN
                     RAISE;
                END IF;
    END;

    EXECUTE IMMEDIATE 'CREATE TABLE tablename AS SELECT * FROM sourcetable WHERE 1=0';

END;

2
ব্যক্তিগতভাবে, আমি ক্রেটিট টেবিলটি একটি পৃথক পদক্ষেপে রেখে দেব, কারণ এটি গতিশীলভাবে করার দরকার নেই এবং এটির ব্যতিক্রম হ্যান্ডলারটির প্রয়োজন নেই।
জেফ্রি কেম্প

11

এসকিউএল * প্লাসের সাহায্যে আপনি WHENEVER SQLERROR কমান্ডটি ব্যবহার করতে পারেন:

WHENEVER SQLERROR CONTINUE NONE
DROP TABLE TABLE_NAME;

WHENEVER SQLERROR EXIT SQL.SQLCODE
DROP TABLE TABLE_NAME;

CONTINUE NONEএকটি ত্রুটি সহ রিপোর্ট করা হয়েছে, তবে স্ক্রিপ্টটি চলতে থাকবে। EXIT SQL.SQLCODEস্ক্রিপ্ট সহ একটি ত্রুটির ক্ষেত্রে সমাপ্ত হবে।

এছাড়াও দেখুন: যখনই এসকিউএলআরআর ডক্স


3

ওরাকলটিতে 'ড্রপ টেবিলে উপস্থিত থাকলে' নেই, আপনাকে বাছাই বিবৃতিটি করতে হবে।

এটি ব্যবহার করে দেখুন (আমি ওরাকল সিনট্যাক্সে নেই, সুতরাং যদি আমার ভেরিয়েবলগুলি আইফি হয় তবে দয়া করে আমাকে ক্ষমা করুন):

declare @count int
select @count=count(*) from all_tables where table_name='Table_name';
if @count>0
BEGIN
    DROP TABLE tableName;
END

আমি স্ক্রিপ্টটি ওরাকল সিনট্যাক্সে অনুবাদ করার চেষ্টা করেছি।
টম

3
গণনা সংখ্যা ঘোষণা; সমস্ত_ টেবিল থেকে গণনাতে (*) নির্বাচন করতে শুরু করুন যেখানে টেবিলের নাম = 'x'; যদি গণনা> 0 হয় তবে তাত্ক্ষণিক 'ড্রপ টেবিল এক্স' চালিত করুন; শেষ যদি; শেষ; আপনি কোনও লেনদেন ব্লক থেকে সরাসরি ডিডিএল চালাতে পারবেন না, আপনার এক্সিকিউট ব্যবহার করা দরকার।
Khb

অনেক ধন্যবাদ! আমি বুঝতে পারিনি যে বাক্য গঠনটি ভিন্ন ছিল। আমি জানি আপনি পুরো জিনিসটি শুরু / শেষের মধ্যে মুড়ে ফেলতে হবে তবে আমি বুঝতে পেরেছিলাম এটি অন্য স্ক্রিপ্টের মাঝখানে চালানো হচ্ছে was টম: আমি আমার সংস্করণটি ছেড়ে যাওয়ার সিদ্ধান্ত নিয়েছি এবং আপনার অনুলিপি করব না, সুতরাং আপনার কাছ থেকে আমি কোনও ভোট নেব না, যার স্পষ্টতই সঠিক এনসার্ভার রয়েছে।
এরিচ

আমি মনে করি না এটি সংকলন করবে। এখানে স্কিমা মালিককে অন্তর্ভুক্ত করাও গুরুত্বপূর্ণ হতে পারে বা আপনি কোনও টেবিলের জন্য 'সত্য' পেতে পারেন যা আপনি একই নামটি পেতে চাননি।
অ্যালেন

আপনার উত্তরটি পোস্ট হওয়ার 10 মিনিটের পরে সঠিক ওরাকল সিনট্যাক্স দ্বারা বাতিল করা হয়েছিল।
jpmc26

3

আমি অর্থনৈতিক সমাধান অনুসরণ পছন্দ

BEGIN
    FOR i IN (SELECT NULL FROM USER_OBJECTS WHERE OBJECT_TYPE = 'TABLE' AND OBJECT_NAME = 'TABLE_NAME') LOOP
            EXECUTE IMMEDIATE 'DROP TABLE TABLE_NAME';
    END LOOP;
END;

2

অন্য পদ্ধতিটি হ'ল ব্যতিক্রম সংজ্ঞায়িত করা এবং তারপরে কেবল সেই ব্যতিক্রমটি ধরা যাক অন্য সকলকে প্রচার করতে দেওয়া।

Declare
   eTableDoesNotExist Exception;
   PRAGMA EXCEPTION_INIT(eTableDoesNotExist, -942);
Begin
   EXECUTE IMMEDIATE ('DROP TABLE myschema.mytable');
Exception
   When eTableDoesNotExist Then
      DBMS_Output.Put_Line('Table already does not exist.');
End;

@ Sk8erPeter "ইতিমধ্যে" বনাম "এর উপস্থিতি নেই, তবে আর নেই" :)
জেফ্রি কেম্প

2

একটি উপায় হ'ল DBMS_ASSERT.SQL_OBJECT_NAME ব্যবহার করুন :

এই ফাংশনটি যাচাই করে যে ইনপুট প্যারামিটার স্ট্রিংটি বিদ্যমান এসকিউএল অবজেক্টের একটি যোগ্য এসকিউএল সনাক্তকারী।

DECLARE
    V_OBJECT_NAME VARCHAR2(30);
BEGIN
   BEGIN
        V_OBJECT_NAME  := DBMS_ASSERT.SQL_OBJECT_NAME('tab1');
        EXECUTE IMMEDIATE 'DROP TABLE tab1';

        EXCEPTION WHEN OTHERS THEN NULL;
   END;
END;
/

ডিবিফিডাল ডেমো


2
তবে এটি কোনও টেবিলের নাম নাও হতে পারে।
জেফ্রি কেম্প

বিভিন্ন স্কিমায় সেই নামটি ব্যবহার করে বিভিন্ন টেবিলও থাকতে পারে।
Hybris95

0

দুঃখের বিষয় না, ড্রপ বলে কোনও জিনিস নেই যদি উপস্থিত থাকে, বা উপস্থিত না থাকলে তৈরি করুন

আপনি সেখানে যুক্তি অন্তর্ভুক্ত করতে একটি plsql স্ক্রিপ্ট লিখতে পারে।

http://download.oracle.com/docs/cd/B12037_01/server.101/b10759/statements_9003.htm

আমি ওরাকল সিনট্যাক্সে খুব বেশি নই, তবে আমি মনে করি @ এরিকের স্ক্রিপ্টটি এরকম কিছু হবে।

declare 
cant integer
begin
select into cant count(*) from dba_tables where table_name='Table_name';
if count>0 then
BEGIN
    DROP TABLE tableName;
END IF;
END;

8
এটি কি সংকলন করে?
কুইলব্রেকার

0

আপনি সর্বদা ত্রুটিটি নিজেই ধরতে পারেন।

begin
execute immediate 'drop table mytable';
exception when others then null;
end;

এটিকে অতিরিক্ত ব্যবহার করা খারাপ অভ্যাস হিসাবে বিবেচিত হয়, অন্য ভাষায় খালি ধরা () 'র অনুরূপ।

শ্রদ্ধা
কে


1
না, কখনই "ব্যতিক্রম যখন অন্যরা শূন্য হয় না"
অলৌকিক 173

0

আমি টেবিল এবং স্কিমা মালিক নির্দিষ্ট করতে পছন্দ করি।

কেস সংবেদনশীলতার জন্যও নজর রাখুন। (নীচে "উপরের" ধারাটি দেখুন)।

টেবিলগুলি ছাড়াও বিভিন্ন জায়গায় ব্যবহার করা যেতে পারে তা দেখানোর জন্য আমি কয়েকটি ভিন্ন ভিন্ন বস্তু ফেলেছি।

.............

declare
   v_counter int;
begin
 select count(*) into v_counter from dba_users where upper(username)=upper('UserSchema01');
   if v_counter > 0 then
      execute immediate 'DROP USER UserSchema01 CASCADE';
   end if; 
end;
/



CREATE USER UserSchema01 IDENTIFIED BY pa$$word
  DEFAULT TABLESPACE users
  TEMPORARY TABLESPACE temp
  QUOTA UNLIMITED ON users;

grant create session to UserSchema01;  

এবং একটি টেবিল উদাহরণ:

declare
   v_counter int;
begin
 select count(*) into v_counter from all_tables where upper(TABLE_NAME)=upper('ORDERS') and upper(OWNER)=upper('UserSchema01');
   if v_counter > 0 then
      execute immediate 'DROP TABLE UserSchema01.ORDERS';
   end if; 
end;
/   

0
BEGIN
   EXECUTE IMMEDIATE 'DROP TABLE "IMS"."MAX" ';
EXCEPTION
   WHEN OTHERS THEN
      IF SQLCODE != -942 THEN
         RAISE;
          END IF;
         EXECUTE IMMEDIATE ' 
  CREATE TABLE "IMS"."MAX" 
   (    "ID" NUMBER NOT NULL ENABLE, 
    "NAME" VARCHAR2(20 BYTE), 
     CONSTRAINT "MAX_PK" PRIMARY KEY ("ID")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "SYSAUX"  ENABLE
   ) SEGMENT CREATION IMMEDIATE 
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "SYSAUX"  ';


END;

// এই কোডটি করা, টেবিলটি বিদ্যমান রয়েছে কিনা তা পরীক্ষা করে এবং পরে এটি সারণী সর্বাধিক তৈরি করে। এটি কেবল একক সংকলনে কাজ করে


2
আমি বিশ্বাস করি ত্রুটি নিক্ষেপ করা হলে এটি কেবল সারণী তৈরি করে।
ফিশ বিস্কুট

0

এবং আপনি যদি এটিকে পুনরায় প্রসারণযোগ্য এবং ড্রপ / মিনিট কমানোর চক্র তৈরি করতে চান, আপনি dbms_metadata.get_ddl ব্যবহার করে ডিডিএল ক্যাশে করতে পারেন এবং এই জাতীয় কোনও নির্মাণ ব্যবহার করে পুনরায় তৈরি করতে পারেন: declare v_ddl varchar2(4000); begin select dbms_metadata.get_ddl('TABLE','DEPT','SCOTT') into v_ddl from dual; [COMPARE CACHED DDL AND EXECUTE IF NO MATCH] exception when others then if sqlcode = -31603 then [GET AND EXECUTE CACHED DDL] else raise; end if; end; এটি কেবলমাত্র একটি নমুনা, ভিতরে একটি লুপ থাকা উচিত ডিডিএল প্রকার, নাম এবং মালিক ভেরিয়েবল।


0

এর মতো একটি ব্লক আপনার পক্ষে কার্যকর হতে পারে।

DECLARE
    table_exist INT;

BEGIN
    SELECT Count(*)
    INTO   table_exist
    FROM   dba_tables
    WHERE  owner = 'SCHEMA_NAME' 
    AND table_name = 'EMPLOYEE_TABLE';

    IF table_exist = 1 THEN
      EXECUTE IMMEDIATE 'drop table EMPLOYEE_TABLE';
    END IF;
END;  
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.