কিভাবে ভেরিয়েবল ঘোষণা করবেন এবং এটি একই ওরাকল এসকিউএল স্ক্রিপ্টে ব্যবহার করবেন?


133

আমি পুনঃব্যবহারযোগ্য কোডটি লিখতে চাই এবং শুরুতে কিছু ভেরিয়েবলগুলি ঘোষণা করতে এবং স্ক্রিপ্টে তাদের পুনঃব্যবহার করা দরকার যেমন:

DEFINE stupidvar = 'stupidvarcontent';

SELECT stupiddata
FROM stupidtable
WHERE stupidcolumn = &stupidvar;

আমি কীভাবে কোনও পরিবর্তনশীল ঘোষণা করতে পারি এবং এসকিউএল ডেফলার ব্যবহার করার মতো অনুসরণকারী বিবৃতিগুলিতে এটি পুনরায় ব্যবহার করতে পারি।


প্রচেষ্টা

  • একটি ঘোষণা অধ্যায় ব্যবহার করুন এবং নিম্নলিখিত নির্বাচন বিবৃতি সন্নিবেশ BEGINএবং END;। ভেরিয়েবল ব্যবহার করে অ্যাক্সেস করে &stupidvar
  • কীওয়ার্ডটি ব্যবহার করুন DEFINEএবং ভেরিয়েবলটি অ্যাক্সেস করুন।
  • কীওয়ার্ডটি ব্যবহার করে VARIABLEএবং ভেরিয়েবলটি অ্যাক্সেস করুন।

তবে আমার প্রচেষ্টার সময় আমি সমস্ত ধরণের ত্রুটি পাচ্ছি (আনবাউন্ড ভেরিয়েবল, সিনট্যাক্স ত্রুটি, প্রত্যাশিত SELECT INTO...)।


2
নোট করুন যে @ এপিসি দ্বারা গৃহীত উত্তরের পদ্ধতির ব্যবহারটি পিএল / এসকিউএল ছাড়াই ব্যবহার করা যেতে পারে, যেমন আপনার প্রশ্ন অনুসারে একটি এসকিউএল বিকাশকারী ওয়ার্কশিটে। কেবলমাত্র একটি লাইনে ভেরিয়েবলটি ঘোষণা করুন (কোনও অর্ধযুগল নয়), তারপরে নির্ধারিত লাইনটি তার মান নির্ধারণ করতে (সেমিকোলন দিয়ে শেষ হবে), তারপরে আপনার নির্বাচনী বিবৃতিটি। অবশেষে, এটিকে কোনও বিবৃতি (F9) হিসাবে নয়, স্ক্রিপ্ট (F5) হিসাবে চালান।
আমোস এম কার্পেন্টার

উত্তর:


139

এসকিউএল * প্লাস স্ক্রিপ্টগুলিতে ভেরিয়েবল ঘোষণার বিভিন্ন উপায় রয়েছে।

প্রথমটি হ'ল ভিএআর ব্যবহার করা, একটি বাইন্ড ভেরিয়েবল ঘোষণা করা। একটি ভিএআর-তে মান নির্ধারণের প্রক্রিয়াটি একটি এক্সইসি কল সহ রয়েছে:

SQL> var name varchar2(20)
SQL> exec :name := 'SALES'

PL/SQL procedure successfully completed.

SQL> select * from dept
  2  where dname = :name
  3  /

    DEPTNO DNAME          LOC
---------- -------------- -------------
        30 SALES          CHICAGO

SQL>

একটি ভিএআর বিশেষত কার্যকর যখন আমরা কোনও স্টোরেজ পদ্ধতিতে কল করতে চাই যার OUT পরামিতি বা কোনও ফাংশন থাকে।

বিকল্পভাবে আমরা বিকল্পের ভেরিয়েবলগুলি ব্যবহার করতে পারি। এগুলি ইন্টারেক্টিভ মোডের জন্য ভাল:

SQL> accept p_dno prompt "Please enter Department number: " default 10
Please enter Department number: 20
SQL> select ename, sal
  2  from emp
  3  where deptno = &p_dno
  4  /
old   3: where deptno = &p_dno
new   3: where deptno = 20

