أوراكل: هل يمكننا إنشاء جداول مؤقتة عالمية أو أي جداول في بروك المخزنة؟

StackOverflow https://stackoverflow.com/questions/2692140

  •  01-10-2019
  •  | 
  •  

سؤال

فيما يلي Proc المخزنة كتبت:

create or replace procedure test005
as
begin

CREATE GLOBAL TEMPORARY TABLE TEMP_TRAN 
( 
COL1 NUMBER(9), 
COL2 VARCHAR2(30), 
COL3 DATE 
) ON COMMIT PRESERVE ROWS 

/
INSERT INTO TEMP_TRAN VALUES(1,'D',sysdate); 

INSERT INTO TEMP_TRAN VALUES(2,'I',sysdate); 

INSERT INTO TEMP_TRAN VALUES(3,'s',sysdate); 

COMMIT;
end;

عندما نفذته ، أحصل على رسالة خطأ تذكر:

create or replace procedure test005
as
begin

CREATE GLOBAL TEMPORARY TABLE TEMP_TRAN 
( 
COL1 NUMBER(9), 
COL2 VARCHAR2(30), 
COL3 DATE 
) ON COMMIT PRESERVE ROWS 

/
INSERT INTO TEMP_TRAN VALUES(1,'D',sysdate); 

INSERT INTO TEMP_TRAN VALUES(2,'I',sysdate); 

INSERT INTO TEMP_TRAN VALUES(3,'s',sysdate); 

COMMIT;
end;
Error at line 1
ORA-00955: name is already used by an existing object

Script Terminated on line 1.

حاولت إسقاط temp_tran وتقول إن الجدول غير موجود. لذلك لا يوجد جدول temp_tran في النظام. لماذا أحصل على هذا الخطأ؟ أنا أستخدم TOAD لإنشاء هذا Proc المخزن.

أي مساعدة سيكون موضع تقدير كبير.

هل كانت مفيدة؟

المحلول

لا يُقصد بإنشاء الجداول المؤقتة العالمية "على الطيران" من خلال الإجراءات المخزنة. سيتم إنشاؤها مرة واحدة ، بشكل دائم ، مثل أي جدول آخر. إنها البيانات المؤقتة ، وليس كائن الجدول.

بخصوص temp_tran ، ربما هدف هذا الاسم موجود ، لكنه ليس الطاولة؟ جرب هذا:

select * from all_objects where object_name = 'TEMP_TRAN';

نصائح أخرى

IF v_Exists = 1 THEN
    EXECUTE IMMEDIATE "DROP TABLE TEMP_TRAN";
ENDIF

المشكلة الوحيدة في هذا الإجراء هي أنه عندما لا يكون الجدول الذي تبحث عنه غير موجود ، بدأت المشكلة مع عدم وجود خطأ في البيانات ولن تدخل في هذا السطر الذي تحقق من القيمة V. قون

هل جربت هذا الاستعلام؟

select * from all_tables where table_name like '%TEMP_TRAN%'

إذا كان الأمر كذلك ، هل الجدول مدرج؟

هناك طريقة أخرى للذهاب وهي باستخدام البيان الفوري تنفيذ.

CREATE OR REPLACE PROCEDURE P_TEST005 AS
v_Exists NUMBER;
BEGIN
    v_Exists := 0;
    SELECT 1 INTO v_Exists
        FROM ALL_TABLES
        WHERE TABLE_NAME LIKE '%TEMP_TRAN%';

    IF v_Exists = 1 THEN
        EXECUTE IMMEDIATE "DROP TABLE TEMP_TRAN";
    ENDIF

    EXECUTE IMMEDIATE 
        "CREATE GLOBAL TEMPORARY TABLE TEMP_TRAN (
            COL1 NUMBER(9), 
            COL2 VARCHAR2(30), 
            COL3 DATE
        ) ON COMMIT PRESERVE ROWS"

    EXCEPTION
        WHEN OTHERS THEN 
            NULL;
END;

يرجى النظر في مهارات أوراكل الصدئة. لم أعمل مع أوراكل منذ حوالي عامين. ولكن إذا كنت تعمل في طريقك ، فيمكنك تحقيق ما تحاول القيام به.

ومع ذلك ، فإنني أوافق على أن الجدول المؤقت لا يُقصد به أن يتم إسقاطه بشكل إداري ، بل إنه موجود تمامًا مثل الجدول العادي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top