กระทู้เก่าบอร์ด อ.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
ผมขอความรู้ทางด้านนี้ด้วยครับ จะต้องเขียนอย่างไร
ผมเพิ่งเคยใช้ครับ 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):
ผมไม่เข้าใจเกี่ยวกับ 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 แทนครับ
- เพิ่มยูซเซอร์นี้ใน 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
ลองดูตัวอย่างได้ที่นี่ 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 นะครับ
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
ขอบคุณครับ จะลองไปหาดูก่อนครับ
Time: 0.3338s