ENAME             SAL
---------- ----------
CLARKE            800
ROBERTSON        2975
RIGBY            3000
KULASH           1100
GASPAROTTO       3000

SQL>

যখন আমরা এমন কোনও স্ক্রিপ্ট লিখি যা অন্য স্ক্রিপ্টগুলিকে কল করে এটি ভেরিয়েবলগুলি সামনে উল্লেখ করার জন্য কার্যকর হতে পারে। এই স্নিপেটটি আমাকে একটি মান প্রবেশ করানোর জন্য অনুরোধ না করে চলে:

SQL> def p_dno = 40
SQL> select ename, sal
  2  from emp
  3  where deptno = &p_dno
  4  /
old   3: where deptno = &p_dno
new   3: where deptno = 40

no rows selected

SQL>

অবশেষে বেনামে পিএল / এসকিউএল ব্লক রয়েছে। আপনি দেখতে পাচ্ছেন, আমরা এখনও ইন্টারেক্টিভভাবে ঘোষিত ভেরিয়েবলগুলিকে মান নির্ধারণ করতে পারি:

SQL> set serveroutput on size unlimited
SQL> declare
  2      n pls_integer;
  3      l_sal number := 3500;
  4      l_dno number := &dno;
  5  begin
  6      select count(*)
  7      into n
  8      from emp
  9      where sal > l_sal
 10      and deptno = l_dno;
 11      dbms_output.put_line('top earners = '||to_char(n));
 12  end;
 13  /
Enter value for dno: 10
old   4:     l_dno number := &dno;
new   4:     l_dno number := 10;
top earners = 1

PL/SQL procedure successfully completed.

SQL>

6
"বাইন্ড ভেরিয়েবল" শব্দটি ব্যবহার ব্যতীত সমস্ত ভাল। ভিএআর ঘোষণাটি বাইন্ড ভেরিয়েবল তৈরি করে, অন্যদিকে এসিসিপিটি বা ডেফিন একটি বিকল্প পরিবর্তনশীল তৈরি করে।
ডেভ কোস্তা

1
ভেরিয়েবল + স্ট্রিংগুলি সংহত করা সম্ভব?
ইক্রপোলিস

@ এক্রপোলিস - হ্যাঁ, এসকিউএল প্লাসে ডিফল্টরূপে পিরিয়ড ব্যবহার করুন। চরিত্রটি সংজ্ঞায়িত করতে সেট কনক্যাট ব্যবহার করুন যা ভেরিয়েবলের নামটি তাত্ক্ষণিকভাবে অনুসরণ করে বর্ণানুক্রমিক অক্ষর থেকে বিকল্প বদলের নাম পৃথক করে। পিএল / এসকিউএল বা এসকিউএল ডাবল পাইপ ব্যবহার করুন || সম্মতি জানাতে।
লাস্লো লুগোসি

যদি এসকিউএল একটি স্ট্যান্ডার্ড ভাষা হয় তবে কেবলমাত্র যে কোনও জায়গায় কাজ করে এমন একটি প্রচলিত রেফারেন্স খুঁজে পাওয়া এত কঠিন কেন? ডব্লিউটিএফ ???
jww

1
@jww - এসকিউএল একটি স্ট্যান্ডার্ড তবে এটি সর্বদা সঠিক বাক্য গঠন নির্দিষ্ট করে না তাই বিভিন্ন আরডিবিএমএস পণ্য বিভিন্নভাবে জিনিস প্রয়োগ করতে পারে; তারিখ গাণিতিক ভাল উদাহরণ। এছাড়াও ওরাকল এর মতো পুরানো ডাটাবেস পণ্যগুলি প্রায়শই স্ট্যান্ডার্ডগুলি আচ্ছাদন করার আগে বৈশিষ্ট্যগুলি প্রবর্তন করে: উদাহরণস্বরূপ সিন্ট্যাক্সের মাধ্যমে বংশোদ্ভুত সংযুক্তি। তবে এই ক্ষেত্রে আমরা এসকিউএল * প্লাস নিয়ে আলোচনা করছি যা একটি ক্লায়েন্ট সরঞ্জাম এবং তাই এটি এএনএসআই স্ট্যান্ডার্ড দ্বারা আচ্ছাদিত নয়।
এপিসি

