পিএল / পিজিএসকিউএল ব্যবহার করে ভেরিয়েবলের স্টোর ক্যোয়ারির ফলাফল


130

পিএল / পিজিএসকিউএল, পোস্টগ্রেএসকিউএল এর পদ্ধতিগত ভাষাতে কোনও প্রশ্নের ফলাফল কীভাবে নির্ধারণ করবেন?

আমার একটি ফাংশন রয়েছে:

CREATE OR REPLACE FUNCTION test(x numeric)
RETURNS character varying AS
$BODY$
DECLARE
name   character varying(255);
begin
 name ='SELECT name FROM test_table where id='||x;

 if(name='test')then
  --do somthing
 else
  --do the else part
 end if;
end;
return -- return my process result here
$BODY$
LANGUAGE plpgsql VOLATILE

উপরের ফাংশনে আমার এই কোয়েরির ফলাফল সংরক্ষণ করতে হবে:

'SELECT name FROM test_table where id='||x;

পরিবর্তনশীল name।

কিভাবে এটি প্রক্রিয়া?

উত্তর:


198

আমি মনে করি আপনি খুঁজছেন SELECT INTO:

select test_table.name into name from test_table where id = x;

যে টান হবে nameথেকে test_tableযেখানে idআপনার ফাংশনের যুক্তি এবং এটা ছেড়ে nameপরিবর্তনশীল। সারণীর নাম উপসর্গটি ছেড়ে যাবেন না test_table.nameবা আপনি একটি দ্ব্যর্থহীন রেফারেন্স সম্পর্কে অভিযোগ পাবেন।


2
আমার যদি একাধিক ভেরিয়েবলের দরকার হয়। টেস্ট_ট্যাবল.নাম, টেস্ট_সটেল.আইডি, টেস্ট_ টেবিল.এসএন পছন্দ করুন?
— দাও লাম

2
@ দাওলাম: ডকুমেন্টেশন থেকে আমি এটি পছন্দ করেছি: "একটি এসকিউএল কমান্ডের ফলাফল একটি একক সারি প্রদান করে (সম্ভবত একাধিক কলাম হতে পারে) একটি রেকর্ড ভেরিয়েবল, সারি-ধরণের ভেরিয়েবল বা স্কেলার ভেরিয়েবলের তালিকাতে নির্ধারিত হতে পারে" "
— মিউ খুব ছোট

@ মমিস্টুশোর্ট যাতে আপনি বলছেন যে আমিও একই কাজ করতে পারি এবং পুনরুদ্ধার করার জন্য আমি নাম.আইডি, নাম.এসএনএন ব্যবহার করতে পারি? আমি এটি উপস্থিত থাকলে চেষ্টা করেছিলাম কিন্তু কাজ করে নি: যদি উপস্থিত না থাকে (পরীক্ষার_সারণী থেকে নামটি নির্বাচন করুন ...))
— দাও লাম

@ দাউলাম আপনি যদি বিদ্যমান না থেকে INTO- কে সংযুক্ত করছেন? হতে পারে আপনার একটি নতুন প্রশ্ন জিজ্ঞাসা করা উচিত যাতে আপনি যা করার চেষ্টা করছেন তা ব্যাখ্যা করতে পারেন।
— মিউ খুব সংক্ষিপ্ত

3
ডকুমেন্টেশনের কোনও উদাহরণ নেই (বা আমি এটি মিস করেছি), তবে @ মাইস্টুশোর্ট হিসাবে উল্লেখ করা হয়েছে, আপনি একক নির্বাচন সহ একাধিক ভেরিয়েবল নির্বাচন করতে পারেন:SELECT test_table.column1, test_table.column2 INTO variable1, variable2 FROM test_table WHERE id = x;
— গ্রেঙ্গাস

78

যতক্ষণ আপনি একটি একক ভেরিয়েবল বরাদ্দ করছেন ততক্ষণ আপনি একটি পিএলপ.এস.কি.এল. ফাংশনটিতে প্লেইন অ্যাসাইনমেন্ট ব্যবহার করতে পারেন:

