আমি কীভাবে ওরাকল এসকিউএল এর বিএলএলওব থেকে পাঠ্য সামগ্রী পেতে পারি


112

আমি একটি এসকিউএল কনসোল থেকে দেখার চেষ্টা করছি যে ওরাকল ব্লগের ভিতরে কী রয়েছে।

আমি জানি এটিতে কিছুটা বড় আকারের পাঠ্য রয়েছে এবং আমি কেবল পাঠটি দেখতে চাই, তবে নিম্নলিখিত কোয়েরিতে কেবলমাত্র সেই ক্ষেত্রটিতে একটি বিএলওবি রয়েছে তা বোঝায়:

select BLOB_FIELD from TABLE_WITH_BLOB where ID = '<row id>';

আমি যে ফলাফল পাচ্ছি তা আমার প্রত্যাশার মতো নয়:

    BLOB_FIELD
    -----------------------
    oracle.sql.BLOB@1c4ada9

সুতরাং আমি কী ধরণের যাদু জাগ্রত করে বিএলএবকে পাঠ্য উপস্থাপনে পরিণত করতে পারি?

পিএস: আমি কেবল এসকিউএল কনসোল (এক্লিপস ডেটা সরঞ্জামসমূহ) থেকে বিএলএলওবের বিষয়বস্তুটি কোডে ব্যবহার না করে দেখার চেষ্টা করছি।

উত্তর:


141

প্রথমত, আপনি বিএলএবির পরিবর্তে সিএলওবি / এনসিএলওবি কলামগুলিতে পাঠ্য সংরক্ষণ করতে চাইতে পারেন, যা বাইনারি ডেটার জন্য ডিজাইন করা হয়েছে (আপনার ক্যোয়ারী একটি সিএলওবি দিয়ে কাজ করবে)।

নীচের ক্যোয়ারীটি আপনাকে প্রথমে 32767 টি অক্ষর (সর্বাধিক) ব্লকের অভ্যন্তরে পাঠ্যটি দেখতে দেবে, প্রদত্ত সমস্ত অক্ষর সেট সামঞ্জস্যপূর্ণ রয়েছে (বিএলএবিবিতে সঞ্চিত পাঠ্যের মূল সিএস, ভিআচআরএআর 2 এর জন্য ব্যবহৃত ডাটাবেসের সিএস):

select utl_raw.cast_to_varchar2(dbms_lob.substr(BLOB_FIELD)) from TABLE_WITH_BLOB where ID = '<row id>';

3
দুর্ভাগ্যক্রমে, আমি ডেটাবেস স্কিমাটি নিয়ন্ত্রণ করি না - আমার কেবল স্রোতে উঁকি দেওয়া দরকার ... তবে যাইহোক ধন্যবাদ।
রোল্যান্ড টেপ

থ্যাঙ্কস ম্যাক, এটি ভাল কাজ করে --- তবে সেই "dbms_lob.substr" এর উদ্দেশ্য কী? --- কেবলমাত্র "utl_raw.cast_to_varchar2 (BLOB_FIELD) নির্বাচন করুন ..." ব্যবহার করে আমাকে একই ফলাফল দেওয়া হবে বলে মনে হচ্ছে ...?
রুপ করুন

4
কাস্ট_টো_ভারচার 2 ইনপুটগুলিতে একটি RAW নেয় ( ডকস.অরাকল.com / cd / E11882_01 / appdev.112 / e25788/… ), যা দৈর্ঘ্যে 32767 বাইটের মধ্যে সীমাবদ্ধ ( ডকস.ওরকল / সিডি / E11882_01/appdev.112/e10472 /… )। একটি বিএলওবি-র আকারের কোনও সীমাবদ্ধতা নেই, সুতরাং সাবস্ট্রাস্ট এটিকে সঠিক আকারে ছাঁটাই করে ( ডকস.ওরাকল . com / cd / E11882_01 / appdev.112 / e25788/… ) প্রয়োজনে।
ম্যাক

34
আমার পক্ষে কাজ করে না - আমি "ORA-06502: PL / SQL: সংখ্যাসূচক বা মান ত্রুটি: কাঁচা ভেরিয়েবলের দৈর্ঘ্য খুব দীর্ঘ" পাই। আমি 2000 টি পর্যন্ত চর পেতে BLOB_FIELD এর পরে "2000,1" রাখতে পারি, তবে এর বাইরে আর কিছু না।
চিহ্নিত করুন