28

এটি যদি চরের ভেরিয়েবল হয় তবে ডাবল কোট ব্যবহার করার চেষ্টা করুন:

DEFINE stupidvar = "'stupidvarcontent'";

অথবা

DEFINE stupidvar = 'stupidvarcontent';

SELECT stupiddata  
FROM stupidtable  
WHERE stupidcolumn = '&stupidvar'

upd:

SQL*Plus: Release 10.2.0.1.0 - Production on Wed Aug 25 17:13:26 2010

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

SQL> conn od/od@etalon
Connected.
SQL> define var = "'FL-208'";
SQL> select code from product where code = &var;
old   1: select code from product where code = &var
new   1: select code from product where code = 'FL-208'

CODE
---------------
FL-208

SQL> define var = 'FL-208';
SQL> select code from product where code = &var;
old   1: select code from product where code = &var
new   1: select code from product where code = FL-208
select code from product where code = FL-208
                                      *
ERROR at line 1:
ORA-06553: PLS-221: 'FL' is not a procedure or is undefined

আপনার উত্তরের জন্য আপনাকে ধন্যবাদ, তবে আমি যদি ডাবল উদ্ধৃতিতে ভ্যারিটটি অন্তর্ভুক্ত করি তবে আমি একটি পাই ORA-01008: not all variables bound
bl4ckb0l7

1
নিশ্চিত! DEFINE num = 1; SELECT &num FROM dual;বাড়ে: ORA-01008: not all variables bound
bl4ckb0l7

@ bl4ckb0l7 - আমি বাজি ধরছি যে আপনি এটি এসকিউএল * প্লাসে না করে চেষ্টা করছেন।
লাস্লো লুগোসি

20

পিএল / এসকিউএল v.10 এ

কীওয়ার্ড ডিক্লেয়ারটি ভেরিয়েবল ঘোষণার জন্য ব্যবহৃত হয়

DECLARE stupidvar varchar(20);

কোনও মান নির্ধারণের জন্য আপনি যখন ঘোষণা করেন তখন সেট করতে পারেন

DECLARE stupidvar varchar(20) := '12345678';

বা সেই ভেরিয়েবলের মধ্যে কিছু নির্বাচন করতে আপনি INTOবিবৃতি ব্যবহার করেন , তবে আপনাকে BEGINএবং ইন স্টেটমেন্ট মোড়ানো দরকারEND এছাড়াও, আপনাকে নিশ্চিত করতে হবে যে কেবল একক মান ফিরে এসেছে এবং সেমিকোলনগুলি ভুলে যাবেন না।

সুতরাং সম্পূর্ণ বিবৃতি নিম্নলিখিত প্রকাশিত হবে:

DECLARE stupidvar varchar(20);
BEGIN
    SELECT stupid into stupidvar FROM stupiddata CC 
    WHERE stupidid = 2;
END;

আপনার পরিবর্তনশীল কেবলমাত্র ব্যবহারযোগ্য BEGINএবং ENDতাই যদি আপনি একাধিক ব্যবহার করতে চান তবে আপনাকে একাধিক BEGIN ENDমোড়কের কাজ করতে হবে

DECLARE stupidvar varchar(20);
BEGIN
    SELECT stupid into stupidvar FROM stupiddata CC 
    WHERE stupidid = 2;

    DECLARE evenmorestupidvar varchar(20);
    BEGIN
        SELECT evenmorestupid into evenmorestupidvar FROM evenmorestupiddata CCC 
        WHERE evenmorestupidid = 42;

        INSERT INTO newstupiddata (newstupidcolumn, newevenmorestupidstupidcolumn)
        SELECT stupidvar, evenmorestupidvar 
        FROM dual

    END;
END;

আশা করি এটি আপনার কিছুটা সময় সাশ্রয় করবে


7

আপনি যদি তারিখ ঘোষণা করতে চান এবং তারপরে এটি এসকিউএল বিকাশকারীটিতে ব্যবহার করুন।

DEFINE PROPp_START_DT = TO_DATE('01-SEP-1999')

