এটি প্রত্যাশিত, দলিলযুক্ত আচরণ।
টম লেন এখানে এটি ব্যাখ্যা।
ম্যানুয়ালটিতে এখানে নথিবদ্ধ:
ডেটা-পরিবর্তন বিবৃতি মধ্যে WITH
ঠিক একবার মৃত্যুদন্ড কার্যকর করা হয়, এবং
সবসময় সমাপ্তির কিনা স্বাধীনভাবে প্রাথমিক ক্যোয়ারী তাদের আউটপুট সমস্ত (বা প্রকৃতপক্ষে থাকে) পড়া হয়। লক্ষ্য করুন এই জন্য নিয়ম থেকে ভিন্ন যে SELECT
মধ্যে WITH
: যেমন পূর্বের বিভাগে বিবৃত, একটি কার্যকর SELECT
শুধুমাত্র যতটা প্রাথমিক ক্যোয়ারী তার আউটপুট দাবী বাহিত হয় ।
বোল্ড জোর আমার। "ডাটা-পরিবর্তন" হয় INSERT
, UPDATE
এবং DELETE
প্রশ্নের। (বিরোধী হিসাবে SELECT
।) ম্যানুয়ালটি আরও একবার:
আপনি (ডেটা-পরিবর্তন বিবৃতি ব্যবহার করতে পারেন INSERT
, UPDATE
অথবা DELETE
) এ WITH
।
সঠিক ফাংশন
CREATE OR REPLACE FUNCTION public.__post_users_id_coin (_coins integer, _userid integer)
RETURNS TABLE (id integer) AS
$func$
UPDATE users u
SET coin = u.coin + _coins -- see below
WHERE u.id = _userid
RETURNING u.id
$func$ LANGUAGE sql COST 100 ROWS 1000 STRICT;
আমি ডিফল্ট (শব্দ) ধারাগুলি বাদ দিয়েছি এবং
STRICT
এর সংক্ষিপ্ত প্রতিশব্দRETURNS NULL ON NULL INPUT
।
নিশ্চিত করুন যে কোনওভাবে প্যারামিটারের নামগুলি কলামের নামের সাথে বিরোধ নয় conflict আমি এটিকে চাপ দিয়েছি _
, তবে এটি কেবল আমার ব্যক্তিগত পছন্দ।
যদি coin
হতে পারে তবে NULL
আমার পরামর্শ:
SET coin = CASE WHEN coin IS NULL THEN _coins ELSE coin + _coins END
তাহলে users.id
, প্রাথমিক চাবিকাঠি তারপর তন্ন তন্ন RETURNS TABLE
না ROWs 1000
কোনো অর্থে দেখা যায়। কেবলমাত্র একটি একক সারি আপডেট / ফেরত যেতে পারে। তবে এগুলিই মূল পয়েন্টের পাশে।
যথাযথ কল
RETURNING
আপনি যদি যেভাবেই কলটিতে ফিরে আসা মানগুলিকে উপেক্ষা করতে চলেছেন তবে আপনার ফাংশনটি থেকে ক্লজটি এবং রিটার্ন মানগুলি ব্যবহার করার কোনও অর্থ নেই । SELECT * FROM ...
যদি আপনি যাইহোক এড়াতে পারেন তবে ফিরে আসা সারিগুলি পচিয়ে ফেলার কোনও অর্থ নেই ।
কেবল একটি স্কেলার ধ্রুবক ( RETURNING 1
) ফিরিয়ে দিন , ফাংশনটি RETURNS int
(বা RETURNING
পুরোপুরি ড্রপ করে এটি তৈরি করুন RETURNS void
) হিসাবে সংজ্ঞায়িত করুন এবং এর সাথে কল করুনSELECT my_function(...)
সমাধান
আপনি থেকে ...
ফলাফল সম্পর্কে সত্যিই চিন্তা করবেন না
.. কেবল SELECT
একটি ধ্রুবক ফর্ম সিটিই। এটি যতক্ষণ না বাইরের SELECT
(প্রত্যক্ষ বা পরোক্ষভাবে) রেফারেন্স করা হয় ততক্ষণ তা কার্যকর করার গ্যারান্টিযুক্ত ।
WITH test AS (SELECT __post_users_id_coin(10, 1))
SELECT 1 FROM test;
যদি আপনার কাছে আসলে একটি সেট-রিটার্নিং ফাংশন থাকে এবং এখনও আউটপুটটি যত্ন করে না:
WITH test AS (SELECT * FROM __post_users_id_coin(10, 1))
SELECT 1 FROM test LIMIT 1;
1 সারির বেশি আর ফিরে আসার দরকার নেই। ফাংশনটি এখনও বলা হয়।
শেষ পর্যন্ত, আপনার কেন সিটিই শুরু করতে হবে তা স্পষ্ট নয়। সম্ভবত ধারণার একটি প্রমাণ।
ঘনিষ্ঠভাবে সম্পর্কিত:
এসও সম্পর্কিত সম্পর্কিত উত্তর:
এবং বিবেচনা করুন: