পিএল / পিজিএসকিউএল-তে '$$' ব্যবহার করা হয়


98

পিএল / পিজিএসকিউএল-তে সম্পূর্ণ নতুন হওয়া, এই ফাংশনে ডাবল ডলারের লক্ষণগুলির অর্থ কী :

CREATE OR REPLACE FUNCTION check_phone_number(text)
RETURNS boolean AS $$
BEGIN
  IF NOT $1 ~  e'^\\+\\d{3}\\ \\d{3} \\d{3} \\d{3}$' THEN
    RAISE EXCEPTION 'Wrong formated string "%". Expected format is +999 999';
  END IF;
  RETURN true; 
END;
$$ LANGUAGE plpgsql STRICT IMMUTABLE;

আমি যে অনুমান করছি, এ RETURNS boolean AS $$, $$একটি স্থানধারক।

শেষ লাইনটি একটি রহস্যের কিছুটা: $$ LANGUAGE plpgsql STRICT IMMUTABLE;

যাইহোক, শেষ লাইনটির অর্থ কী?


4
দয়া করে এ প্রশ্নের উত্তর হিসাবে এরউইনের প্রতিক্রিয়াটিকে চিহ্নিত করার বিষয়টি বিবেচনা করুন, তার বিবরণটি আসলে কী তা ব্যাখ্যা করে $$এবং আপনি এটি পড়ে কিছু নতুন শিখতে পারেন যেমন এটিও রয়েছে$foo$
csharpfolk

উত্তর:


143

ডলার চিহ্ন ব্যবহার করা হয় ডলার উদ্ধৃত এবং হয় ফাংশন সংজ্ঞা কোন উপায় নির্দিষ্ট মধ্যে । এটি এসকিউএল স্ক্রিপ্টগুলির যে কোনও জায়গাতেই একক উদ্ধৃতিগুলি প্রতিস্থাপন করতে ব্যবহার করা যেতে পারে।

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

CREATE OR REPLACE FUNCTION check_phone_number(text)
RETURNS boolean AS
'
BEGIN
  IF NOT $1 ~  e''^\\+\\d{3}\\ \\d{3} \\d{3} \\d{3}$'' THEN
    RAISE EXCEPTION ''Malformed string "%". Expected format is +999 999'';
  END IF;
  RETURN true; 
END
' LANGUAGE plpgsql STRICT IMMUTABLE;

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

CREATE OR REPLACE FUNCTION check_phone_number(text)
  RETURNS boolean  
AS
$func$
BEGIN
 ...
END
$func$  LANGUAGE plpgsql STRICT IMMUTABLE;

বিশদ:

আপনার দ্বিতীয় প্রশ্ন হিসাবে: আপনার উদাহরণের শেষ লাইনটি বোঝার জন্য
সবচেয়ে দুর্দান্ত ম্যানুয়ালটিCREATE FUNCTION পড়ুন ।


4
আপনি সূক্ষ্ম ম্যানুয়াল বলার কথা , আরটিএম এর ঠিক এটির সঠিক রিং নেই :)
মিউ খুব ছোট

@ মাইস্টোশোর্ট: আমার খারাপ, থিমটিতে পরিবর্তনের চেষ্টা করার ফলে সামঞ্জস্যতা ভেঙে গেছে বলে মনে হচ্ছে। আপনি আরটিএমইএম কীভাবে পছন্দ করেন? :)
এরউইন ব্র্যান্ডস্টেটার

4
আমি এটি চিৎকার করার চেষ্টা করেছি এবং এটি একরকম ছিল না। যদিও, কিছু পরিস্থিতি রয়েছে যেখানে ভদ্রতা গণনা করা হয়।
মিউ খুব ছোট

@ ইরুইন ব্র্যান্ডসটেটার ঠিক আছে, তবে কী $body$? থেকে CREATE OR REPLACE FUNCTION update_ts() RETURNS TRIGGER AS $BODY$ BEGIN NEW.updated_at = NOW(); RETURN NEW; END; $BODY$ LANGUAGE plpgsql- আমি bodyকোথাও সংজ্ঞায়িত দেখতে পাচ্ছি না । এখানে কী চলছে তা আমার আসলেই কোনও ধারণা নেই
Growler

4
@ গ্রলার: $body$আমি যেমন ব্যাখ্যা করেছি ঠিক তেমনই "ডলার-কোটিং"। আরও বিশদ: স্ট্যাকওভারফ্লো.com
এরউইন ব্র্যান্ডস্টেটার

21

$$ হল এমন একটি সীমানা যা ফাংশন সংজ্ঞাটি শুরু হয় এবং শেষ হয় তা বোঝাতে আপনি ব্যবহার করেন। নিম্নোক্ত বিবেচনা কর,

CREATE TABLE <name> <definition goes here> <options go here, eg: WITH OIDS>

ক্রিয়া ফাংশন সিনট্যাক্সটি অনুরূপ, তবে আপনি আপনার ফাংশনে (বিশেষত বিবৃতি শেষে; চরিত্রের) সমস্ত ধরণের এসকিউএল ব্যবহার করতে যাচ্ছেন, আপনি যদি তা ছাড়েন না তবে পার্সারটি ট্রিপ করতে পারে। সুতরাং আপনার বক্তব্যটি এই হিসাবে পড়া উচিত:

CREATE OR REPLACE FUNCTION check_phone_number(text)
RETURNS boolean AS <code delimited by $$> LANGUAGE plpgsql STRICT IMMUTABLE;

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

প্রকৃতপক্ষে আপনি যদি ম্যানুয়ালটিতে "৪.১.২.২. ডলার-কোটেড স্ট্রিং কনস্ট্যান্টস" এর নীচে দেখেন, আপনি দেখতে পাবেন যে আপনি ডলারের চিহ্নের মধ্যে অক্ষরও ব্যবহার করতে পারেন এবং এটি সমস্তই একটি ডিলিমিটার হিসাবে গণনা করবে।

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