คิดว่าหลายๆ คน คงเคยเจอปัญหา select ข้อมูล view บน ebs แล้วไม่พบข้อมูล no data กันมาแล้วแน่ๆ  ซึ่งตัว view หลายๆ ตัวบน ebs นั้น บางส่วนมีการ protect ข้อมูลเอาไว้สำหรับ user บน application เท่านั้นที่จะ access ได้  หรือบางส่วนก็มีการ protect ข้อมูลในส่วนของภาษาไว้ เช่น ข้อมูลชุดนี้ให้เห็นสำหรับประเทศนี้ ดังเช่น พวกข้อมูลเกี่ยวกับภาษี ที่แต่ละประเทศก็จะมีข้อมูลแตกต่างกัน เป็นต้น

  ซึ่งวันนี้จะแนะนำวิธีในการเข้าถึงข้อมูลดังกล่าว ทำยังไงให้ select ข้อมูลจาก view เหล่านั้นได้

วิธีที่ 1  จากในรูปลอง select ข้อมูลจาก view ดังกล่าว แต่ไม่พบข้อมูล



ให้รันสคริปตามในกรอบสีแดง  แล้วลอง select อีกครั้งจะได้ข้อมูลใน view ทันที

declare
  v_user_id number;
  v_resp_id number;
  v_appl_id number;
begin

mo_global.set_policy_context('S', 81);

select fnd.user_id , fresp.responsibility_id, fresp.application_id
    into v_user_id, v_resp_id, v_appl_id
from fnd_user fnd , fnd_responsibility_tl fresp
where fnd.user_name = 'SYSADMIN'
and fresp.responsibility_name = 'Receivables Manager';

fnd_global.apps_initialize(v_user_id, v_resp_id, v_appl_id); 
end;




เกี่ยวกับ mo_global.set_policy_context และ fnd_global.app_initialize หลักการคือรันคำสั่งเหล่านี้เพื่อให้ session ของเราเสมือนว่า log in เข้าใช้งานผ่านหน้าจอ application เพื่อจะสามารถ access data ได้นั่นเอง


วิธีที่ 2   หากลองวิธีแรกแล้วยังไม่ได้ผล อาจะเป็นเรื่องของ NLS_LANG ซึ่ง view บางตัวมีการกำหนดเรื่องของการเข้าถึงแต่ Region Setting เอาไว้ด้วย  

ตัวอย่าง  select ข้อมูลจาก view นี้แล้วไม่พบข้อมูล

select * from fa_additions;

เข้าไปดู SQL ของ view นี้ พบว่ามีเงื่อนไข T.LANGUAGE = userenv(‘LANG’)



ซึ่งค่าใน Field LANGUAGE นั้นมีแต่แค่ “US” เท่านั้น




ลอง Select ค่า userenv(‘LANG’) ได้ค่า TH   นั่นคือสาเหตุว่าทำไม select แล้ว no data
เพราะเงื่อนไข TH <> US




ให้รันคำสั่ง dbms_session.set_nls ตามในรูป  ค่าของ userenv(‘LANG’) ก็จะถูกกำหนดตามที่เราต้องการ  


ลอง select ข้อมูลอีกครั้ง ก็จะได้ข้อมูลขึ้นมาแล้ว






https://docs.oracle.com/cd/E18727_01/doc.121/e12897/T302934T462356.htm



edit @ 2 Jun 2017 13:59:24 by Lookpranoi

Comment

Comment:

Tweet