2016-01-20 38 views
-1

我試圖執行以下查詢並失敗。如何解決?如何在Oracle中執行以下查詢

decalre curPar int; 
begin 
select degree int curPar from dba_indexes where index_name='Z'; 
alter index "SAPR3"."Z" rebuild online parallel 3; 
alter index "SAPR3"."Z" parallel curPar; 
select degree from dba_indexes where index_name='Z'; 
end; 
--- Solution is not working 

var curPar number; 
exec select degree into :max_degree from dba_indexes where index_name='Z'; 
alter index "SAPR3"."Z" rebuild online parallel 3; 
alter index "SAPR3"."Z" parallel curPar; 
select degree from dba_indexes where index_name='Z'; 

/

+0

錯字:'decalre'應該是'declare'。你得到什麼錯誤信息? –

+0

對於DDL語句,您應該使用動態sql。執行立即。除此之外,請提供錯誤的確切詳情。 –

回答

3

聲明以代替decalre

SELECT ... INTO,而不是SELECT ... INT

數據類型INT - 不存在於甲骨文

您可以使用DDL操作(改變索引)僅用動態SQL(立即執行)

declare 
curPar NUMBER; 
begin 
select degree into curPar from dba_indexes where index_name='Z'; 
execute immediate 'alter index "SAPR3"."Z" rebuild online parallel 3'; 
execute immediate 'alter index "SAPR3"."Z" parallel '||curPar; 
select degree into curPar from dba_indexes where index_name='Z'; 
end; 
1

ALTER索引不是PLSQL命令。使用EXECUTE IMMEDIATE

declare curPar integer; 
begin 
    select degree into curPar from dba_indexes where index_name='Z'; 
    execute immediate 'alter index "SAPR3"."Z" rebuild online parallel 3'; 
    execute immediate 'alter index "SAPR3"."Z" parallel curPar'; 
    select degree into curPar from dba_indexes where index_name='Z'; 
end; 
+0

你不能在沒有INTO命令的PL/SQL塊中使用SELECT – Tatiana

+0

對不起,修復... –

0

You ca n不從pl/sql塊中執行DDL查詢。如果您需要這樣做,您可以使用EXECUTE IMMEDIATE

SQL> begin 
    2  alter index i1 rebuild parallel 1; 
    3 end; 
    4/
    alter index i1 rebuild parallel 1; 
    * 
ERROR at line 2: 
ORA-06550: line 2, column 5: 
PLS-00103: Encountered the symbol "ALTER" when expecting one of the following: 
(begin case declare exit for goto if loop mod null pragma 
raise return select update while with <an identifier> 
<a double-quoted delimited-identifier> <a bind variable> << 
continue close current delete fetch lock insert open rollback 
savepoint set sql execute commit forall merge pipe purge 

隨着execute immediate

SQL> declare 
    2  vSQL varchar2(100); 
    3  curPar integer; 
    4 begin 
    5  select 1 into curPar from dual; 
    6  vSQL := 'alter index i1 rebuild parallel ' || curPar; 
    7  execute immediate vSQL; 
    8 end; 
    9/

PL/SQL procedure successfully completed. 
+0

我得到以下錯誤: SQL>立即執行'alter index'SAPR3'。「Z」重建在線並行3'; BEGIN立即'改變索引'SAPR3'。「Z」重建在線並行3';結束; * ERROR位於第1行: ORA-06550:第1行,第17列: PLS-00103:出現符號 「改變索引 」SAPR3Ž在需要下列之一時」重建 在線平行3" 「」。 : :=。 (@%; 符號: 「 」 「=」 被取代「 改變索引」 SAPR3 Z」重建 在線平行3" 繼續 SQL> – user3661564

+0

這裏是錯誤: 1申報 2 curPar INT ; 3 begin 4從dba_indexes中選擇程度到curPar其中index_name ='Z'; 5立即執行'alter index'SAPR3「。」Z「在線並行重建3'; 6立即執行'alter index'SAPR3'。 「Z」並行curPar'; 7從dba_indexes中選擇程度從dba_indexes where index_name ='Z'; 8 * end; SQL>/ 聲明 * ERROR位於第1行: ORA-02243:無效的ALTER INDEX或ALTER物化視圖選項 ORA-06512:在第6行 SQL> – user3661564

+0

注重curPar;你必須連接變量'curPar',而不是在你的語句中插入字符串''curPar'';該語句就像'立即執行'alter index'SAPR3'。'Z'parallel'|| curPar;'(看我的例子) – Aleksej

相關問題