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


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.