আমি কীভাবে তৈরি বা প্রতিস্থাপন করব?


102

আমি কি বুঝতে পেরেছি যে ক্রিয়েট বা রিপ্লেস মূলত এর অর্থ "যদি বস্তুটি বিদ্যমান থাকে তবে এটিকে ফেলে দিন, তবে এটি অন্যভাবে তৈরি করুন?"

যদি তাই হয় তবে আমি কী ভুল করছি? এইটা কাজ করে:

CREATE TABLE foo (id NUMBER,
title VARCHAR2(4000) DEFAULT 'Default Title')

এবং এটি (ORA-00922: অনুপস্থিত বা অবৈধ বিকল্প):

CREATE OR REPLACE TABLE foo (id NUMBER,
title VARCHAR2(4000) DEFAULT 'Default Title')

আমি কি বোকা কিছু করছি? আমি এই সিনট্যাক্স সম্পর্কে খুব বেশি ডকুমেন্টেশন খুঁজে পেতে সক্ষম হবে বলে মনে হচ্ছে না।

উত্তর:


156

এটি ফাংশন, পদ্ধতি, প্যাকেজ, প্রকার, প্রতিশব্দ, ট্রিগার এবং দর্শনগুলিতে কাজ করে।

হালনাগাদ:

তৃতীয়বারের মতো পোস্টটি আপডেট করার পরে, আমি এটিকে সংশোধন করব:

এটি টেবিলগুলিতে কাজ করে না :)

এবং হ্যাঁ, এই বাক্য গঠনতে ডকুমেন্টেশন রয়েছে এবং এর জন্য কোনও REPLACEবিকল্প নেই CREATE TABLE


33

সিনট্যাক্স সম্পর্কে একটি দুর্দান্ত জিনিস হ'ল আপনি নিশ্চিত হতে পারেন যে কোনও একটি CREATE OR REPLACEআপনাকে কখনই ডেটা হারাতে দেবে না (সর্বাধিক আপনি হারাবেন কোড হ'ল, আশা করি আপনি সোর্স নিয়ন্ত্রণে কোথাও সংরক্ষণ করেছেন)।

টেবিলগুলির সমতুল্য বাক্য গঠনটি হ'ল অল্টার, যার অর্থ আপনাকে প্রয়োজনীয় পরিবর্তনগুলি স্পষ্টভাবে গণনা করতে হবে।

সম্পাদনা করুন: যাইহোক, যদি আপনাকে কোনও স্ক্রিপ্টে ড্রপ + ক্রিয়েট করার দরকার হয় এবং আপনি ত্রুটিযুক্ত "অবজেক্টের অস্তিত্ব নেই" ত্রুটিগুলির যত্ন নেন না (যখন ডিআরপি টেবিলটি খুঁজে না পায়), আপনি এটি করতে পারেন এই:

BEGIN
  EXECUTE IMMEDIATE 'DROP TABLE owner.mytable';
EXCEPTION
  WHEN OTHERS THEN
    IF sqlcode != -0942 THEN RAISE; END IF;
END;
/

24

ওরাকলে কোনও তৈরি বা প্রতিস্থাপন সারণি নেই।

তোমাকে অবশ্যই:

টেবিল ফুটা ড্রপ;
টেবিল ফু তৈরি করুন (....);

11

CREATE OR REPLACE কেবলমাত্র ফাংশন, পদ্ধতি, ধরণ, বা প্যাকেজগুলিতে ব্যবহার করা যেতে পারে - এটি টেবিলগুলিতে কাজ করবে না।


4
CREATE OR REPLACEপ্রতিশব্দ এবং ট্রিগারগুলির জন্যও কাজ করে
রিচার্ড মিচেল

4

নিম্নলিখিত স্ক্রিপ্টটি ওরাকলটিতে কৌশলটি করা উচিত:

BEGIN
  EXECUTE IMMEDIATE 'drop TABLE tablename';
EXCEPTION
  WHEN OTHERS THEN
    IF sqlcode != -0942 THEN RAISE; 
    END IF;
END;


3

এক্সপশন ব্যবহার না করেই ওরাকল ডাটাবেসের জন্য একটি ব্যবহারযোগ্য পদ্ধতি (পরিস্থিতিতে আপনি ব্যবহারকারী_সারণাগুলি dba_tables সহ প্রতিস্থাপন করতে হবে এবং / অথবা কোয়েরিতে টেবিলস্পেসকে সীমাবদ্ধ করতে হবে):

create or replace procedure NG_DROP_TABLE(tableName varchar2)
is
   c int;
begin
   select count(*) into c from user_tables where table_name = upper(tableName);
   if c = 1 then
      execute immediate 'drop table '||tableName;
   end if;
end;

3
-- To Create or Replace a Table we must first silently Drop a Table that may not exist
DECLARE
  table_not_exist EXCEPTION;
  PRAGMA EXCEPTION_INIT (table_not_exist , -00942);
BEGIN
   EXECUTE IMMEDIATE('DROP TABLE <SCHEMA>.<TABLE NAME> CASCADE CONSTRAINTS');
   EXCEPTION WHEN table_not_exist THEN NULL;
