আমি কি এসকিউএল-এ প্রথম কার্যকর করা ফাংশনগুলির উপর নির্ভর করতে পারি?


9

নিম্নলিখিত স্ক্রিপ্ট বিবেচনা করুন:

create or replace function f(p_limit in integer) return integer as
begin
  set_global_context ('limit', p_limit);
  return p_limit;
end;
/

create view v as 
select level as val from dual connect by level<=sys_context('global_context','limit');

select f(2), v.* from v;

/*
F(2)                   VAL                    
---------------------- ---------------------- 
2                      1                      
2                      2                      
*/

select f(4), v.* from v;

/*
F(4)                   VAL                    
---------------------- ---------------------- 
4                      1                      
4                      2                      
4                      3                      
4                      4                      
*/

f(x)10.2.2-তে চালিত এই পরীক্ষার ক্ষেত্রে যেমনটি হয়েছে তেমনি প্রসঙ্গে দেখার অভ্যন্তরটি পড়ার আগেই আমি মৃত্যুদণ্ড কার্যকর করার উপর নির্ভর করতে পারি ?


সাহায্য করতে পারে না তবে ভাবেন যে কোনও লগইন ট্রিগার আরও উপযুক্ত হতে পারে (যদি স্তরটি সর্বদা একই থাকে, তবে)
ফিলি

@ ফিল এটি একটি উদাহরণ - আমি একটি ভিউ প্যারামিটারাইজ করতে sys_context ব্যবহার করছি এবং প্রতিটি সময়ই পরম আলাদা হবে। আপনি যদি এসকিউএল থেকে বিশ্বব্যাপী প্রসঙ্গ সেট করার কোনও উপায় সম্পর্কে জানেন তবে এই জাতীয় গোলযোগ না ঘটাতে আমিও শুনতে আগ্রহী!
জ্যাক বলছেন topanswers.xyz

1
@ জ্যাকডুগ্লাস: একটি দৃষ্টিভঙ্গি প্যারামিটারাইজ করা একটি ধারণা যা আমার কাছে সঠিক মনে হয় না। এমএসএসকিউএল-এর আওতায় আপনি যা করার চেষ্টা করছেন তা কোনও ব্যবহারকারী সংজ্ঞায়িত ফাংশন ব্যবহার করে সম্পন্ন করা যেতে পারে যা ফলসেট (কোনও মানের চেয়ে) ফেরত দেয় - আপনি তখন SELECT stuff FROM dbo.FuncReturningTable(param)বা অনুরূপ করতে পারেন । ওরাকল সম্ভবত সমতুল্য কার্যকারিতা রয়েছে। যদিও এটি যদি বৃহত ডেটা সেট ব্যবহার করে তবে আমি কার্যকারিতা নিরীক্ষণে সতর্ক থাকব: আমি নিশ্চিত নই যে এই জাতীয় বাক্য গঠন থেকে দক্ষ পরিকল্পনার জন্য ক্যোয়ারির পরিকল্পনাকারীর কতটা উজ্জ্বলতা প্রয়োজন।
ডেভিড স্পিলিট

@ ডেভিড প্যারামেটেরাইজিংয়ে সাধারণত সিস_ কনটেক্সট দিয়ে কাজ করা হয় - সাধারণত আপনি ক্যোয়ারি চালানোর আগে প্রসঙ্গটি নির্ধারণ করবেন (যেমন পিএল / এসকিউএল এর বিট সহ)) ওরাকলে সেট-রিটার্নিং এবং / বা পাইপলাইনযুক্ত ফাংশন রয়েছে তবে তারা এটি অর্জনের 'সাধারণ' উপায় নয়। স্পষ্টতই, আমি মনে করি শিরোনামে প্রশ্নের উত্তরটি "না" - আমি আরও অবাক হয়েছি যে কেউ আরও ভাল জানেন কিনা।
জ্যাক বলছেন topanswers.xyz

উত্তর:


8

না।

আপনি যদি নিজের দৃষ্টিভঙ্গিটি যেখানে প্রবন্ধের বিপরীতে (সংযোগের পরিবর্তে) প্রসঙ্গে ফিল্টারিং দিয়ে আবার লিখেন, আপনি প্রসঙ্গটির জন্য পূর্ব নির্ধারিত মান পাবেন:

create table t as 
 select rownum r from dual connect by level <= 10;

create or replace view v as 
  select r val from t where r <=sys_context('global_context','limit');

select f(2), v.* from v;

F(2) VAL
---- ---
   2   1 
   2   2 

select f(4), v.* from v;

F(4) VAL
---- ---
   4   1 
   4   2 

select f(4), v.* from v;

F(4) VAL
---- ---
   4   1 
   4   2 
   4   3 
   4   4 

কলামগুলি নির্বাচন করার আগে যেখানে ক্লজটি মূল্যায়ন করা হয়, প্রসঙ্গে পড়ার পরে ফাংশনে পাস করা মান সেট করা হয় না। আপনার ক্যোয়ারীতে sys_context কলের অবস্থান (নির্বাচন করুন, যেখানে, দ্বারা দলবদ্ধ, ইত্যাদি) এই মানটি সেট করার সময় ঠিক প্রভাবিত করবে।


ধন্যবাদ +1 আমার বইতে এটি বেশ "কেস ক্লোজড", ধন্যবাদ।
জ্যাক বলছেন topanswers.xyz

2

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

যদি ক্যোয়ার পরিকল্পনাকারী ফাংশনের পার্শ্ব-প্রতিক্রিয়া দ্বারা দৃশ্যটি প্রভাবিত করে তা সনাক্ত করার জন্য যদি তেমন উজ্জ্বল হয়ে থাকে তবে আপনি যদি অন্য কোনও ভিউতে যোগদান করেন যা বিভিন্ন ইনপুট মানগুলির সাথে এই ফাংশনটিকে সম্ভাব্য বলে অভিহিত করেন তবে তা কী করবে? এটি বেশ দ্রুত খুব লোমশ হয়ে উঠতে পারে - এই ধরণের জিনিসটি সাধারণত কোনও প্রোগ্রামিং প্রসঙ্গে, ফাংশনগুলির নিজস্ব আউটপুটের বাইরে প্রভাব থাকতে হবে না।

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


2
ভাল উত্তর, তবে আমি মনে করি যে জ্যাক একটি নির্দিষ্ট প্রযুক্তিগত ওরাকল উত্তর খুঁজছেন।
ফিলি

1

ডকুমেন্টেশনটি কেবলমাত্র প্রতিশ্রুতি দেয় যে "অপ্টিমাইজার প্রথমে যথাসম্ভব সম্পূর্ণরূপে উপস্থিত থাকা এবং প্রকাশের শর্তগুলির মূল্যায়ন করে।" ( 10.2 , 11.2 ) আপনার গ্যারান্টিযুক্ত নয় যে এটি প্রথমে কোনও নির্দিষ্ট এক্সপ্রেশনকে মূল্যায়ন করবে, বা এটি সময়ে সময়ে এই ক্রমটি পরিবর্তন করবে না (একই প্রকাশের মধ্যে একটি নতুন প্যাচলেভেল?)।


+1 দুর্দান্ত, ধন্যবাদ (যদিও এই দস্তাবেজগুলি পড়ার জন্য ক্রিসের উত্তরটি যথেষ্ট বর্গাকার নয় )
জ্যাক বলছেন টপান্সওয়ার্স.অক্সিজ

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

@ ক্রিস কি সেই কথা বলার অভিজ্ঞতা নাকি আপনি ডক্স থেকে কোথাও পেয়েছেন?
জ্যাক বলছেন topanswers.xyz

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