SELECT * 
FROM proposal 
WHERE prop_start_dt = &PROPp_START_DT

5

শুধু মাতাসের উত্তর যুক্ত করতে চাই । সম্ভবত এটি সুস্পষ্ট, তবে আমি ভেরিয়েবলটি কেবল বিগিন-এন্ড নির্মাণের ভিতরেই অ্যাক্সেসযোগ্য তা নির্ধারণের জন্য দীর্ঘ সময় অনুসন্ধান করেছি , সুতরাং যদি আপনাকে পরে কিছু কোড ব্যবহার করতে হয় তবে আপনাকে এই কোডটি শুরু করতে হবে - অবরুদ্ধ ব্লক

মনে রাখবেন যে এই ব্লকগুলি নেস্ট করা যেতে পারে :

DECLARE x NUMBER;
  BEGIN
    SELECT PK INTO x FROM table1 WHERE col1 = 'test';

    DECLARE y NUMBER;
    BEGIN
    SELECT PK INTO y FROM table2 WHERE col2 = x;

    INSERT INTO table2 (col1, col2)
      SELECT y,'text'
      FROM dual
      WHERE exists(SELECT * FROM table2);
    COMMIT;
  END;
END;

5

প্রশ্নটি কোনও স্ক্রিপ্টে একটি ভেরিয়েবল ব্যবহার করার অর্থ এটি আমার কাছে এটি এসকিউএল * প্লাসে ব্যবহৃত হবে।

সমস্যাটি হ'ল আপনি কোটগুলি মিস করেছেন এবং ওরাকল সংখ্যার মানটিকে পার্স করতে পারে না।

SQL> DEFINE num = 2018
SQL> SELECT &num AS your_num FROM dual;
old   1: SELECT &num AS your_num FROM dual
new   1: SELECT 2018 AS your_num FROM dual

  YOUR_NUM
----------
      2018

Elapsed: 00:00:00.01

এই নমুনাটি স্বয়ংক্রিয় ধরণের রূপান্তরের কারণে (বা এটি যাই হোক না কেন) ভাল কাজ করে।

আপনি যদি এসকিউএল * প্লাসে DEFINE টাইপ করে পরীক্ষা করেন, এটি দেখায় যে নাম্বার ভেরিয়েবলটি CHAR।

SQL>define
DEFINE NUM             = "2018" (CHAR)

এটি এক্ষেত্রে কোনও সমস্যা নয় কারণ ওরাকল একটি বৈধ সংখ্যা হলে এটি সংখ্যায় পার্সিং স্ট্রিংয়ের সাথে ডিল করতে পারে।

স্ট্রিং যখন সংখ্যায় পার্স করতে পারে না, তার চেয়ে ওরাকল এর সাথে ডিল করতে পারে না।

SQL> DEFINE num = 'Doh'
SQL> SELECT &num AS your_num FROM dual;
old   1: SELECT &num AS your_num FROM dual
new   1: SELECT Doh AS your_num FROM dual
SELECT Doh AS your_num FROM dual
       *
ERROR at line 1:
ORA-00904: "DOH": invalid identifier

একটি উদ্ধৃতি দিয়ে, সুতরাং ওরাকলকে সংখ্যায় পার্স করতে বাধ্য করবেন না, ভাল হবে:

17:31:00 SQL> SELECT '&num' AS your_num FROM dual;
old   1: SELECT '&num' AS your_num FROM dual
new   1: SELECT 'Doh' AS your_num FROM dual

YOU
---
Doh

সুতরাং, মূল প্রশ্নের উত্তর দিতে, এটি এই নমুনার মতো হওয়া উচিত:

SQL> DEFINE stupidvar = 'X'
SQL>
SQL> SELECT 'print stupidvar:' || '&stupidvar'
  2  FROM dual
  3  WHERE dummy = '&stupidvar';
old   1: SELECT 'print stupidvar:' || '&stupidvar'
new   1: SELECT 'print stupidvar:' || 'X'
old   3: WHERE dummy = '&stupidvar'
new   3: WHERE dummy = 'X'

'PRINTSTUPIDVAR:'
-----------------
print stupidvar:X

