2016-09-22 50 views
-1

我有一組sql語句(創建表,視圖,序列),其中我的模式名稱始終發生更改,其餘部分與sql相同。 即使在架構名稱中,它的一部分也必須更改,例如: 我有一個schema名稱ABC_XYZ,我想將此架構名稱更改爲ABC_DEF_XYZ。 爲此,我嘗試在模式名稱中插入一個變量,如ABC_&var1_XYZ。如果我在模式名稱中傳遞變量(ABC_&var1_XYZ)並將值傳遞給變量,它會要求我聲明變量的值。 我已經給出了錯誤,下面的代碼我使用:動態更改/替換變量的值-oracle

Error report - 
ORA-06550: line 5, column 52: 
PLS-00201: identifier 'REL4' must be declared 
ORA-06550: line 5, column 1: 
PL/SQL: Statement ignored 
ORA-06550: line 7, column 51: 
PLS-00201: identifier 'REL4' must be declared 

這裏是我創建語句:

set echo off 
set verify off 
undefine mySchemaPart 
declare 
    vSQL  varchar2(32767); 
begin 

vSQL:= 'begin EXECUTE IMMEDIATE alter table ABC_'||&&mySchemaPart||'_OWNER.TEST drop constraint EMPLOYEE_ID_FK; EXCEPTION when others then if (SQLCODE != -02443 and SQLCODE != -942) then RAISE; end if; end'; 
execute immediate vSQL; 
vSQL:= 'begin EXECUTE IMMEDIATE drop table ABC_'||&mySchemaPart||'_OWNER.TEST cascade constraints PURGE; EXCEPTION when others then if SQLCODE != -942 then RAISE; end if; end'; 
execute immediate vSQL; 
vSQL:= 'create table ABC_'||&mySchemaPart||'OWNER.TEST 
(
    EMPLOYEE_ID  NUMBER(19)   not null, 
    LAST_UPDT_DT   DATE     not null, 
    )'; 
    execute immediate vSQL; 
vSQL:= 'CREATE OR REPLACE SYNONYM ABC_USER.TEST FOR ABC_'||&mySchemaPart||'OWNER.TEST'; 
execute immediate vSQL; 
vSQL:= 'begin EXECUTE IMMEDIATE alter table ABC_'||&mySchemaPart||'OWNER.TEST 
    add constraint EMPLOYEE_ID_FK foreign key (EMPLOYEE_ID) 
     references ABC_OWNER.GDSD (EMPLOYEE_ID); EXCEPTION when others then if (SQLCODE != -02443 and SQLCODE != -02275) then RAISE; end if; end'; 
execute immediate vSQL; 
end; 
/

有沒有其他辦法可以嘗試在此方案中插入我的價值。

+0

請發佈您的代碼的相關部分 – Aleksej

+1

如何使用'execute immediate'? – Plirkee

+0

您不能在創建表格時簡單地傳遞該變量。如果要進行參數化,則需要使用PLSQL塊。請參閱下面的示例 – XING

回答

0

把它作爲'ABC_||'&var1||'_XYZ'

INSERT語句的一個例子。

insert into test (a) 
select 'ABC_'||&var1||'_XYZ' from dual ; 

執行時會詢問提示。

爲塊,你可以使用這個:

declare 

var varchar2(100); 
begin 

var:='create table ABC_'||&var1||'_XYZ.tablnam(a number)'; --add your columns 

dbms_output.put_line(var); 

execute immediate var; 

end; 

按@bin要求他/她的statments:

declare 

var varchar2(500); 
begin 

var:='create table ABC_'||&var||'_OWNER.TEST(EMPLOYEE_ID NUMBER(19) not null, LAST_UPDT_DT DATE not null)'; 

--Table Created 
dbms_output.put_line(var); 
execute immediate var; 

var:='alter table ABC_'||&var1||'_OWNER.TEST add constraint EMPLOYEE_ID_FK foreign key (EMPLOYEE_ID) references ABC_OWNER.GDSD(EMPLOYEE_ID)'; 

--Constraint Added 
dbms_output.put_line(var); 
execute immediate var; 


var:='CREATE OR REPLACE SYNONYM ABC_USER.TEST FOR ABC_'||&var1||'_OWNER.TEST'; 

--Synonym Created 
dbms_output.put_line(var); 
execute immediate var; 


var:='alter table ABC_'||&var1||'_OWNER.TEST drop constraint EMPLOYEE_ID_FK'; 

--Constraint Dropped 
dbms_output.put_line(var); 
execute immediate var; 


var:='drop table ABC_'||&var1||'_OWNER.TEST cascade constraints PURGE'; 

--Table Dropped 
dbms_output.put_line(var); 
execute immediate var; 


Exception 
WHEN others then 
dbms_output.put_line('Error--'||sqlerrm||'-'||sqlcode); 

end; 

輸出:

SQL> declare 
    var varchar2(100); 
    begin 
    var:='create table ABC_'||&var1||'OWNER.TEST(EMPLOYEE_ID NUMBER(19) not null, LAST_UPDT_DT DATE not null)'; 
' 
' 
' 
dbms_output.put_line(var); 

execute immediate var; 

end; 

Enter value for var1: 'REL4' 

    create table ABC_REL4_OWNER.TEST(EMPLOYEE_ID NUMBER(19) not null, LAST_UPDT_DT DATE not null) 
    Table created. 

    alter table ABC_REL4_OWNER.TEST add constraint EMPLOYEE_ID_FK foreign key (EMPLOYEE_ID) references ABC_OWNER.GDSD(EMPLOYEE_ID) 
    Table altered. 

    CREATE OR REPLACE SYNONYM ABC_USER.TEST FOR ABC_REL4_OWNER.TEST 
    Synonym created. 

    alter table ABC_REL4_OWNER.TEST drop constraint EMPLOYEE_ID_FK 
    Table altered. 

    drop table ABC_REL4_OWNER.TEST cascade constraints PURGE 
    Table dropped. 
+0

Hi XING,我在創建表的時候使用這個模式名稱,例如:Create table abc_&var1_xyz.tablename。我也嘗試了上面提到的方法,但是它會拋出一個錯誤:ORA-06550:第2行,第39列: PLS-00103:遇到以下其中一項時遇到符號「RDS_」: *&= - +; at in是mod的餘數不爲rem返回 返回<指數(**)><>或!=或〜=> = <= <>和或 like2 like4 likec介於using || multiset bulk member submultiset 06550. 00000 - 「line%s,column%s:\ n%s」 *原因:通常是PL/SQL編譯錯誤。 *操作: – bin

+0

發佈您的創建聲明; – XING

+1

請不要在評論中張貼代碼,而是編輯您的問題 – Aleksej

1

您可以使用動態SQL在DDL中處理不同的模式;例如:

accept mySchemaPart PROMPT "Schema part: " 
declare 
    vMySchema varchar2(30) := 'ABC_' || '&mySchemaPart' || '_XYZ'; 
    vSQL  varchar2(32767); 
begin 
    vSQL := 'create table ' || vMySchema || '.tableName (...)'; 
    execute immediate vSQL; 
end; 
/
+0

Aleksej,我的要求是更改模式名稱的一部分,我不應該替換整個模式名稱:( – bin

+0

這沒什麼不同;只是編輯了一下 – Aleksej