পিএল / এসকিউএল-এ আপডেটের দ্বারা প্রভাবিত সারির সংখ্যা


162

আমার একটি পিএল / এসকিউএল ফাংশন রয়েছে (ওরাকল 10 জি চলমান) যাতে আমি কয়েকটি সারি আপডেট করি। আপডেটের দ্বারা কতগুলি সারি প্রভাবিত হয়েছিল তা জানার কোনও উপায় আছে? ম্যানুয়ালি ক্যোয়ারির সম্পাদন করার সময় এটি আমাকে জানায় যে কতগুলি সারি প্রভাবিত হয়েছিল, আমি পিএল / এসকিউএলতে এই নম্বরটি পেতে চাই।

উত্তর:


245

আপনি sql%rowcountচলকটি ব্যবহার করুন ।

আপনাকে যে বিবৃতিটি দিয়ে আক্রান্ত সারি গণনাটি খুঁজে বের করতে হবে তার বিবরণীর পরে আপনাকে সরাসরি কল করতে হবে।

উদাহরণ স্বরূপ:

set serveroutput ON; 
DECLARE 
    i NUMBER; 
BEGIN 
    UPDATE employees 
    SET    status = 'fired' 
    WHERE  name LIKE '%Bloggs'; 
    i := SQL%rowcount; 
    --note that assignment has to precede COMMIT
    COMMIT; 
    dbms_output.Put_line(i); 
END; 

4
এবং অ্যাসাইনমেন্টটি কোনও সংঘের আগে থাকতে হবে
17-18 এ

@ ক্লাইভটি দিয়ে আমি একটি পদ্ধতি পেয়েছি INSERT INTO.. COMMITএবং sertোকানোর পরে একই পদ্ধতিতে আমার কাছে রয়েছে UPDATE SET WHERE EXISTS..COMMIT, তবে আমার i := SQL%rowcount;কেবল আপডেট হওয়া সারিগুলির পরিবর্তে সমস্ত সারি ফিরিয়ে দিচ্ছি । কি হতে পারে?
গিলহার্ম ম্যাথিউস

26

যারা একটি সরল কমান্ড থেকে ফলাফল চান তাদের জন্য সমাধানটি হতে পারে:

begin
  DBMS_OUTPUT.PUT_LINE(TO_Char(SQL%ROWCOUNT)||' rows affected.');
end;

মূল সমস্যাটি হ'ল এসকিউএল% ROWCOUNT একটি পিএল / এসকিউএল ভেরিয়েবল (বা ফাংশন), এবং কোনও এসকিউএল আদেশ থেকে সরাসরি অ্যাক্সেস করা যায় না। ননাম পিএল / এসকিউএল ব্লক ব্যবহার করে এটি অর্জন করা যায়।

... কারও কাছে যদি এটি একটি নির্বাচন কমান্ডে ব্যবহার করার সমাধান থাকে তবে আমি আগ্রহী।


6

বিকল্পভাবে, SQL%ROWCOUNT আপনি কোনও ভেরিয়েবল ঘোষণার প্রয়োজন ছাড়াই পদ্ধতিতে এটি ব্যবহার করতে পারেন


4
আপনি করতে হবে - এসকিউএল% ROWCOUNT একটি ফাংশন, আপনি শুধু নয় "এটি ব্যবহার" করতে পারেন না এটা দিয়ে কিছু - কিনা একটি পরিবর্তনশীল মধ্যে সংরক্ষণকারী, বা অন্য পদ্ধতির ইনপুট হিসাবে এটি পাঠানোর, নাকি অন্য কিছু সাথে যোগ করে।
জেফ্রি কেম্প

8
আমি মনে করি যে আলী এইচ এর বক্তব্যটি আপনার সারি গণনা প্রভাবিত করবে এমন আরও একটি এসকিউএল বিবৃতি না পাওয়া পর্যন্ত এটি কোনও ভেরিয়েবলের কাছে নির্ধারণ করা প্রয়োজন হবে না। এটি বলা হচ্ছে, আমি সম্মত হই যে এটির পরে কোনও বাগের কারণ এড়াতে কোনও পরিবর্তনশীলকে বরাদ্দ করা উচিত, যদি কেউ এটির ডাকার আগে অন্য কোনও এসকিউএল বিবৃতি যোগ করে। আর, আলী H থেকে এই উত্তর ক্লাইভের উত্তর একটি মন্তব্যে আলাদা উত্তর হিসাবে পোস্ট বদলে হওয়া উচিত
কারবি

1

SQL%ROWCOUNTবরাদ্দ না করেও ব্যবহার করা যেতে পারে (কমপক্ষে ওরাকল 11 জি থেকে )।

