คุณสร้างตารางชั่วคราวในฐานข้อมูล Oracle ได้อย่างไร


93

ฉันต้องการสร้างตารางชั่วคราวในฐานข้อมูล Oracle

สิ่งที่ต้องการ

Declare table @table (int id)

ในเซิร์ฟเวอร์ SQL

แล้วเติมด้วยคำสั่งเลือก

เป็นไปได้ไหม?

ขอบคุณ

คำตอบ:


131

ใช่ Oracle มีตารางชั่วคราว นี่คือลิงค์ไปยังบทความAskTom ที่อธิบายถึงพวกเขาและนี่คือเอกสาร Oracle CREATE TABLE อย่างเป็นทางการ

อย่างไรก็ตามใน Oracle เฉพาะข้อมูลในตารางชั่วคราวเท่านั้นที่เป็นข้อมูลชั่วคราว ตารางเป็นวัตถุปกติที่เซสชันอื่นมองเห็นได้ การสร้างและวางตารางชั่วคราวใน Oracle เป็นแนวทางปฏิบัติที่ไม่ดี

CREATE GLOBAL TEMPORARY TABLE today_sales(order_id NUMBER)
ON COMMIT PRESERVE ROWS;

Oracle 18c เพิ่มตารางส่วนตัวชั่วคราวซึ่งเป็นอ็อบเจ็กต์ในหน่วยความจำเซสชันเดียว ดูเอกสารสำหรับรายละเอียดเพิ่มเติม ตารางชั่วคราวส่วนตัวสามารถสร้างและทิ้งแบบไดนามิกได้

CREATE PRIVATE TEMPORARY TABLE ora$ptt_today_sales AS
SELECT * FROM orders WHERE order_date = SYSDATE;

ตารางชั่วคราวอาจมีประโยชน์ แต่มักถูกใช้ในทางที่ผิดใน Oracle มักจะหลีกเลี่ยงได้โดยการรวมหลายขั้นตอนไว้ในคำสั่ง SQL เดียวโดยใช้มุมมองแบบอินไลน์


40
ไม่มีการโหวตลงคะแนน แต่ฉันจะไม่แนะนำ CREATE TABLE AS SELECT สำหรับตารางชั่วคราวทั่วโลกนักพัฒนาที่มีประสบการณ์น้อยอาจเข้าใจผิดว่าพวกเขาต้องเติม GTT ด้วยวิธีนี้ทุกครั้ง แน่นอนว่านี่เป็นวิธีที่สะดวกในการคัดลอกคำจำกัดความจากตารางอื่น แต่ตัวอย่างอาจทำให้บางคนสับสน
Jeffrey Kemp

ฉันเห็นด้วยอย่างยิ่งกับ Jeffrey Kemp ที่นี่นี่เป็นเพียงวิธีหนึ่งในการสร้างตารางนี้ฉันพบสิ่งนี้และตระหนักว่าผู้ชายฉันต้องใส่คำสั่งเลือกนี้ใน DDL ของฉันหรือไม่
Vijay Kumar

3
คุณสามารถเพิ่ม "โดยที่ 1 = 0";
Palcente

