मैं Oracle SQL डेवलपर में चर का उपयोग कैसे करूं?


116

नीचे SQL Server 2000 में चर का उपयोग करने का एक उदाहरण है।

DECLARE @EmpIDVar INT

SET @EmpIDVar = 1234

SELECT *
FROM Employees
WHERE EmployeeID = @EmpIDVar

मैं अतिरिक्त जटिलता के बिना SQL डेवलपर का उपयोग करते हुए ओरेकल में सटीक एक ही काम करना चाहता हूं। यह करने के लिए एक बहुत ही सरल बात की तरह लगता है, लेकिन मैं एक सरल समाधान नहीं ढूँढ सकता। मैं यह कैसे कर सकता हूं?


एक संग्रहीत प्रक्रिया के रूप में या एक स्क्रिप्ट के रूप में? यदि आप EmpIDVar के लिए मान को हार्डकॉउट कर रहे हैं, तो एक चर का उपयोग क्यों करें?
कुरोस्क

जवाबों:


95

मैं संस्करण 3.2 में SQL- डेवलपर का उपयोग कर रहा हूं। अन्य सामान मेरे लिए काम नहीं किया, लेकिन यह किया:

define value1 = 'sysdate'

SELECT &&value1 from dual;

इसके अलावा यह अभी तक यहाँ प्रस्तुत सबसे चालाक तरीका है।

(यदि आप "परिभाषित" -कार छोड़ते हैं तो आपको उस मूल्य के लिए संकेत दिया जाएगा)


12
अगर & स्ट्रिंग मान की तुलना & स्ट्रिंग मान की तरह करें: && value1 = 'कुछ स्ट्रिंग' तो && value1 को एकल उद्धरणों में लपेटना होगा: '&& value1' = 'कुछ स्ट्रिंग'
रयान E

1
SQL डेवलपर में, DEFINE द्वारा परिभाषित प्रतिस्थापन चर क्वेरी निष्पादन के बीच लगातार प्रतीत होते हैं। यदि मैं परिवर्तनीय मान को बदलता हूं, लेकिन निष्पादित करते समय DEFINE लाइन को स्पष्ट रूप से उजागर नहीं करता है, तो पिछला मान बना रहता है। (क्या यह दोहरी और& के कारण है?)
बोडाद

9
खंड 2.4 में यह पृष्ठ एकल एम्परसेंड (और) और डबल एम्परसेंड और (&&) के बीच के अंतर के बारे में बात करता है
Baodad

1
हम में से जो Microsoft SQL सर्वर प्रबंधन स्टूडियो में चर के साथ प्रश्नों के साथ काम करते थे, उनके लिए यह सबसे अच्छा उत्तर है। हालांकि, निष्पादित करने से पहले हमें पूरी क्वेरी को उजागर करने की आदत डालने की आवश्यकता हो सकती है।
बड़ौद

यह उत्तर समाधान था जो मेरे लिए SQL-Developer 2.1 में काम करता था। यह निश्चित रूप से उपयोगकर्ता के लिए क्वेरी के ऊपर एक मान बदलने के लिए और सीधे क्वेरी को संपादित नहीं करने के लिए एक रास्ता लागू करने के लिए सबसे सीधा तरीका है।
योंकिडॉन्क ६४

74

SQL- प्लस में दो प्रकार के चर हैं: प्रतिस्थापन और बाइंड।

यह प्रतिस्थापन है (प्रतिस्थापन चर SQL * प्लस कमांड विकल्प या अन्य हार्ड-कोडित पाठ को बदल सकते हैं):

define a = 1;
select &a from dual;
undefine a;

यह आरडीबीएमएस में निष्पादित SQL और PL / SQL कथनों के लिए बाइंड (बाइंड वैरिएबल डेटा मानों को बाँधता है; वे एकल मान या पूर्ण परिणाम सेट पकड़ सकते हैं):

var x number;
exec :x := 10;
select :x from dual;
exec select count(*) into :x from dual;
exec print x;

SQL डेवलपर प्रतिस्थापन चर का समर्थन करता है, लेकिन जब आप बाइंड :varसिंटैक्स के साथ एक क्वेरी निष्पादित करते हैं तो आपको बाइंडिंग के लिए संकेत दिया जाता है (एक संवाद बॉक्स में)।

संदर्भ:

अद्यतन प्रतिस्थापन चर उपयोग करने के लिए थोड़ा मुश्किल हैं, देखो:

define phone = '+38097666666';
select &phone from dual; -- plus is stripped as it is a number
select '&phone' from dual; -- plus is preserved as it is a string

2
मैंने SQL डेवलपर (4.1.1.19) में बाइंड की कोशिश की और यह भी काम कर रहा है। मेरा मतलब है मामले के साथ var xऔर exec :x, कोई संकेत नहीं।
बेटलिस्ता'

50

SQL * प्लस में, आप कुछ ऐसा ही कर सकते हैं

SQL> variable v_emp_id number;
SQL> select 1234 into :v_emp_id from dual;

      1234
----------
      1234

SQL> select *
  2    from emp
  3   where empno = :v_emp_id;

no rows selected

SQL डेवलपर में, यदि आप एक ऐसा बयान चलाते हैं जिसमें किसी भी संख्या में बाइंड वैरिएबल (एक कोलोन के साथ उपसर्ग) होते हैं, तो आपको मूल्यों को दर्ज करने के लिए प्रेरित किया जाएगा। जैसा कि एलेक्स बताते हैं, आप "रन स्क्रिप्ट" फ़ंक्शन (F5) का उपयोग करके कुछ ऐसा भी कर सकते हैं, जिसमें वैकल्पिक EXEC सिंटैक्स पॉइंट्स का उपयोग होता है।

