PL / pgSQL का उपयोग कर एक चर में स्टोर क्वेरी परिणाम


130

PL / pgSQL में एक चर के लिए एक क्वेरी के परिणाम को कैसे निर्दिष्ट करें, PostgreSQL की प्रक्रियात्मक भाषा?

मेरे पास एक समारोह है:

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_tableidnametest_table.name


2
क्या होगा अगर मुझे कई चर चाहिए। जैसे चयन test_table.name, test_table.id, test_table.ssn?
दाओ लाम

2
@DaoLam: मेरे द्वारा पसंद किए गए प्रलेखन से: "SQL कमांड का परिणाम एक एकल पंक्ति (कई स्तंभों का संभवतः) का उत्पादन होता है, जिसे रिकॉर्ड चर, पंक्ति-प्रकार के चर, या अदिश चर की सूची में सौंपा जा सकता है।"
म्यु बहुत कम

@ muistooshort तो आप कह रहे हैं कि मैं भी यही कर सकता हूं और मैं पुनः प्राप्त करने के लिए name.id, name.ssn का उपयोग कर सकता हूं? मैंने इसे IF EXTSTS के साथ आज़माया लेकिन काम नहीं किया: IF EXISTS (select_ in name from test_table ...))
Dao Lam

@DaoLam आप IF के साथ INTO का संयोजन क्यों कर रहे हैं? हो सकता है कि आपको एक नया प्रश्न पूछना चाहिए ताकि आप यह बता सकें कि आप क्या करने की कोशिश कर रहे हैं।
को म्यू बहुत छोटा है

3
प्रलेखन में कोई उदाहरण नहीं है (या मैंने इसे याद किया), लेकिन जैसा कि @muistooshort ने उल्लेख किया है, आप एकल चयन के साथ कई चर में चयन कर सकते हैं:SELECT test_table.column1, test_table.column2 INTO variable1, variable2 FROM test_table WHERE id = x;
ग्रेंगास

78

जब तक आप एक एकल चर प्रदान कर रहे हैं, तब तक आप plpgsql फ़ंक्शन में सादे असाइनमेंट का उपयोग कर सकते हैं:

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

या पहले से उपलब्ध कराए गए @muSELECT INTO जैसे उपयोग करें ।

यह भी काम करता है:

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

लेकिन बेहतर है कि पहले दो में से एक का उपयोग करें, स्पष्ट तरीके, जैसे @ पावेल ने टिप्पणी की।

मैंने इसके अलावा एक अन्य रूप से तालिका के साथ वाक्य रचना को छोटा किया।
अपडेट: मैंने अपना कोड उदाहरण हटा दिया और IF EXISTS()इसके बजाय @Pavel द्वारा उपलब्ध कराने का उपयोग करने का सुझाव दिया ।


1
यह अच्छा विचार नहीं है - यह सुविधा प्रलेखित नहीं है और यह बदसूरत है
पावेल स्टीहुल

2
PL / pgSQL SQL और PL के मिश्रण की अनुमति देता है - और कभी-कभी आप वास्तव में अजीब जीव बना सकते हैं, लेकिन बेहतर पीएल और SQL को अलग-अलग बयानों में मिलाते हैं।
पावेल स्टीहुल

@PavelStehule: मैं मानता हूं, आपका फॉर्म बेहतर है।
इरविन ब्रान्डस्टेट्टर

वास्तव में मैं आपके वाक्यविन्यास को पूर्ववर्ती करता हूं, लेकिन समस्या यह है कि जब आप त्रुटियों को संभालना चाहते हैं, तो आपका कथन कथन के विपरीत चयन में सत्य को भेजता है, चेकआउट ( postgresql.org/docs/9.1/plangsql-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;

इस पैटर्न का उपयोग PL / SQL, PL / pgSQL, SQL / PSM, में किया जाता है ...


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

आप PL / pgSQL का उपयोग करके चर में क्वेरी परिणाम को स्टोर करने के लिए निम्न उदाहरण का उपयोग कर सकते हैं:

 select * into demo from maintenanceactivitytrack ; 
    raise notice'p_maintenanceid:%',demo;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.