আমি কীভাবে ওরাকল এসকিউএল বিকাশকারীকে ভেরিয়েবলগুলি ব্যবহার করব?


116

নীচে এসকিউএল সার্ভার 2000 এ ভেরিয়েবল ব্যবহার করার একটি উদাহরণ দেওয়া আছে।

DECLARE @EmpIDVar INT

SET @EmpIDVar = 1234

SELECT *
FROM Employees
WHERE EmployeeID = @EmpIDVar

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


সঞ্চিত পদ্ধতি হিসাবে বা স্ক্রিপ্ট হিসাবে? আপনি যদি এমপিডবারের জন্য মানটি হার্ডকোডিং করে থাকেন তবে কেন একটি ভেরিয়েবল ব্যবহার করবেন না?
কুরোশ

উত্তর:


95

আমি সংস্করণ 3.2 এ এসকিউএল-বিকাশকারী ব্যবহার করছি। অন্যান্য জিনিসগুলি আমার পক্ষে কাজ করে নি, তবে এটি করেছে:

define value1 = 'sysdate'

SELECT &&value1 from dual;

এছাড়াও এটি এখানে উপস্থাপনের সবচেয়ে সহজ উপায়।

(আপনি যদি "সংজ্ঞায়িত"-পার্টটি বাদ দেন তবে আপনাকে সেই মানটির জন্য অনুরোধ করা হবে)


12
যদি && মান 1 এর মতো স্ট্রিং মানের সাথে তুলনা করা হয়: && value1 = 'কিছু স্ট্রিং' তারপরে && মান 1 এর একক উদ্ধৃতিতে মোড়ানো দরকার যেমন: '&& value1' = 'কিছু স্ট্রিং'
রায়ান ই

1
এসকিউএল বিকাশকারী, ডিফাইন দ্বারা সংজ্ঞায়িত প্রতিস্থাপনের ভেরিয়েবলগুলি কোয়েরি মৃত্যুদণ্ড কার্যকর করার মধ্যে অবিচ্ছিন্ন বলে মনে হচ্ছে। যদি আমি পরিবর্তনশীল মানটি পরিবর্তন করি তবে নির্বাহের সময় স্পষ্টভাবে ডিফাইন লাইনটি হাইলাইট না করি, পূর্ববর্তী মানটি রয়ে যায়। (এটি কি দ্বিগুণ ও& এর কারণে?)
বাওদাদ


1
আমরা যারা মাইক্রোসফ্ট এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিওতে ভেরিয়েবলগুলির সাথে ক্যোয়ারী নিয়ে কাজ করতে অভ্যস্ত তাদের পক্ষে এটি সেরা উত্তর। যদিও কার্যকর করার আগে আমাদের পুরো ক্যোয়ারীটি হাইলাইট করার অভ্যস্ত হতে হবে।
বাওদাদ

এই উত্তরটি ছিল এসকিউএল-বিকাশকারী ২.১-এ আমার জন্য কাজ করা সমাধান। এটি ব্যবহারকারীর ক্যোয়ারির উপরে একটি মান পরিবর্তন করার কোনও উপায় বাস্তবায়নের জন্য অবশ্যই সবচেয়ে সোজা-এগিয়ে থাকা পদ্ধতি এবং নিজেই কোয়েরিটি সম্পাদনা করতে হবে না।
YonkeyDonk64

74

এসকিউএল-প্লাসে দুটি ধরণের পরিবর্তনশীল রয়েছে: প্রতিস্থাপন এবং বাঁধাই।

এটি প্রতিস্থাপন (বিকল্পের ভেরিয়েবলগুলি এসকিউএল * প্লাস কমান্ড বিকল্প বা অন্যান্য হার্ড-কোডেড পাঠ্যকে প্রতিস্থাপন করতে পারে):

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

এটি বাইন্ড (আরডিবিএমএসে কার্যকর করা এসকিউএল এবং পিএল / এসকিউএল বিবৃতিগুলির জন্য বাইন্ড ভেরিয়েবলগুলি স্টোর ডেটা মানগুলি; তারা একক মান বা সম্পূর্ণ ফলাফল সেট ধারণ করতে পারে):

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

এসকিউএল বিকাশকারী সাবস্টিটিউশন ভেরিয়েবলগুলিকে সমর্থন করে তবে আপনি যখন বাইন্ড :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
আমি এসকিউএল বিকাশকারী (4.1.1.19) এ বাঁধাই চেষ্টা করেছি এবং এটি খুব কার্যকর। আমি কেসটি প্রম্পট সহ var xএবং বলতে চাইছি exec :x
বেতলিস্টা

50

এসকিউএল * প্লাসে আপনি খুব অনুরূপ কিছু করতে পারেন

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