name := (SELECT t.name from test_table t where t.id = x);

বা ব্যবহার SELECT INTOমত @mu ইতিমধ্যেই ।

এটিও কাজ করে:

name := t.name from test_table t where t.id = x;

তবে পাভেল মন্তব্য করেছেন, তবে পরিষ্কার দুটি পদ্ধতিগুলির মধ্যে একটি ভাল ব্যবহার করুন।

আমি অতিরিক্তভাবে একটি টেবিল ওরফে দিয়ে সিনট্যাক্সটি সংক্ষিপ্ত করে দিয়েছি।
আপডেট: আমি আমার কোড উদাহরণটি সরিয়েছি এবং এর IF EXISTS()পরিবর্তে @ পাভেল দ্বারা সরবরাহিত ব্যবহারের পরামর্শ দিই ।


1
এটি ভাল ধারণা নয় - এই বৈশিষ্ট্যটি নথিভুক্ত করা হয়নি এবং এটি কুৎসিত
— পাভেল স্টিহুল

2
পিএল / পিজিএসকিউএল এসকিউএল এবং পিএল মিশ্রিত করতে দেয় - এবং কখনও কখনও আপনি সত্যই অদ্ভুত প্রাণী তৈরি করতে পারেন তবে বিচ্ছিন্ন বিবৃতিতে পরিষ্কারভাবে পিএল এবং এসকিউএল মিশ্রণ করতে পারেন।
— পাভেল স্টিহুল

@ পাভেলস্টেহুল: আমি সম্মতি জানাই, আপনার ফর্মটি আরও ভাল।
— এরউইন ব্র্যান্ডস্টেটার

আসলে আমি আপনার সিনট্যাক্সটিকে অগ্রাধিকার দিই, তবে সমস্যাটি যখন আপনি ত্রুটিগুলি পরিচালনা করতে চান, তখন আপনার বক্তব্যটি বিবৃতিতে বাছাইয়ের বিপরীতে সত্যকে প্রমাণ করতে পারে না, চেকআউট ( postgresql.org/docs/9.1/plpgsql-statements.html )
— সেনজাজি রাহাজি হামজা

18

সাধারণ প্যাটার্নটি হ'ল EXISTS(subselect):

BEGIN
  IF EXISTS(SELECT name
              FROM test_table t
             WHERE t.id = x
               AND t.name = 'test')
  THEN
     ---
  ELSE
     ---
  END IF;

এই প্যাটার্নটি পিএল / এসকিউএল, পিএল / পিজিএসকিউএল, এসকিউএল / পিএসএম, ...


2

শেখার সারণী তৈরি করুন:

CREATE TABLE "public"."learning" (
    "api_id" int4 DEFAULT nextval('share_api_api_id_seq'::regclass) NOT NULL,
    "title" varchar(255) COLLATE "default"
);

ডেটা লার্নিং টেবিল সন্নিবেশ করান:

INSERT INTO "public"."learning" VALUES ('1', 'Google AI-01');
INSERT INTO "public"."learning" VALUES ('2', 'Google AI-02');
INSERT INTO "public"."learning" VALUES ('3', 'Google AI-01');

পদক্ষেপ: 01

CREATE OR REPLACE FUNCTION get_all (pattern VARCHAR) RETURNS TABLE (
        learn_id INT,
        learn_title VARCHAR
) AS $$
BEGIN
    RETURN QUERY SELECT
        api_id,
        title
    FROM
        learning
    WHERE
        title = pattern ;
END ; $$ LANGUAGE 'plpgsql';

পদক্ষেপ: 02

SELECT * FROM get_all('Google AI-01');

পদক্ষেপ: 03

DROP FUNCTION get_all();

ডেমো: এখানে চিত্র বর্ণনা লিখুন


-2

আপনি পিএল / পিজিএসকিউএল ব্যবহার করে ভেরিয়েবলের ক্যোয়ারির ফলাফল সংরক্ষণ করতে নীচের উদাহরণটি ব্যবহার করতে পারেন:

 select * into demo from maintenanceactivitytrack ; 
    raise notice'p_maintenanceid:%',demo;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.