2
মানটি 4000 এর চেয়ে বেশি হলে এটি ত্রুটি ছুঁড়ে দেবে যেহেতু এটি বর্ধিত স্ক্রোলের সর্বাধিক মান। আপনাকে সাবস্ট্রাস্ট যুক্ত করতে হবে (BLOB_FIELD, 4000, 1)। আপনার যদি আর ক্ষেত্রের সমর্থন প্রয়োজন হয় তবে পিএল / এসকিউএল ব্যবহার করুন (আমি বিশ্বাস করি 32000 অবধি)
সোনিক সোল

14

আপনি টেবিল থেকে ব্লব ক্ষেত্রগুলি পড়তে নীচে এসকিউএল ব্যবহার করতে পারেন।

SELECT DBMS_LOB.SUBSTR(BLOB_FIELD_NAME) FROM TABLE_NAME;

আমার বিএলওবি কলাম রয়েছে এবং যেখানে এক্সএমএল ডেটা সংকুচিত হয়ে টেবিলে সংরক্ষণ করা হয়েছে, যখন আমি তথ্যটি পড়ি তখন এটি কেবল কয়েকটি নম্বর দেখায় এবং প্রকৃত এক্সএমএল পাঠ্য হয় না, টেবিল থেকে এক্সএমএল পাঠ্য ডেটা পড়তে আমার কী করা উচিত।
ভুবনেশ মোহনকুমার

14

এসকিউএল বিকাশকারীও এই কার্যকারিতা সরবরাহ করে:

ফলাফল গ্রিড কক্ষে ডাবল ক্লিক করুন এবং সম্পাদনা ক্লিক করুন:

এখানে চিত্র বর্ণনা লিখুন

তারপরে পপ আপের উপরের ডানদিকে, "পাঠ্য হিসাবে দেখুন" (আপনি চিত্রগুলিও দেখতে পারেন ..)

এখানে চিত্র বর্ণনা লিখুন

এবং এটাই!

এখানে চিত্র বর্ণনা লিখুন


এটি একটি দুর্দান্ত টিপ - ধন্যবাদ!
এড গ্রাহাম

7

আপনি যদি পাঠ্যের ভিতরে না গিয়ে পাঠ্যের ভিতরে অনুসন্ধান করতে চান তবে এটি কাজ করে:

with unzipped_text as (
  select
    my_id
    ,utl_compress.lz_uncompress(my_compressed_blob) as my_blob
  from my_table
  where my_id='MY_ID'
)
select * from unzipped_text
where dbms_lob.instr(my_blob, utl_raw.cast_to_raw('MY_SEARCH_STRING'))>0;

এখানে আমার_আইডি কি?
অঞ্জনব

এটি আমার পক্ষে কাজ করছে না, আমার কাছে বিএলওবি কলাম রয়েছে এবং যেখানে এক্সএমএল ডেটা সংকুচিত হয়ে টেবিলে সংরক্ষণ করা হয়, যখন আমি ডেটা পড়ি তখন এটি কেবল কয়েকটি নম্বর দেখায় এবং প্রকৃত এক্সএমএল পাঠ্য হয় না, এক্সএমএল পাঠটি পড়তে আমার কী করা উচিত? টেবিল থেকে তথ্য।
ভুবনেশ মোহনকুমার

3

বার্নের উত্তরটি আমার পক্ষে পরিবর্তন নিয়ে কাজ করেছে কারণ আমার কলামটি সংকুচিত হয়নি। দ্রুত এবং নোংরা সমাধান:

select * from my_table
where dbms_lob.instr(my_UNcompressed_blob, utl_raw.cast_to_raw('MY_SEARCH_STRING'))>0;

3

আমি কিছু সময়ের জন্য এটির সাথে লড়াই করেছি এবং পিএল / এসকিউএল সমাধানটি বাস্তবায়ন করেছি, তবে পরে বুঝতে পেরেছি যে টোডে আপনি কেবল ফলাফল গ্রিড সেলটিতে ডাবল ক্লিক করতে পারেন এবং এটি পাঠ্যের বিষয়বস্তু সহ একটি সম্পাদক এনেছে। (আমি টড ভি 11 এ আছি)

এখানে চিত্র বর্ণনা লিখুন


1