যতক্ষণ না বর্তমান ব্লকের মধ্যে কোনও অপারেশন (আপডেট, মোছা বা সন্নিবেশ) সম্পাদিত হয় না, SQL%ROWCOUNTতা বাতিল হয়ে যায়। তারপরে এটি সর্বশেষ ডিএমএল অপারেশন দ্বারা প্রভাবিত লাইনের সংখ্যার সাথে থাকে:

আমাদের টেবিল ক্লায়েন্ট আছে বলে

create table client (
  val_cli integer
 ,status varchar2(10)
)
/

আমরা এটি এইভাবে পরীক্ষা করব:

begin
  dbms_output.put_line('Value when entering the block:'||sql%rowcount);

  insert into client 
            select 1, 'void' from dual
  union all select 4, 'void' from dual
  union all select 1, 'void' from dual
  union all select 6, 'void' from dual
  union all select 10, 'void' from dual;  
  dbms_output.put_line('Number of lines affected by previous DML operation:'||sql%rowcount);

  for val in 1..10
    loop
      update client set status = 'updated' where val_cli = val;
      if sql%rowcount = 0 then
        dbms_output.put_line('no client with '||val||' val_cli.');
      elsif sql%rowcount = 1 then
        dbms_output.put_line(sql%rowcount||' client updated for '||val);
      else -- >1
        dbms_output.put_line(sql%rowcount||' clients updated for '||val);
      end if;
  end loop;  
end;

ফলাফল এতে:

Value when entering the block:
Number of lines affected by previous DML operation:5
2 clients updated for 1
no client with 2 val_cli.
no client with 3 val_cli.
1 client updated for 4
no client with 5 val_cli.
1 client updated for 6
no client with 7 val_cli.
no client with 8 val_cli.
no client with 9 val_cli.
1 client updated for 10

-1

দয়া করে এটি চেষ্টা করুন ..


create table client (
  val_cli integer
 ,status varchar2(10)
);

---------------------
begin
insert into client
select 1, 'void' from dual
union all
select 4, 'void' from dual
union all
select 1, 'void' from dual
union all
select 6, 'void' from dual
union all
select 10, 'void' from dual;
end;

---------------------
select * from client;

---------------------
declare
  counter integer := 0;
begin
  for val in 1..10
    loop
      update client set status = 'updated' where val_cli = val;
      if sql%rowcount = 0 then
        dbms_output.put_line('no client with '||val||' val_cli.');
      else
        dbms_output.put_line(sql%rowcount||' client updated for '||val);
        counter := counter + sql%rowcount;
      end if;
  end loop;
   dbms_output.put_line('Number of total lines affected update operation: '||counter);
end;

---------------------
select * from client;

--------------------------------------------------------

ফলাফল নীচের মত হবে:


2 টি ক্লায়েন্ট
2 ভাল_সিলি সহ কোনও ক্লায়েন্টের জন্য আপডেট করা হয়নি।
3 Val_cli সহ কোনও ক্লায়েন্ট নেই।
1 টি ক্লায়েন্ট
5 টি Val_cli সহ কোনও ক্লায়েন্টের জন্য আপডেট হয়েছে ।
1 টি ক্লায়েন্ট
7 টি ভাল_ক্লিয়ার সহ 6 টি ক্লায়েন্টের জন্য আপডেট হয়েছে ।
8 Val_cli সহ কোনও ক্লায়েন্ট নেই।
9 Val_cli সাথে কোনও ক্লায়েন্ট নেই।
10 টির জন্য 1 টি ক্লায়েন্ট আপডেট হয়েছে
মোট লাইনগুলির সংখ্যার আপডেট আপডেট অপারেশন: 5



আপনার সমাধানে মন্তব্য যুক্ত করুন, দয়া করে নির্দিষ্ট করুন।
কুমার অভিষেক

-3

গণনা (*) বিশ্লেষণমূলক ফাংশন ব্যবহার করুন নাল দ্বারা ওভার পার্টিশন এটি সারির মোট # টি গণনা করবে


আপডেট স্টেটমেন্ট চালানোর পরে যদি আপনি আসলে কী আপডেট করেছেন তার গণনা পরীক্ষা করে দেখুন - এটি কোনও জেনেরিক সমাধান দেয় না। উদাহরণস্বরূপ, যদি আমার টেবিল টিতে একটি কলাম সি 1 থাকে যা "1" সকলের জন্য মূল্য হিসাবে থাকে এবং এখন আমি সেই কলামটির সমস্ত সারি "2" এ আপডেট করি তবে নাল সাহায্যে পার্টিশনটি কীভাবে হবে?
ন্যানোসফট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.