2016-11-10 76 views
0

我試圖執行一個程序,它依次執行另外四個程序。我如何實現這個目標?一個接一個地執行多個程序不起作用

Create or replace procedure mainproc 
as 
begin 
tack(400); 
phno_insert; 
address_insert; 
academics_insert; 
commit; 
end; 

錯誤報告:

PLS-00905:對象phno_insert無效。 PL/SQL:語句被忽略。 PLS-00905:對象address_insert無效。 PL/SQL:語句 被忽略。 PLS-00905:對象academics_insert無效。 PL/SQL: 語句被忽略。

+0

這看起來完全正確的。其他程序是否安裝並可執行(許可明智)? –

+0

每個程序都在運行並可以執行。但是依賴於程序tack(400);只有大頭釘(400)被執行,其他三個纔可以執行 – Darla

+0

大頭釘有什麼作用?它是否包含DDL查詢? – Aleksej

回答

1

這個問題似乎是因爲你有一個過程對另一個過程中靜態引用的對象執行DDL;例如,如果定義:

create table runtimeTable as select 1 as one from dual; 
create or replace procedure createTable is 
begin 
    execute immediate 'drop table runtimeTable'; 
    execute immediate 'create table runtimeTable as select 1 as one from dual'; 
end; 
create or replace procedure useTable is 
    vVar number; 
begin 
    select one 
    into vVar 
    from runtimeTable; 
    -- 
    dbms_output.put_line(vVar); 
end; 
create or replace procedure createAndUseTable is 
begin 
    createTable; 
    useTable; 
end; 
/ 

當我嘗試執行createAndUseTable我得到:

ORA-04068:現有的包狀態已被丟棄ORA-04065: 不執行,修改或刪除存儲過程「ALEK.USETABLE」 ORA-06508:PL/SQL:無法找到正在調用的程序單元: 「ALEK.USETABLE」ORA-06512:在「ALEK.CREATEANDUSETABLE」,第4行 ORA-06512:at第1行

如果您嚴格需要執行DDL運行時,則需要使用動態SQL來引用修改後的對象;例如,如果我可以定義過程useTable這樣

create or replace procedure useTable is 
    vVar number; 
begin 
    execute immediate 
    'select one  
    from runtimeTable' 
    into vVar; 
    -- 
    dbms_output.put_line(vVar); 
end; 

調用createAndUseTable將工作:

SQL> exec createAndUseTable 
1 
+0

是的,我正在使用DDL的動態SQL。但是我懷疑它們是在並行執行的。後三個過程依賴於第一個過程,所以並行作業過程可能會影響執行。是嗎? – Darla

相關問題