variable v_count number;
variable v_emp_id number;
exec :v_emp_id := 1234;
exec select count(1) into :v_count from emp;
select *
  from emp
 where empno = :v_emp_id
exec print :v_count;

14
यदि आप 'रन स्टेटमेंट' के बजाय 'रन स्क्रिप्ट' (F5) लेते हैं तो यह बाइंड चर के लिए संकेत नहीं देगा। लेकिन यह select...into(ORA-01006) पसंद नहीं लगता है , इसलिए आपको exec :v_emp_id := 1234;इसके बजाय करने की आवश्यकता होगी ।
एलेक्स पोइल

@ एलेक्स - अच्छा! मैंने बस छोड़ दिया और मान लिया कि SQL डेवलपर हमेशा बाइंड चर मानों के लिए संकेत दे रहा था। मैंने आपके सुझावों को अपने उत्तर में शामिल कर लिया।
जस्टिन केव

1
@ नथन अगर आप किसी पैकेज को: v_emp_id के साथ निष्पादित करना चाहते हैं, तो आप रिफाइनरी के साथ-साथ बाइंड चर भी उपयोग कर सकते हैं। इसी तरह के एक प्रश्न के लिए एलेक्स के जवाब के नीचे देखें
कॉनरेड फ्रिक्स

2
@AlexPoole क्वेरी आउटपुट विंडो में आउटपुट भेजने का एक तरीका है? अपनी नौकरी में मैं एक्सेल फ़ाइलों को निर्यात करने के लिए क्वेरी चलाता हूं।
tp9

13

ठीक है, मैं इसे थोड़ा हैक जानता हूं लेकिन यह एक सरल क्वेरी में एक चर का उपयोग करने का एक तरीका है, स्क्रिप्ट नहीं:

WITH
    emplVar AS
    (SELECT 1234 AS id FROM dual)
SELECT
    *
FROM
    employees,
    emplVar
WHERE
    EmployId=emplVar.id;

आप इसे हर जगह चलाते हैं।


क्या चयन के बजाय UPDATE के साथ इसका उपयोग करने का कोई तरीका है?
रॉन जेन्सेन - हम सभी मोनिका

12

सरल उत्तर नहीं।

हालाँकि आप बाइंड वैरिएबल्स का उपयोग करके निम्नलिखित संस्करण को चलाकर कुछ समान हासिल कर सकते हैं:

SELECT * FROM Employees WHERE EmployeeID = :EmpIDVar 

एक बार जब आप SQL डेवलपर में ऊपर क्वेरी चलाते हैं, तो आपको बाइंड चर कर्मचारी के लिए मान दर्ज करने के लिए प्रेरित किया जाएगा।


8

आप प्रतिस्थापन चर पर कहीं और पढ़ सकते हैं; वे SQL डेवलपर में काफी काम कर रहे हैं। लेकिन मेरे पास SQL ​​डेवलपर में बाइंड चर का उपयोग करने का प्रयास है। मैं यह करता हूं:

SET SERVEROUTPUT ON
declare
  v_testnum number;
  v_teststring varchar2(1000);

begin
   v_testnum := 2;
   DBMS_OUTPUT.put_line('v_testnum is now ' || v_testnum);

   SELECT 36,'hello world'
   INTO v_testnum, v_teststring
   from dual;

   DBMS_OUTPUT.put_line('v_testnum is now ' || v_testnum);
   DBMS_OUTPUT.put_line('v_teststring is ' || v_teststring);
end;

SET SERVEROUTPUT ON यह बनाता है ताकि पाठ स्क्रिप्ट आउटपुट कंसोल पर मुद्रित किया जा सके।

मेरा मानना ​​है कि हम यहां जो कर रहे हैं उसे आधिकारिक तौर पर PL / SQL कहा जाता है। हमने शुद्ध एसक्यूएल भूमि को छोड़ दिया है और ओरेकल में एक अलग इंजन का उपयोग कर रहे हैं। आप SELECTऊपर देख रहे हैं? पीएल / एसक्यूएल में आपको हमेशा SELECT ... INTOया तो परिवर्तनशील या एक प्रतिक्षेपक होना चाहिए। आप केवल SELECTPL / SQL में सेट परिणाम वापस नहीं कर सकते ।


2

मुझे लगता है कि आपके मामले में सबसे आसान तरीका है:

DEFINE EmpIDVar = 1234;

SELECT *
FROM Employees
WHERE EmployeeID = &EmpIDVar

स्ट्रिंग मानों के लिए यह इस प्रकार होगा:

DEFINE EmpIDVar = '1234';

SELECT *
FROM Employees
WHERE EmployeeID = '&EmpIDVar'

1

अगली क्वेरी का उपयोग करें:

DECLARE 
  EmpIDVar INT;

BEGIN
  EmpIDVar := 1234;

  SELECT *
  FROM Employees
  WHERE EmployeeID = EmpIDVar;
END;

त्रुटि "PLS-00428 एक INTO खंड इस चयन बयान में होने की उम्मीद है"
Thundter

0

यह कोशिश करें कि यह काम करेगा, यह एक प्रक्रिया बनाना बेहतर है, अगर प्रक्रिया संभव नहीं है तो आप इस स्क्रिप्ट का उपयोग कर सकते हैं।

with param AS(
SELECT 1234 empid
FROM dual)
 SELECT *
  FROM Employees, param
  WHERE EmployeeID = param.empid;
END;

0

Sql डेवलपर में डिफ़ॉल्ट रूप से "ON" गुणों को परिभाषित करें। यदि यह किसी भी मामले में "बंद" है, तो नीचे दिए चरणों का उपयोग करें।

set define on; define batchNo='123'; update TABLE_NAME SET IND1 = 'Y', IND2 = 'Y' WHERE BATCH_NO = '&batchNo';

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.