create query Oracle บน access
กระทู้เก่าบอร์ด อ.Yeadram

 3,456   10
URL.หัวข้อ / URL
create query Oracle บน access

ผมใช้ access เป็น front-end และใช้ Oracle เป็น back-end
ผมเพิ่งเคยใช้ครับ Oracle ก่อนหน้าใช้แต่ Sql server

ผมใช้ create queryDef ครับ

Set dbs = CurrentDb
strSQL = "SELECT * " & _
"FROM TABLE_USER.TBL_A LEFT JOIN TABLE_USER.TBL_B ON (TBL_A.ORDER_ID = TBL_B.ORDER_ID) " & _
"AND (TBL_A.MATERIAL = TBL_B.MATERIAL);"

Set qdf = dbs.CreateQueryDef("Qu_TBL_AB", strSQL)
qdf.connect = "ODBC;DSN=SERVER1;UID=USER1;PWD=PWD1;SERVER=SERVER1"

    ' Log on to server and run query.
    qdf.ODBCTimeout = 60 '
    Set rst = qdf.OpenRecordset()
    ' Perform operations with recordset.
    
    rst.Close
    Set dbs = Nothing

ผลลัพธ์ที่ได้ครับ
SELECT *
FROM [TABLE_USER].TBL_A LEFT JOIN [TABLE_USER].TBL_B ON (TBL_A.ORDER_ID = TBL_B.ORDER_ID)
AND (TBL_A.MATERIAL= TBL_B.MATERIAL);

จะ error ODBC-call failed.
ORA-00903:invalid table name (#903)

Access จะใส่เครื่องหมาย [TABLE_USER].ให้ทุกครั้งครับถ้ามีการ left join แต่ถ้าเป็น Table เดียว เราจะปิด [TABLE_USER.TBL_A LEFT] ผลที่ออกมามันจะเอาเครื่องหมาย [] ออกให้ไม่มีปัญหาอะไร
ผมลองหลายอย่าง ทั้งให้เป็น [TABLE_USER.TBL_A] t1 หรือ TABLE_USER.TBL_A t1

ผมขอความรู้ทางด้านนี้ด้วยครับ จะต้องเขียนอย่างไร

10 Reply in this Topic. Dispaly 1 pages and you are on page number 1

1 @R19158
ทำไมต้องป้อน TABLE_USER ด้วยครับ
2 @R19159
สวัสดีครับคุณสันติสุข
ผมไม่เข้าใจเกี่ยวกับ Oracle เหมือนกันครับ เปรียบเทียบถ้าเป็น SQL server ก็จะมี dbo.table แต่เวลาเขียนผมก็จะตัด dbo. ออกไปเหลือแต่ table รัน query ก็ไม่มีปัญหาอะไร
แต่กับ Oracle ผมลองทุกรูปแบบครับเคยตัด TABLE_USER. ออกแต่ก็จะติด error ODBC-call failed.
ORA-00942:table or view does not exist(#942):

3 @R19160
- ยูซเซอร์ USER1 มีสิทธิ์เห็นหรือใช้เทเบิลต่างๆของ TABLE_USER schema หรือไม่
- เพิ่มยูซเซอร์นี้ใน scheme นี้ได้หรือไม่ หรือให้เป็น default schema ของยูซเซอร์นี้ได้หรือไม่
- ไม่ก็ต้องหาคำสั่งอะไรบน Oracle เพื่อให้มันรู้ว่าเทเบิลชื่อ T1 นั้นมาจาก TABLE_USER schema หรือ T1 นั้นคือชื่อเล่นของ TABLE_USER.T1

จริงๆมันได้หรือไม่ผมก็ไม่รู้นะครับ เดาเอา แต่มันได้หน่ะ

ถ้าทำได้แล้ว ก็ลองล็อคอินด้วยยูซเซอร์ USER1 ผ่าน GUI ของ Oracle ดูตรงๆเลย ยังไม่ต้องผ่าน Access ดูว่าถ้าไม่ใส่คำว่า TABLE_USER จะทำงานได้หรือไม่

ไม่ก็ต้องหันไปใช้ Pass-Thru Query แทนครับ
4 @R19174
Pass-Thru Query คือ่อะไรครับ ไม่รู้จริงๆครับ
5 @R19175
Pass-Thru Query คือคิวรี่ที่ Access ส่งคำสั่ง SQL statement ต่างๆไปประมวลผลที่ Database Server โดยตรง (ถ้าตัวจัดการฐานข้อมูลเป็นแบบ Client-Server Database ซึ่งฐานข้อมูลระดับบนๆเช่น MySQL, SQL Server, Oracle ,... เป็นแบบ Client-Server Database ทั้งนั้น   ส่วน Access เองไม่ได้เป็น)      Access จะไม่ประมวลผลหรือเช็คอะไรเกี่ยวกับ SQL statement เหล่านี้ทั้งสิ้น   statement จะต้องเป็นไปตาม syntax ที่ Oracle รับรู้ได้    ดังนั้น SQL statement ที่มีการระบุ schema ก็จะทำงานได้อย่างถูกต้อง   พอ Oracle ทำงานเสร็จแล้ว ถ้าต้องมีการส่งเรคอร์ดกลับมา   เราก็สามารถเปิดดูได้ตามปกติ แต่การใช้ Pass-Theu Query ก็มีข้อจำกัดเหมือนกัน เช่น ไม่สามารถแก้ไขเรคอร์ดที่เราต้องการผ่านทาง Recordset ได้ เราต้องส่งคำสั่ง SQL Update statement กลับไปให้ Oracle อัพเดตข้อมูลอีกทีนึง ดังนั้นผมจึงใช้เฉพาะเมื่อเป็นการอ่านเรคอร์ดหรือทำ Insert, Update, Delete เท่านั้นครับ

ลองดูตัวอย่างได้ที่นี่ http://msdn.microsoft.com/EN-US/library/ff192701%28v=office.15%29.aspx

6 @R19176
จะลองไปศึกษาดูครับ
7 @R19177
ไปเจออันนี้มา เป็นการใช้คำสั่ง CREATE SYNONYM เพื่อสร้าง schema.table ให้เป็นอีกชื่อนึง และผมเข้าใจว่า ชื่อที่สร้างใหม่นี้ ตัว Access น่าจะเห็นได้โดยตรง

http://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_7001.htm ดูที่ Examples นะครับ
8 @R19178
ขอโทษครับคุณสันติสุข ต้องใช้แบบไหนและทำอย่างไรครับ มือใหม่ครับ
9 @R19179
ผมก็ไม่เคยใช้ Oracle ครับ ลองหาว่ามีโปรแกรมอะไรของ Oracel ให้ป้อนคำสั่งได้ ก็ลอง CREATE PUBLIC SYNONYM TB_A FOR TABLE_USER.TBL_A; ต่อไปจะเรียก ก็เรียก TB_A แทน TBL_A
10 @R19180
ขอบคุณครับ จะลองไปหาดูก่อนครับ
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.3338s