ওরাকল এসকিউএল-তে আমাকে কখন একটি সেমিকোলন বনাম স্ল্যাশ ব্যবহার করতে হবে?


179

আমাদের এসকিউএল স্ক্রিপ্টগুলি কীভাবে আমাদের লিখতে হবে তা নিয়ে আমরা এই সপ্তাহে আমার সংস্থায় কিছুটা বিতর্ক করছি।

পটভূমি: আমাদের ডাটাবেসটি ওরাকল 10 জি (শীঘ্রই 11 এ আপগ্রেড করা হবে)। আমাদের ডিবিএ টিম এসকিউএলপ্লাস ব্যবহার করে আমাদের স্ক্রিপ্টগুলিকে উত্পাদনে মোতায়েন করতে।

এখন, আমরা সম্প্রতি একটি মোতায়েন করেছি যা ব্যর্থ হয়েছে কারণ এটি একটি সেমিকোলন এবং একটি ফরোয়ার্ড স্ল্যাশ ( /) উভয়ই ব্যবহার করেছিল । সেমিকোলন প্রতিটি বিবৃতি শেষে এবং স্ল্যাশ বিবৃতি মধ্যে ছিল।

alter table foo.bar drop constraint bar1;
/
alter table foo.can drop constraint can1;
/

স্ক্রিপ্টে পরে কিছু ট্রিগার যুক্ত করা হয়েছিল, কিছু ভিউ তৈরির পাশাপাশি কিছু সঞ্চিত পদ্ধতিও রয়েছে। উভয় ত্রুটি সৃষ্টি করার কারণে প্রতিটি বিবৃতি চালিত হওয়ার কারণ ;এবং কারণ উভয়ই ছিল /(বিশেষত সন্নিবেশগুলিতে, যা অনন্য হওয়া প্রয়োজন)।

এসকিউএল বিকাশকারীতে এটি ঘটে না, টোডে এটি ঘটে না। যদি আপনি নির্দিষ্ট আদেশগুলি চালনা /করেন তবে সেগুলি এগুলি ছাড়া কাজ করবে না ।

পিএল / এসকিউএল-তে আপনার যদি একটি সাবপ্রগ্রাম (ডিকলার, শুরু, শেষ) থাকে সেমিকোলনটি সাবপ্রগ্রামের অংশ হিসাবে বিবেচিত হবে, সুতরাং আপনাকে স্ল্যাশ ব্যবহার করতে হবে।

সুতরাং আমার প্রশ্নটি হ'ল: যদি আপনার ডাটাবেসটি ওরাকল হয় তবে আপনার এসকিউএল স্ক্রিপ্টটি লেখার উপযুক্ত উপায় কী? যেহেতু আপনি জানেন যে আপনার ডিবি ওরাকল তা আপনার সর্বদা ব্যবহার করা উচিত /?


1
যদি কেউ এসকিউএল ডেভেলপারের সাথে একটি ডাটাবেস রফতানি করে তবে সেখানে "টার্মিনেটর" নামে একটি চেকবাক্স রয়েছে যা নির্বাচিত হলে প্রতিটি বিবৃতি শেষ করতে সেমিকোলন ব্যবহার করে। এই বিকল্পটি ডিফল্টরূপে নির্বাচিত হয়। সেমিকোলনগুলি অপসারণ এবং সদৃশ বিবৃতি কার্যকরকরণ এড়াতে আন-সিলেক্ট করুন
Ruslans Uralovs

7
কেবল অর্থহীনভাবে এই পুরাতন থ্রেডটিকে মৃত্যুর দিকে ঠেলে দেওয়ার জন্য, আমি উল্লেখ করব যে এসকিউএল ভাষার কোনও সেমিকোলন নেই। এটি কেবল এসকিউএল * প্লাসের ডিফল্ট টার্মিনেটর চরিত্র (আপনি যদি চান তবে সেট sqlterminatorকরতে !পারেন) এবং এই কনভেনশনটি অন্যান্য সরঞ্জাম অনুসরণ করে followed পিএল / এসকিউএল ভাষা অবশ্য একটি বাধ্যতামূলক বাক্য গঠন উপাদান হিসাবে সেমিকোলন ব্যবহার করে।
উইলিয়াম রবার্টসন

উত্তর:


31

এটি পছন্দের বিষয়, তবে আমি স্ক্রিপ্টগুলি দেখতে পছন্দ করি যা ধারাবাহিকভাবে স্ল্যাশ ব্যবহার করে - এইভাবে কাজের সমস্ত "ইউনিট" (পিএল / এসকিউএল অবজেক্ট তৈরি করা, পিএল / এসকিউএল বেনামে ব্লক চালানো, এবং একটি ডিএমএল বিবৃতি কার্যকর করা) হতে পারে চোখের সাহায্যে আরও সহজে বাছাই করা।

এছাড়াও, যদি আপনি অবশেষে স্থাপনার জন্য পিঁপড়ার মতো কিছুতে যান তবে এটি একটি সামঞ্জস্যপূর্ণ বিবৃতি ডিলিমিটারের জন্য লক্ষ্যগুলির সংজ্ঞাটি সহজ করবে।