END;
/

অন্যান্য উদাহরণগুলির তুলনায় কিছুটা বেশি কোড তবে এর উদ্দেশ্যটি আরও সামান্য পরিষ্কার
গ্রোকস্টার

1

আপনি যদি কোডটি করে থাকেন তবে প্রথমে ডাটাবেজে টেবিলের জন্য সারণী টেবিলের নাম ব্যবহার করে SEF টেবিলের নাম ব্যবহারকারীর টেবিলের নাম WHERE টেবিলের নাম = 'XYZ' ব্যবহার করুন

যদি রেকর্ড পাওয়া যায় তবে টেবিল কেটে ফেলুন অন্যথায় সারণী তৈরি করুন

তৈরি বা প্রতিস্থাপনের মতো কাজ করুন।


1

আপনি CORT (ব্যবহার করতে পারেন www.softcraftltd.co.uk/cort )। এই সরঞ্জামটি ওরাকলে টেবিলটি তৈরি বা প্রতিস্থাপনের অনুমতি দেয়। এটা দেখতে অনেকটা:

create /*# or replace */ table MyTable(
  ... -- standard table definition
);

এটি ডেটা সংরক্ষণ করে।


1

সুতরাং আমি এটি ব্যবহার করছি এবং এটি খুব ভালভাবে কাজ করেছে: - এটি উপস্থিত থাকলে ড্রপের মতো আরও কাজ করে তবে কাজটি হয়ে যায়

DECLARE
       VE_TABLENOTEXISTS EXCEPTION;
PRAGMA EXCEPTION_INIT(VE_TABLENOTEXISTS, -942);


    PROCEDURE DROPTABLE(PIS_TABLENAME IN VARCHAR2) IS
              VS_DYNAMICDROPTABLESQL VARCHAR2(1024);
                    BEGIN
                       VS_DYNAMICDROPTABLESQL := 'DROP TABLE ' || PIS_TABLENAME;  
                    EXECUTE IMMEDIATE VS_DYNAMICDROPTABLESQL;

                    EXCEPTION
                        WHEN VE_TABLENOTEXISTS THEN
                             DBMS_OUTPUT.PUT_LINE(PIS_TABLENAME || ' NOT EXIST, SKIPPING....');
                        WHEN OTHERS THEN
                             DBMS_OUTPUT.PUT_LINE(SQLERRM);
                    RAISE;
                    END DROPTABLE;

    BEGIN
      DROPTABLE('YOUR_TABLE_HERE');
END DROPTABLE;
/   

আশা করি এটিও সহায়তা করে রেফারেন্স: PLS-00103 পিএল / এসকিউএল বিকাশকারী ত্রুটি


1

'সারণী তৈরি বা প্রতিস্থাপন' সম্ভব নয়। অন্যরা যেমন বলেছে, আপনি একটি প্রক্রিয়া লিখতে পারেন এবং / অথবা তত্ক্ষণাত কার্যকর (...) শুরু করতে পারেন। আমি কীভাবে টেবিলটি তৈরি করতে (পুনরায়) কোনও উত্তর দেখতে পাচ্ছি না, তাই আমি উত্তর হিসাবে একটি স্ক্রিপ্ট রেখেছি।

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

--Create the table 'A_TABLE_X', and drop the table in case it already is present
BEGIN
EXECUTE IMMEDIATE 
'
CREATE TABLE A_TABLE_X
(
COLUMN1 NUMBER(15,0),
COLUMN2  VARCHAR2(255 CHAR),
COLUMN3  VARCHAR2(255 CHAR)
)';

EXCEPTION
WHEN OTHERS THEN
  IF SQLCODE != -955 THEN -- ORA-00955: object name already used
     EXECUTE IMMEDIATE 'DROP TABLE A_TABLE_X';
  END IF;
END;

আপনার কি A_TABLE_EXAMPLE এবং A_TABLE_X এর সাথে সামঞ্জস্য থাকা দরকার?
জোনাথন লেফলার

0

আমি এই জাতীয় কিছু করব

  begin
     for i in (select table_name from user_tables where table_name = 'FOO') loop
        execute immediate 'drop table '||i.table_name;
     end loop;
  end;

  execute immediate 'CREATE TABLE FOO (id NUMBER,
                                       title VARCHAR2(4000)) ';

-4

এটি যদি এমএস এসকিউএল এর জন্য হয় .. নীচের কোডটি সারণীটি ইতিমধ্যে উপস্থিত রয়েছে বা না থাকুক না কেন সর্বদা চলবে।

if object_id('mytablename') is not null //has the table been created already in the db
Begin
     drop table mytablename
End

Create table mytablename (...

4
দুঃখিত, তবে এটি ওরাকল। :-)
জেসন বেকার

মন্তব্যটি কি "// টেবিলে ডেটা আছে" সঠিক?
জেফ্রি কেম্প

দুঃখিত কিছুটা ভাল, অবজেক্ট_আইডি টেবিলটি ডিবিতে বিদ্যমান কিনা তা পরীক্ষা করে দেখুন। এটি বলা উচিত //
ডাবলীতে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.