Elapsed: 00:00:00.00

এসকিউএল * প্লাসে কোয়েরি কলাম মান ব্যবহার করে ভেরিয়েবল সঞ্চয় করার অন্য একটি উপায় রয়েছে

কল [UMN] আছে NEW_VALUE ক্ষেত্র নাম দ্বারা ক্যোয়ারী থেকে দোকান মান বিকল্প।

SQL> COLUMN stupid_column_name new_value stupid_var noprint
SQL> SELECT dummy || '.log' AS stupid_column_name
  2  FROM dual;

Elapsed: 00:00:00.00
SQL> SPOOL &stupid_var.
SQL> SELECT '&stupid_var' FROM DUAL;
old   1: SELECT '&stupid_var' FROM DUAL
new   1: SELECT 'X.log' FROM DUAL

X.LOG
-----
X.log

Elapsed: 00:00:00.00
SQL>SPOOL OFF;

আপনি দেখতে পাচ্ছেন, এক্স.লগ মানটি বোকা_ভর ভেরিয়েবলে সেট করা হয়েছিল , সুতরাং আমরা বর্তমান ডিরেক্টরিতে একটি এক্স.লগ ফাইল খুঁজে পেতে পারি যাতে এতে কিছু লগইন থাকে।


2

আপনার উত্তর এখানে:

DEFINE num := 1;       -- The semi-colon is needed for default values.
SELECT &num FROM dual;

1
আমার সাথেও একই. আমি ওডিটি ব্যবহার করি এবং চালনা করি: ডিফাইন নম্বর: = 1; দ্বৈত থেকে নম্বর নির্বাচন করুন; এবং আমি যা পাই তা হ'ল: ORA-00904: "NUM": অবৈধ শনাক্তকারী 00904. 00000 - "% s: অবৈধ শনাক্তকারী" * কারণ: * ক্রিয়া: লাইনে ত্রুটি: 2 কলাম: 8
তোহা

0

টোডে আমি এই কাজগুলি ব্যবহার করি:

declare 
    num number;
begin 
    ---- use 'select into' works 
    --select 123 into num from dual;

    ---- also can use :=
    num := 123;
    dbms_output.Put_line(num);
end;

তারপরে মানটি DBMS Outputউইন্ডোতে মুদ্রণ করা হবে ।

রেফারেন্স এখানে এবং here2


0

কখনও কখনও আপনাকে কোনও মান প্রবেশ করানোর জন্য ব্যবহারকারীকে জিজ্ঞাসা না করে আপনাকে ম্যাক্রো ভেরিয়েবল ব্যবহার করতে হবে। প্রায়শই এটি alচ্ছিক স্ক্রিপ্ট পরামিতিগুলির সাথে সম্পন্ন করতে হয়। নিম্নলিখিত কোডটি সম্পূর্ণরূপে কার্যক্ষম

column 1 noprint new_value 1
select '' "1" from dual where 2!=2;
select nvl('&&1', 'VAH') "1" from dual;
column 1 clear
define 1

অনুরূপ কোডটি কোনওভাবে rdbms / sQL ডিরেক্টরিতে পাওয়া গিয়েছিল।


0

একটি সম্ভাব্য পন্থা, আপনার যদি একবার মাত্র একটি প্যারামিটার নির্দিষ্ট করতে হয় এবং এটি বেশ কয়েকটি জায়গায় প্রতিলিপি করা হয় তবে তা এরকম কিছু করা:

SELECT
  str_size  /* my variable usage */
  , LPAD(TRUNC(DBMS_RANDOM.VALUE * POWER(10, str_size)), str_size, '0') rand
FROM
  dual  /* or any other table, or mixed of joined tables */
  CROSS JOIN (SELECT 8 str_size FROM dual);  /* my variable declaration */

এই কোডটি 8 টি এলোমেলো অঙ্কের একটি স্ট্রিং উত্পন্ন করে।

লক্ষ্য করুন যে আমি নামের একধরণের নাম রাখি str_sizeযা ধ্রুবকটি ধারণ করে 8। ক্যোয়ারিতে এটি একাধিকবার ব্যবহার করতে ক্রস-জেন্ডড।

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