ডিফল্ট অ্যালগরিদম ব্যবহার করে যদি আপনার পাঠ্যটি ফোঁটের অভ্যন্তরে সংকুচিত হয় এবং এটি বেশ বড় হয় তবে আপনি এটি পড়তে এই ফাংশনটি ব্যবহার করতে পারেন

CREATE OR REPLACE PACKAGE read_gzipped_entity_package AS

FUNCTION read_entity(entity_id IN VARCHAR2)
  RETURN VARCHAR2;

END read_gzipped_entity_package;
/

CREATE OR REPLACE PACKAGE BODY read_gzipped_entity_package IS

FUNCTION read_entity(entity_id IN VARCHAR2) RETURN VARCHAR2
IS
    l_blob              BLOB;
    l_blob_length       NUMBER;
    l_amount            BINARY_INTEGER := 10000; -- must be <= ~32765.
    l_offset            INTEGER := 1;
    l_buffer            RAW(20000);
    l_text_buffer       VARCHAR2(32767);
BEGIN
    -- Get uncompressed BLOB
    SELECT UTL_COMPRESS.LZ_UNCOMPRESS(COMPRESSED_BLOB_COLUMN_NAME)
    INTO   l_blob
    FROM   TABLE_NAME
    WHERE  ID = entity_id;

    -- Figure out how long the BLOB is.
    l_blob_length := DBMS_LOB.GETLENGTH(l_blob);

    -- We'll loop through the BLOB as many times as necessary to
    -- get all its data.
    FOR i IN 1..CEIL(l_blob_length/l_amount) LOOP

        -- Read in the given chunk of the BLOB.
        DBMS_LOB.READ(l_blob
        ,             l_amount
        ,             l_offset
        ,             l_buffer);

        -- The DBMS_LOB.READ procedure dictates that its output be RAW.
        -- This next procedure converts that RAW data to character data.
        l_text_buffer := UTL_RAW.CAST_TO_VARCHAR2(l_buffer);

        -- For the next iteration through the BLOB, bump up your offset
        -- location (i.e., where you start reading from).
        l_offset := l_offset + l_amount;
    END LOOP;
    RETURN l_text_buffer;
EXCEPTION
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('!ERROR: ' || SUBSTR(SQLERRM,1,247));
END;

END read_gzipped_entity_package;
/

তারপরে টেক্সট পেতে সিলেক্ট করুন

SELECT read_gzipped_entity_package.read_entity('entity_id') FROM DUAL;

আশা করি এটি কারও সাহায্য করবে।


1

বিএলএবির প্রথম 2000 টি অক্ষর পেতে এই এসকিউএল ব্যবহার করুন।

SELECT utl_raw.cast_to_varchar2(dbms_lob.substr(<YOUR_BLOB_FIELD>,2000,1)) FROM <YOUR_TABLE>;

দ্রষ্টব্য: এটি কারণ, ওরাকল 2000 এর চেয়ে বেশি বিএলওবি রূপান্তর পরিচালনা করতে সক্ষম হবে না।


0

আপনি এটি চেষ্টা করতে পারেন:

SELECT TO_CHAR(dbms_lob.substr(BLOB_FIELD, 3900)) FROM TABLE_WITH_BLOB;

তবে এটি 4000 বাইটের মধ্যে সীমাবদ্ধ থাকবে


-2

আমার জন্য কাজ করেছেন,

লাস ((সন্নিবেশ (সন্নিবেশ (সন্নিবেশ (হেক্স (বিএলবি_এফআইএলডি), 9,0, '-'), 14,0, '-'), 19,0, '-'), 24,0, '- নির্বাচন করুন '))) TABLE_WITH_BLOB থেকে FIELD_ID হিসাবে যেখানে ID =' সারি আইডি ';


যদি এটি আপনার পক্ষে কাজ করে তবে আপনি ওরাকল ব্যবহার করছেন না, যা ওপি এবং সে কারণেই উত্তরগুলি বৈধ ওরাকল সিনট্যাক্স হওয়া দরকার।
এপিসি

-4

TO_CHARফাংশন ব্যবহার করুন ।

select TO_CHAR(BLOB_FIELD) from TABLE_WITH_BLOB where ID = '<row id>'

পরিবর্তিত NCHAR, NVARCHAR2, CLOB, অথবা NCLOBডাটাবেসের অক্ষর সেট ডেটা। প্রত্যাবর্তিত মান সর্বদা VARCHAR2


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