1
এই উত্তরটি ব্যাখ্যা করে না /বা কেন ;আরও উত্তরের জন্য @a_horse_with_no_name বা @ Mr_Moneybags এর উত্তর দেখুন
কে

333

আমি জানি এটি একটি পুরানো থ্রেড, তবে আমি কেবল এতে হোঁচট খেয়েছি এবং আমার মনে হয় এটি পুরোপুরি ব্যাখ্যা করা হয়নি।

একটা অর্থ মধ্যে SQL * প্লাস একটি বিশাল পার্থক্য আছে /এবং ;কারণ তারা ভিন্নভাবে কাজ করে।

;প্রান্ত একটি SQL বক্তব্য, যেহেতু /, executes যাই হোক না কেন বর্তমান হল "বাফার"। সুতরাং আপনি যখন একটি ; এবং একটি /বিবৃতি ব্যবহার করবেন তখন আসলে দুবার কার্যকর করা হয়।

আপনি সহজেই দেখতে পাবেন যে /স্টেটমেন্ট চালানোর পরে এটি ব্যবহার করে :

SQL*Plus: Release 11.2.0.1.0 Production on Wed Apr 18 12:37:20 2012

Copyright (c) 1982, 2010, Oracle.  All rights reserved.

Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning and OLAP options

SQL> drop table foo;

Table dropped.

SQL> /
drop table foo
           *
ERROR at line 1:
ORA-00942: table or view does not exist

এই ক্ষেত্রে একটি ত্রুটি লক্ষ্য করে।


তবে ধরে নিচ্ছি এখানে এসকিউএল স্ক্রিপ্ট রয়েছে:

drop table foo;
/

এবং এটি এসকিউএল * প্লাসের মধ্যে থেকে চালিত হয় তবে এটি খুব বিভ্রান্তিকর হবে:

SQL*Plus: Release 11.2.0.1.0 Production on Wed Apr 18 12:38:05 2012

Copyright (c) 1982, 2010, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning and OLAP options

SQL> @drop

Table dropped.

drop table foo
           *
ERROR at line 1:
ORA-00942: table or view does not exist

/প্রধানত অর্ডার বিবৃতি আপনার এম্বেড আছে চালানোর জন্য প্রয়োজন বোধ করা হয় ;একটি মত CREATE PROCEDUREবিবৃতি।


2
@ মিস, আমি ওরাকলে নতুন এবং একই সমস্যায় পড়ি। এই প্রশ্নটি খুব দরকারী, তবে সমস্ত উত্তর "কেন" সর্বোত্তম উপায় "কাজ করার উপায় বা এটির কিছুটা উপায় নয় সে সম্পর্কে একটি ব্যাখ্যা দিয়েছে। সুতরাং, যদি আমি সঠিকভাবে বুঝতে পারি তবে কেবল একটি স্ক্রিপ্ট থাকার এবং এটি সমস্ত সরঞ্জামের জন্য ব্যবহারযোগ্য রাখার উপায় নেই ... বা আপনি কোনও উপায় আবিষ্কার করেন?
ceinmart

5
@ সাইনমার্ট: "সেরা উপায়" হ'ল এসকিউএল স্ক্রিপ্টগুলি সম্পাদন করার জন্য একটি (এবং শুধুমাত্র একটি) সরঞ্জাম নির্ধারণ করা - এবং সেই সরঞ্জামটি ব্যবহার করে কোনও স্ক্রিপ্টের "সঠিকতা" বৈধ করা হয়। আপনার প্রোগ্রামিং ভাষার জন্য একটি সংকলক বা আপনার রানটাইম পরিবেশের একটি নির্দিষ্ট সংস্করণ (জাভা 7
,।

1
ভাল উত্তর. এটি কি আমিই নাকি অন্য ডিবি'র তুলনায় ওরাকল বোকা এবং প্রত্নতাত্ত্বিক? আমি প্রচুর সিবাজ ব্যবহার করেছি এবং এটি আরও স্বজ্ঞাত বলে মনে হচ্ছে।
স্প্ল্যাশআউট করুন

1
@ স্প্ল্যাশআউট: আচ্ছা, আপনি যদি ডিফল্ট ডিলিমিটার ( ;) ধারণ করে এমন বিবৃতি চালাতে চান তবে আপনাকে বিকল্প ডিলিমিটার নির্দিষ্ট করার একটি উপায় খুঁজে বের করতে হবে
a_horse_with_no_name

97

আমি ;এবং এর মধ্যে আরও কিছু ব্যবহার স্পষ্ট করতে চেয়েছিলাম/

