ত্রুটি: set_valued ফাংশন প্রসঙ্গে বলা হয় যা কোনও সেট গ্রহণ করতে পারে না। এটা কিসের ব্যাপারে?


11

আমি উবার্টু 12.04 সহ পোস্টগ্রেস্কেল 9.1 ব্যবহার করি।

আমার প্রশ্নের ক্রেগ এর উত্তর দ্বারা অনুপ্রাণিত setof টাইপ বা setof রেকর্ড সংযুক্তকরণ আমি ভেবেছিলাম আমি ব্যবহার সঙ্গে ভাল যেতে হবে return query, setof record, এবং এই plpgsql ফাংশন মধ্যে একটি সিরিজ জেনারেটর:

create or replace function compute_all_pair_by_craig(id_obj bigint)
    returns setof record as $$
begin
    return query select o.id, generate_series(0,o.value) from m_obj as o;     
end;
$$    language plpgsql;

কার্যকর করার সময় আমি ত্রুটি পেয়েছি:

ERROR: set_valued function called in context that cannot accept a set

কি সমস্যা ? ক্রেগের বিপরীতে আমি ফাংশনটি ফিরে আসতে বলি setof record

আমি ক্রেগের মতো হুবহু কাজ করে এমন কিছু অর্জন করতে পারি, যেমন কোনও প্রকারের সংজ্ঞা দিয়ে create type pair_id_value as (idx bigint, value integer)এবং আমার পিএলপিএসএইচএল ফাংশনটির setof of pair_id_valueপরিবর্তে একটি পরিবর্তিত করে setof record

তবে এই কার্যনির্বাহী সমাধানের পরেও আমি এখনও বুঝতে পারি না যে কেন select id, generate_series(0,13)একা দুটি কলামে ফলাফল ফিরে আসবে ... এবং বিপরীতে ফাংশনটি (সেটআপ পেয়ার_আইডি_ভ্যালু) কল করার সাথে কেবল একটি কলামেরreturn query select id, generate_series(0,my_obj.value) from my_obj ফলাফল দেখাবে যা ক্ষেত্রের মতো দেখায় এটি "(123123,0)" "(123123,1)" "(123123,2)" (3 টি সারি) যা স্পষ্টতই টিপলস।

এটি এমন কোনও ক্ষেত্রে যেখানে অস্থায়ী টেবিলটি তৈরি করা উচিত / হওয়া উচিত?


আপনি যে ফাংশনটি চালাচ্ছেন তার সঠিক পাঠ্য এটি হতে পারে না কারণ এটি সংকলন করে না; এর পরে একটি অতিরিক্ত সেমিকোলন BEGINএবং এর পরে একটি অনুপস্থিত RETURN QUERY। এই ত্রুটিগুলি সংশোধন করার পরে আমি ফিরে আসার সময় ত্রুটিটি নিশ্চিত করি record; উত্তরে ব্যাখ্যা করবে।
ক্রেগ রিঞ্জার

@ ক্রেইগ্রিঞ্জার আমি সেমিকোলনটি আবার জায়গায় রেখেছি।
স্টিফেন রোল্যান্ড 11

উত্তর:


7

ত্রুটি বার্তা খুব সহায়ক নয়:

regress=> SELECT * FROM  compute_all_pair_by_craig(100);
ERROR:  a column definition list is required for functions returning "record"
LINE 1: SELECT * FROM  compute_all_pair_by_craig(100);

তবে আপনি যদি সঠিক সেট-রিটার্নিং ক্রিয়াকলাপ হিসাবে কল করতে ক্যোয়ারীটি পুনরায় লিখে থাকেন তবে আপনি আসল সমস্যাটি দেখতে পাবেন:

regress=> SELECT * FROM compute_all_pair_by_craig(100);
ERROR:  a column definition list is required for functions returning "record"
LINE 1: SELECT * FROM compute_all_pair_by_craig(100);

আপনি যদি SETOF RECORDকোনও OUTপ্যারামিটার তালিকা ছাড়াই ব্যবহার করছেন তবে আপনাকে অবশ্যই কলিং স্টেটমেন্টের ফলাফলগুলি নির্দিষ্ট করতে হবে, যেমন:

regress=> SELECT * FROM compute_all_pair_by_craig(100) theresult(a integer, b integer);

তবে এটি ব্যবহার RETURNS TABLEবা OUTপরামিতিগুলি আরও অনেক ভাল । পূর্ববর্তী সিনট্যাক্সের সাথে আপনার ফাংশনটি হ'ল:

create or replace function compute_all_pair_by_craig(id_obj bigint)
    returns table(a integer, b integer) as $$
begin
    return query select o.id, generate_series(0,o.value) from m_obj as o;     
end;
$$ language plpgsql;

এটি SELECT- তালিকার প্রসঙ্গে কলযোগ্য এবং স্পষ্টভাবে কোনও প্রকার তৈরি না করে বা কল সাইটে ফলাফলের কাঠামো নির্দিষ্ট না করে ব্যবহার করা যেতে পারে।


প্রশ্নের দ্বিতীয়ার্ধের ক্ষেত্রে, যা হচ্ছে তা হচ্ছে 1 ম কেসটি একটি নির্বাচন-তালিকায় দুটি পৃথক কলাম নির্দিষ্ট করে, দ্বিতীয়টি একক সংমিশ্রণ দেয়। আপনি কীভাবে ফলাফলটি ফিরিয়ে দিচ্ছেন তা আসলে এটি করা নয়, তবে আপনি কীভাবে ফাংশনটি চালাচ্ছেন। যদি আমরা নমুনা ফাংশন তৈরি করি:

CREATE OR REPLACE FUNCTION twocols() RETURNS TABLE(a integer, b integer) 
AS $$ SELECT x, x FROM generate_series(1,5) x; $$ LANGUAGE sql;

সেট-রিটার্নিং ফাংশনটি কল করার জন্য আপনি দুটি উপায়ের মধ্যে পার্থক্যটি দেখতে পাবেন - SELECTতালিকায় স্পষ্ট আচরণের সাথে পোস্টগ্র্রেএসকিউএল নির্দিষ্ট অ-মানক এক্সটেনশান:

regress=> SELECT twocols();
 twocols 
---------
 (1,1)
 (2,2)
 (3,3)
 (4,4)
 (5,5)
(5 rows)

বা আরও সাধারণ পদ্ধতিতে একটি টেবিল হিসাবে:

regress=> SELECT * FROM twocols();
 a | b 
---+---
 1 | 1
 2 | 2
 3 | 3
 4 | 4
 5 | 5
(5 rows)

সবেমাত্র পরীক্ষিত, নিখুঁত কাজ করে। এবং আমি এই সিনট্যাক্সটি পছন্দ করি returns table
স্টিফেন রোল্যান্ড

প্রশ্নের উত্তরের অংশটির ব্যাখ্যা সহ স্টিফেন রোল্যান্ড আপডেট হয়েছে।
ক্রেগ রিঞ্জার

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