2010-06-11 24 views
6

Sadece herkes bu yardımcı olabilir merak, ben (ekstra alanları ekleyerek) tabloları değiştirmek için iki PLSQL ifadeleri var ve onlar şunlardır:İki PLSQL ifadesi, başlangıç ​​ve bitiş ile birlikte ayrı ayrı çalışıyor ancak birlikte çalışmıyor mu?

-- Make GC_NAB field for Next Action By Dropdown 

begin 
if 'VARCHAR2' = 'NUMBER' and length('VARCHAR2')>0 and length('')>0 then 
    execute immediate 'alter table "SERVICEMAIL6"."ETD_GUESTCARE" add(GC_NAB VARCHAR2(10,))'; 
elsif ('VARCHAR2' = 'NUMBER' and length('VARCHAR2')>0 and length('')=0) or 
    'VARCHAR2' = 'VARCHAR2' then 
    execute immediate 'alter table "SERVICEMAIL6"."ETD_GUESTCARE" add(GC_NAB VARCHAR2(10))'; 
else 
    execute immediate 'alter table "SERVICEMAIL6"."ETD_GUESTCARE" add(GC_NAB VARCHAR2)'; 
end if; 
commit; 
end; 

-- Make GC_NABID field for Next Action By Dropdown 

begin 
if 'NUMBER' = 'NUMBER' and length('NUMBER')>0 and length('')>0 then 
    execute immediate 'alter table "SERVICEMAIL6"."ETD_GUESTCARE" add(GC_NABID NUMBER(,))'; 
elsif ('NUMBER' = 'NUMBER' and length('NUMBER')>0 and length('')=0) or 
    'NUMBER' = 'VARCHAR2' then 
    execute immediate 'alter table "SERVICEMAIL6"."ETD_GUESTCARE" add(GC_NABID NUMBER())'; 
else 
    execute immediate 'alter table "SERVICEMAIL6"."ETD_GUESTCARE" add(GC_NABID NUMBER)'; 
end if; 
commit; 
end; 

Ben sorun yok, ayrı ayrı bu iki sorgu çalıştırdığınızda. yukarıda gösterildiği gibi birlikte çalıştıklarında ikinci ifadeyi başladığında Ancak, Oracle bana bir hata veriyor:

Error report: 
ORA-06550: line 15, column 1: 
PLS-00103: Encountered the symbol "BEGIN" 
06550. 00000 - "line %s, column %s:\n%s" 
*Cause: Usually a PL/SQL compilation error. 
*Action: 

bu düzgün kesilmez ilk açıklama anlamına geldiğini tahmin ediyorum ... bir şey var ben gerektiğidir düzgün bir şekilde çalışmasını sağlamak için ifadeler arasına yerleştirmek?

cevap

7

Evet, hernumaralı hattan sonra, satırda / eğik çizgi gerekir.

16

Oracle, bir kerede bir SQL deyimi veya PL/SQL anonim blok alabilir. (Bir seferde bir toplu iş dışında SQL Server'ın aksine.) Yani, birkaç seçeneğiniz var. Başka anonim blok içinde

  1. Wrap iki anonim bloklar:

    begin 
        -- Make GC_NAB field for Next Action By Dropdown 
        begin 
        if 'VARCHAR2' = 'NUMBER' and length('VARCHAR2')>0 and length('')>0 then 
        execute immediate 'alter table "SERVICEMAIL6"."ETD_GUESTCARE" add(GC_NAB VARCHAR2(10,))'; 
        elsif ('VARCHAR2' = 'NUMBER' and length('VARCHAR2')>0 and length('')=0) or 
        'VARCHAR2' = 'VARCHAR2' then 
        execute immediate 'alter table "SERVICEMAIL6"."ETD_GUESTCARE" add(GC_NAB VARCHAR2(10))'; 
        else 
        execute immediate 'alter table "SERVICEMAIL6"."ETD_GUESTCARE" add(GC_NAB VARCHAR2)'; 
        end if; 
        commit; 
        end; 
        -- Make GC_NABID field for Next Action By Dropdown 
        begin 
        if 'NUMBER' = 'NUMBER' and length('NUMBER')>0 and length('')>0 then 
        execute immediate 'alter table "SERVICEMAIL6"."ETD_GUESTCARE" add(GC_NABID NUMBER(,))'; 
        elsif ('NUMBER' = 'NUMBER' and length('NUMBER')>0 and length('')=0) or 
        'NUMBER' = 'VARCHAR2' then 
        execute immediate 'alter table "SERVICEMAIL6"."ETD_GUESTCARE" add(GC_NABID NUMBER())'; 
        else 
        execute immediate 'alter table "SERVICEMAIL6"."ETD_GUESTCARE" add(GC_NABID NUMBER)'; 
        end if; 
        commit; 
        end; 
    end; 
    
  2. sen ayrı iki blok göndermek için Oracle PL/SQL göndermek için kullandığınız aleti söyle. Bunun nasıl yapılacağı, araçlara özel olacaktır. SQL * PLUS, tek başına bir satırda bir / Bunun olacak:

    -- Make GC_NAB field for Next Action By Dropdown 
        begin 
        if 'VARCHAR2' = 'NUMBER' and length('VARCHAR2')>0 and length('')>0 then 
        execute immediate 'alter table "SERVICEMAIL6"."ETD_GUESTCARE" add(GC_NAB VARCHAR2(10,))'; 
        elsif ('VARCHAR2' = 'NUMBER' and length('VARCHAR2')>0 and length('')=0) or 
        'VARCHAR2' = 'VARCHAR2' then 
        execute immediate 'alter table "SERVICEMAIL6"."ETD_GUESTCARE" add(GC_NAB VARCHAR2(10))'; 
        else 
        execute immediate 'alter table "SERVICEMAIL6"."ETD_GUESTCARE" add(GC_NAB VARCHAR2)'; 
        end if; 
        commit; 
        end; 
    /
        -- Make GC_NABID field for Next Action By Dropdown 
        begin 
        if 'NUMBER' = 'NUMBER' and length('NUMBER')>0 and length('')>0 then 
        execute immediate 'alter table "SERVICEMAIL6"."ETD_GUESTCARE" add(GC_NABID NUMBER(,))'; 
        elsif ('NUMBER' = 'NUMBER' and length('NUMBER')>0 and length('')=0) or 
        'NUMBER' = 'VARCHAR2' then 
        execute immediate 'alter table "SERVICEMAIL6"."ETD_GUESTCARE" add(GC_NABID NUMBER())'; 
        else 
        execute immediate 'alter table "SERVICEMAIL6"."ETD_GUESTCARE" add(GC_NABID NUMBER)'; 
        end if; 
        commit; 
        end; 
    /
    
0

biri iki şekilde ) PL/SQL dosyasında ayrı ayrı iki blok çalıştırmak içinde elde edebilirsiniz.

2) ana bloğunda bu şekilde iki sbu-blok çalıştırabilirsiniz:

..... [PL/SQL komutlarını] başlayacak // ana blok başlar ...... uç
....... [PL/sQL komutları] ....... uç sonu // ana uçlarını

başlayacak