এসকিউএলপিএলএস এ:

  1. ; এর অর্থ "বর্তমান বিবৃতিটি সমাপ্ত করুন, এটি কার্যকর করুন এবং এটি এসকিউএলপিএলএস বাফারে সংরক্ষণ করুন"
  2. <newline>কোনও ডিএমএল (নির্বাচন, আপডেট, INSERT, ...) বিবৃতি বা কিছু ধরণের ডিডিএল (টেবিল এবং ভিউ তৈরি করা) বিবৃতি (যার মধ্যে নেই ;) এর পরে, এর অর্থ, বাফারে স্টেটমেন্ট সংরক্ষণ করুন তবে এটি চালান না।
  3. /বাফারে একটি বিবৃতি প্রবেশের পরে (একটি ফাঁকা দিয়ে <newline>) অর্থ " বাফারে ডিএমএল বা ডিডিএল বা পিএল / এসকিউএল চালান।
  4. RUNঅথবা Rদেন / আউটপুট বাফারে এসকিউএল এবং এটি চালানোর জন্য একটি sqlsplus কমান্ড। এটি কোনও এসকিউএল বিবৃতি বন্ধ করবে না।
  5. / কোনও ডিএমএল বা ডিডিএল বা পিএল / এসকিউএল প্রবেশের সময় "বর্তমান বিবৃতিটি সমাপ্ত করুন, এটি কার্যকর করুন এবং এটি এসকিউএলপিএলএস বাফারে সংরক্ষণ করুন"

দ্রষ্টব্য: যেহেতু ;পিএল / এসকিউএল-র জন্য একটি বিবৃতি শেষ করার জন্য ;এসকিউএলপিএলএস "বর্তমান বিবৃতিটি সমাপ্ত করে, এটি কার্যকর করুন এবং এটি এসকিউএলপিএলএস বাফারকে সংরক্ষণ করুন" অর্থ ব্যবহার করতে পারবেন না কারণ আমরা চাই যে পুরো পিএল / এসকিউএল ব্লকটি সম্পূর্ণরূপে থাকে বাফার, তারপরে এটি চালাও। পিএল / এসকিউএল ব্লকগুলি অবশ্যই এর সাথে শেষ হবে:

END;
/

22

প্রায় সমস্ত ওরাকল মোতায়েনগুলি এসকিউএল * প্লাসের মাধ্যমে করা হয় (আপনার ডিবিএ যে অদ্ভুত ছোট্ট কমান্ড লাইন সরঞ্জাম ব্যবহার করে)। এবং এসকিউএল * প্লাসে একটি লোন স্ল্যাশ এর মূল অর্থ হ'ল "আমি এসএসসিডিভেটেড লাস্ট এসকিউএল বা পিএল / এসকিউএল কমান্ডটি পুনরায় কার্যকর করব"।

দেখা

http://ss64.com/ora/syntax-sqlplus.html

থাম্বের বিধি হ'ল এমন জিনিসগুলির সাথে স্ল্যাশ ব্যবহার করা BEGIN .. ENDবা আপনি যেখানে ব্যবহার করতে পারেন CREATE OR REPLACE

সন্নিবেশকারীদের জন্য যা অনন্য ব্যবহার হতে হবে

INSERT INTO my_table ()
SELECT <values to be inserted>
FROM dual
WHERE NOT EXISTS (SELECT 
                  FROM my_table
                  WHERE <identify data that you are trying to insert>)

14

আমার বোধগম্যতা থেকে, সমস্ত এসকিউএল স্টেটমেন্টের ফরোয়ার্ড স্ল্যাশ দরকার নেই কারণ সেমিকোলনগুলির শেষে স্বয়ংক্রিয়ভাবে চলে যাবে, যার মধ্যে ডিডিএল, ডিএমএল, ডিসিএল এবং টিসিএল বিবৃতি রয়েছে।

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


1

আমি প্রতিটি স্ক্রিপ্টের শেষে একবার কেবল ফরোয়ার্ড স্ল্যাশ ব্যবহার করি, স্ক্যালপ্লাসকে জানাতে যে কোডের বেশি লাইন নেই। কোনও স্ক্রিপ্টের মাঝখানে আমি স্ল্যাশ ব্যবহার করি না।


সুতরাং আপনি কি এমন জিনিসগুলি অর্ডার করেন যা / (যেমন সাবপ্রগ্রাম এবং ট্রিগারগুলি) শেষে প্রয়োজন? আপনার যদি একাধিক ট্রিগার থাকে? আমি একটি পরীক্ষা চালিয়েছি এবং এটির প্রত্যেকটির মধ্যে একটি / না থাকলে কেবলমাত্র প্রথমটি কার্যকর করে। আমি কিছু অনুপস্থিত করছি?
amischiefr

আমি এটি এড়াতে চেষ্টা করি (সম্ভব হলে), তবে যদি আমি (ট্রিগারগুলিতে পছন্দ করতে না পারি), তবে আমি সেমিকোলন এবং স্ল্যাশগুলি ঠিক ঠিক সরকারী স্ক্রিপ্টগুলিতে ব্যবহার করি যা ওরাকলের নমুনা স্কিমাস তৈরি করে: download.oracle.com/docs /cd/B19306_01/server.102/b14198/… সন্নিবেশ সমস্যার জন্য, আমি সারণিগুলি তৈরি করে এমন ব্যক্তিদের থেকে বস্তু তৈরি করা স্ক্রিপ্টগুলি পৃথক করার চেষ্টা করি।
জোনাথন

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