2009-04-22 5 views
7

में शिफ्ट ऑपरेटर पीएल/एसक्यूएल में shift ऑपरेटरों का कोई विकल्प है या नहीं? bitand फ़ंक्शन है, लेकिन यह केवल binary_integer-प्रकार तर्कों को स्वीकार करता है।पीएल/एसक्यूएल

मुझे क्या करना चाहिए यदि मुझे वास्तव में लंबी संख्या (शायद लाइन में सेट) की निचली/उच्च बिट की जांच की आवश्यकता है?

C में << और >> ऑपरेटर हैं। पीएल/एसक्यूएल में मैं उन्हें कैसे महसूस कर सकता हूं?

उत्तर

3

यहां मेरा अपना एलपीएडी/आरपीएडी समाधान है।

मैं आधार के रूप में Tom Kyte package लेता हूं और इसे विस्तारित करता हूं।

create or replace function bin_shift_right 
( p_bin in varchar2, 
    p_shift in number default null) return varchar2 
is 
    l_len number; 
    l_shift number; 
begin 
    l_shift := nvl(p_shift, 1); 
    l_len := length(p_bin); 
    if (l_len <= 0) then 
     return null; 
    end if; 
    if (l_shift > l_len) then 
     l_shift := l_len; 
    end if; 

    return lpad(substr(p_bin, 1, l_len - l_shift), l_len, '0'); 
end bin_shift_right; 

create or replace function shright 
( p_num in number, 
    p_shift in number default null) return number 
is 
begin 
    if (trunc(p_num) <> p_num OR p_num < 0) then 
     raise PROGRAM_ERROR; 
    end if; 
    return nvl(to_dec(bin_shift_right(to_bin(p_num), p_shift), 2), 0); 
end shright; 
/

और परीक्षण

SQL> 
SQL> select shright(123) from dual; 

SHRIGHT(123) 
------------ 
      61 

SQL> 
SQL> select shright(123, 2) from dual; 

SHRIGHT(123,2) 
-------------- 
      30 

SQL> 
SQL> select shright(123, 10) from dual; 

SHRIGHT(123,10) 
--------------- 


SQL>/
5

ओरेकल संस्करण 8 के बाद से यह संभव है कि आप डेटाबेस में जावा कोड का उपयोग करें। पीएल/एसक्यूएल में आप जावा कोड के लिए एक रैपर परिभाषित कर सकते हैं। जैसे

PACKAGE BODY JAVA_CODE 
IS 
    function bitshift_left(x in number, 
         n in number) return number 
    is language java name 'com.foo.Bitshift(java.lang.Integer, 
              java.lang.Integer) return java.lang.Integer'; 
END JAVA_CODE; 

जावा कोड में आप शिफ्ट ऑपरेटर का उपयोग कर सकते हैं। हालांकि थोड़ा बेकार है, लेकिन यह इस तरह से काम कर सकते हैं।

अफसोस की बात है, ओरेकल एक्सई के साथ यह संभव नहीं है, क्योंकि उस 'मुक्त' संस्करण में जावा के लिए कोई समर्थन नहीं है।

+0

अच्छा समाधान, धन्यवाद। मुझे पीएल/एसक्यूएल रास्ता मिल गया है, कि मैं कुछ मिनटों के भीतर पोस्ट करूंगा – drnk

6

निम्नलिखित जवाब नास्तिक endianness नहीं है और मेरे शब्दों थोड़ा endian प्रारूप पर आधारित है ...

आप बदल सकते हैं बिट्स बस (पाली गुणा बाएं) या विभाजित (दाएं दाएं) एक्स द्वारा 2 की शक्ति के लिए तर्क जहां x शिफ्ट करने के लिए बिट्स की संख्या है। उदाहरण के लिए, अगर मैं एक नंबर (255: 11111111) के कम आदेश बाइट बदलाव करने की जरूरत है बाईं मैं निम्नलिखित कार्रवाई करने के लिए होगा 16 बिट:

select 255 * power(2,16) from dual; 
-- the result will be (16711680:111111110000000000000000) 

इसके विपरीत, अगर मैं मूल्य शिफ्ट करना चाहते 16,711,680 दाईं ओर 16 बिट्स मैं निम्नलिखित कार्य करता हूं:

select 16711680/power(2,16) from dual; 
-- the result will be (255:11111111) 
संबंधित मुद्दे