@Palcente ที่ยังคงบอกเป็นนัยว่าคุณต้องมี "ตารางจริง" ที่มีโครงสร้างเดียวกันเพื่อสร้างตารางชั่วคราวซึ่งไม่เป็นเช่นนั้น (ดูคำตอบนี้ด้วยนอกเหนือจากนั้นคำตอบนี้ยังไม่ได้ชี้ให้เห็นว่าไม่มีเพียงGLOBALตารางชั่วคราว แต่ยังสามารถใช้ "ธรรมดา" ตารางชั่วคราว. แตกต่างกับ SQL Server ที่เป็นแหลมออกโดยแมทธิวเป็นจุดสำคัญอีกคนหนึ่งควรจะทำให้แน่ใจว่าจะไม่พลาด (หรือสงสัยเกี่ยวกับข้อผิดพลาดใน "สายที่สอง" เกี่ยวกับวัตถุที่มีอยู่แล้ว;)
Izzy

2
กรณีการใช้งานที่ถูกต้องสำหรับCREATE TABLE AS SELECT: เลือกจากตารางระยะไกลที่มีคอลัมน์ลอบเนื่องจากคุณไม่สามารถโดยตรงSELECTจากพวกเขา ฉันกำลังเขียนขั้นตอนในการคัดลอกระเบียนจากฐานข้อมูลระยะไกลและนี่คือวิธีแก้ปัญหาของฉัน: นำระเบียนไปไว้ใน GTT แล้วคัดลอกจากนั้นไปยังตาราง "จริง"
rgoliveira

78

เคล็ดลับ .. ตารางชั่วคราวใน Oracle แตกต่างจาก SQL Server คุณสร้างครั้งเดียวและครั้งเดียวไม่ใช่ทุกเซสชัน แถวที่คุณแทรกเข้าไปจะมองเห็นได้เฉพาะเซสชันของคุณและจะถูกลบโดยอัตโนมัติ (กล่าวคือTRUNCATEไม่ใช่DROP) เมื่อคุณสิ้นสุดเซสชันของคุณ (หรือสิ้นสุดธุรกรรมขึ้นอยู่กับประโยค "ON COMMIT" ที่คุณใช้)


15
ฉันไม่เข้าใจทั้งหมด คุณบอกว่าคุณสร้างครั้งเดียวและครั้งเดียวไม่ใช่ทุกเซสชัน อย่างไรก็ตามคุณยังบอกด้วยว่าตารางชั่วคราวจะถูกลบทุกเซสชัน นั่นหมายความว่าคุณจะต้องสร้างตารางชั่วคราวทุกเซสชันใช่หรือไม่
Chaos

31
DELETEDไม่ใช่DROPเหยียบ
Tripp Kinetics

10
คุณไม่ได้สร้างตารางชั่วคราวทุกเซสชัน แต่เพียงครั้งเดียว ตารางสามารถใช้ได้ทั่วทั้งระบบ คุณสามารถเข้าถึงตารางได้จากเซสชันใด ๆ ที่คุณสร้างรวมถึงเซสชันคู่ขนาน แต่เมื่อคุณแทรกข้อมูลจากภายในเซสชันหนึ่งข้อมูลนั้นจะมองไม่เห็นจากเซสชันคู่ขนานอื่น ๆ ในระบบ ข้อมูลของเซสชันหนึ่งเป็นคุณสมบัติของเซสชันนั้นเท่านั้น ดังนั้นข้อมูลจึงเป็นเฉพาะเซสชันไม่สามารถมองเห็นได้จากระบบ ดังนั้นเมื่อคุณปิดเซสชันหนึ่งข้อมูลของเซสชันนั้นจะถูกลบออกจากตาราง
SubhasisM

33
CREATE GLOBAL TEMPORARY TABLE Table_name
    (startdate DATE,
     enddate DATE,
     class CHAR(20))
  ON COMMIT DELETE ROWS;

10
โปรดทราบว่าแถวจะถูกลบเมื่อสิ้นสุดเซสชันเสมอ ON COMMIT DELETE ROWSหมายความว่าสิ่งเหล่านี้จะถูกยกเลิกเร็วขึ้นหากคุณกระทำทีละน้อยในระหว่างเซสชัน

1
zygimantus ใช่คุณสามารถลบด้วยตนเองในระหว่างเซสชัน ในระหว่างเซสชันตารางชั่วคราวจะทำงานเหมือนกับตารางปกติ ความแตกต่างเพียงอย่างเดียวระหว่างตารางชั่วคราวและตารางจริงจากมุมมองของผู้ใช้คือแถวทั้งหมดจะถูกลบเมื่อเซสชันสิ้นสุดลงและไม่มีเซสชันอื่น ๆ ที่สามารถอ่านเนื้อหาของตารางที่เซสชันใช้ มีตัวอย่างของตารางต่อเซสชัน สองเซสชันสามารถใช้ตารางชั่วคราวเดียวกันในเวลาเดียวกันและมีสองชุดแถวที่แตกต่างกันโดยไม่มีข้อขัดแย้งใด ๆ
Hans Deragon

-2

สร้างตาราง table_temp_list_objects AS

เลือก o.owner, o.object_name FROM sys.all_objects o WHERE o.object_type = 'TABLE';


โปรดจัดรูปแบบคำตอบของคุณ คงจะดีถ้าคุณเขียนอะไรเกี่ยวกับโค้ดของคุณ
โฮสเทล
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.