দ্রুত এবং ময়লা
Postgres সালে 9.4+ ব্যবহার
SELECT to_regclass('foo');
অনুসন্ধানের পথে সনাক্তকারীকে পাওয়া না গেলে NULL ফেরত দেয়।
পোস্টগ্রিসে 9.3 বা তার বেশি বয়সীদের জন্য একটি কাস্টregclass ব্যবহার করুন :
SELECT 'foo'::regclass;
এটি একটি ব্যতিক্রম উত্থাপন করে , যদি বস্তুটি খুঁজে পাওয়া যায় না!
যদি 'foo'পাওয়া যায়, তবে oidতার textপ্রতিনিধিত্ব করে ফেরত দেওয়া হয় । এটি কেবলমাত্র সারণীর নাম, বর্তমান অনুসন্ধানের পথ অনুসারে স্কিমা-যোগ্য এবং যেখানে প্রয়োজন সেখানে ডাবল-কোটেড।
যদি অবজেক্টটি না পাওয়া যায় তবে আপনি নিশ্চিত হতে পারেন যে এটি অনুসন্ধানের পথের কোথাও নেই or বা স্কিমি-যোগ্য নামের জন্য মোটেই নেই schema.foo)
যদি এটি পাওয়া যায় তবে দুটি ত্রুটি রয়েছে :
অনুসন্ধানের অন্তর্নিহিত স্কিমের অন্তর্ভুক্ত search_path যেমন, pg_catalogএবংpg_temp । তবে আপনি নিজের উদ্দেশ্যে টেম্প এবং সিস্টেম সারণীগুলি বাদ দিতে চাইতে পারেন। (?)
regclassসিস্টেম ক্যাটালগের সমস্ত অবজেক্টের জন্য কাজ করার জন্য একটি কাস্ট pg_class: সূচি, ভিউ, সিকোয়েন্স ইত্যাদি কেবল সারণী নয়। আপনি একচেটিয়াভাবে একটি নিয়মিত টেবিল খুঁজছেন বলে মনে হচ্ছে। তবে একই নামের অন্যান্য বস্তুতেও সম্ভবত আপনার সমস্যা আছে। বিবরণ:
ধীর এবং নিশ্চিত
আমরা আপনার অনুসন্ধানে ফিরে এসেছি, তবে ব্যবহার করবেন না current_setting('search_path'), যা খালি সেটিংটি দেয় returns ডেডিকেটেড সিস্টেম তথ্য ফাংশন ব্যবহার করুন current_schemas()। প্রতি ডকুমেন্টেশন:
current_schemas(boolean) name[]
অনুসন্ধানের পথে স্কিমার নামগুলি impচ্ছিকভাবে অন্তর্নিহিত স্কিমা সহ
"$user"অনুসন্ধানের পথে চূড়ান্তভাবে সমাধান করা হয়। নামের সাথে কোনও স্কিমা SESSION_USERউপস্থিত না থাকলে স্কিমাটি আরম্ভ করার জন্য ফিরে আসে না। এছাড়াও, আপনি ঠিক কী চান তার উপর নির্ভর করে, আপনি অতিরিক্তভাবে অন্তর্নিহিত স্কিমাগুলি ( pg_catalogএবং সম্ভবত pg_temp) আউটপুটও করতে পারেন - তবে আমি ধরে নিই যে আপনি হাতে থাকা মামলায় এইগুলি চান না, তাই ব্যবহার করুন:
DO
$do$
BEGIN
IF EXISTS (
SELECT -- list can be empty
FROM pg_catalog.pg_class c
JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE n.nspname = ANY(current_schemas(FALSE))
AND n.nspname NOT LIKE 'pg_%' -- exclude system schemas!
AND c.relname = 'foo'
AND c.relkind = 'r') -- you probably need this
THEN
RAISE 'This application depends on tables created by another application';
END IF;
END
$do$;
এসকিউএল ফিডল , সর্বশেষDOবিবৃতিব্যতীত সমস্ত প্রদর্শন করছে।
এসকিউএল ফিডল (জেডিবিসি) এর DOসমাপ্তি অক্ষরযুক্ত বিবৃতিতে সমস্যা রয়েছে ।