এসকিউএল বিকাশকারীতে, আপনি যদি এমন কোনও বিবৃতি চালান যা এমন কয়েকটি সংখ্যক বেইন্ড ভেরিয়েবল (কোলনের সাথে উপসর্গযুক্ত) থাকে তবে আপনাকে মানগুলি প্রবেশ করতে অনুরোধ করা হবে। অ্যালেক্স যেমন উল্লেখ করেছে, আপনি বিকল্প রান্নাঘর অ্যালেক্সের পরামর্শ অনুসারে "রান স্ক্রিপ্ট" ফাংশন (এফ 5) ব্যবহার করেও অনুরূপ কিছু করতে পারেন।

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(ওআরএ-01006) পছন্দ করছে বলে মনে হচ্ছে না , সুতরাং exec :v_emp_id := 1234;পরিবর্তে আপনার এটি করা দরকার ।
অ্যালেক্স পুল

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

1
@ নাথান আপনি যদি কোনও প্যাকেজ: v_emp_id এর সাথে সম্পাদন করতে চান তবে আপনি পুনঃসংশ্লিষ্টদের জন্য বাইন্ড ভেরিয়েবলগুলিও ব্যবহার করতে পারেন। আমার অনুরূপ প্রশ্নের উত্তরটি অ্যালেক্সের নীচের
অংশটি দেখুন

2
@ অ্যালেক্সপুল কোয়েরি ফলাফল উইন্ডোতে আউটপুট প্রেরণ করার উপায় আছে? আমার চাকরিতে আমি এক্সেল ফাইলগুলিতে রফতানি করার জন্য ক্যোয়ারী চালাই।
tp9

13

ঠিক আছে আমি এটিকে কিছুটা হ্যাক জানি তবে এটি কোনও সহজ স্কেরিতে কোনও ভেরিয়েবলটি ব্যবহার করার উপায়, কোনও স্ক্রিপ্ট নয়:

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

আপনি এটি সর্বত্র চালাতে পারেন।


নির্বাচনের পরিবর্তে আপডেটের সাথে এটি ব্যবহার করার কোনও উপায় আছে কি?
রন জেনসেন - আমরা সকলেই মোনিকা

12

সহজ উত্তর না।

তবে আপনি বাইন্ড ভেরিয়েবলগুলি ব্যবহার করে নিম্নলিখিত সংস্করণটি চালিয়ে অনুরূপ কিছু অর্জন করতে পারেন:

SELECT * FROM Employees WHERE EmployeeID = :EmpIDVar 

একবার আপনি এসকিউএল বিকাশকারী উপরের ক্যোয়ারী চালানোর পরে আপনাকে বাইন্ড ভেরিয়েবল কর্মচারীর মান লিখতে বলা হবে।


8

আপনি বিকল্পের পরিবর্তনশীলগুলিতে অন্য কোথাও পড়তে পারেন; তারা এসকিউএল বিকাশকারী বেশ কার্যকর। তবে এসকিউএল বিকাশকারীকে বাইন্ড ভেরিয়েবলগুলি ব্যবহার করার চেষ্টা করার মতো ফিট আমার আছে। এই আমি কি কি:

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 এটি এমন করে তোলে যাতে স্ক্রিপ্ট আউটপুট কনসোলে পাঠ্য মুদ্রণ করা যায়।

আমি বিশ্বাস করি যে আমরা এখানে যা করছি তাকে আনুষ্ঠানিকভাবে পিএল / এসকিউএল বলা হয়। আমরা খাঁটি এসকিউএল ল্যান্ড রেখেছি এবং ওরাকলে একটি আলাদা ইঞ্জিন ব্যবহার করছি। আপনি SELECTউপরের দেখতে পাচ্ছেন ? পিএল / এসকিউএল এ আপনাকে সর্বদা SELECT ... INTOহয় চলক বা একটি পরিশোধনকারী হতে হয়। আপনি কেবল SELECTএবং পিএল / এসকিউএল-এ ফলাফল সেট করতে পারবেন না ।


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 ধারা প্রত্যাশা করা হয়েছে"
থান্ডার ২

0

এটি চেষ্টা করবে এটি চেষ্টা করুন, এটি আরও ভাল একটি পদ্ধতি তৈরি করুন, যদি পদ্ধতি সম্ভব না হয় আপনি এই স্ক্রিপ্টটি ব্যবহার করতে পারেন।

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

0

বর্গ বিকাশকারী বিকাশকারী ডিফল্ট "চালু" দ্বারা বৈশিষ্ট্য সংজ্ঞায়িত করে। যদি এটি কোনও ক্ষেত্রে "বন্ধ" হয় তবে নীচের পদক্ষেপগুলি ব্যবহার করুন।

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

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