2010-06-11 14 views
6

Sólo me preguntaba si alguien puede ayudar con esto, tengo dos declaraciones PLSQL para alterar tablas (añadir campos adicionales) y que son los siguientes:Dos instrucciones PLSQL con inicio y final, se ejecutan bien por separado, pero no juntas.

-- 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; 

Cuando ejecuto estas dos consultas por separado, no hay problemas. Sin embargo, cuando se ejecuta en conjunto como se muestra arriba, Oracle me da un error cuando se inicia la segunda afirmación:

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: 

Estoy asumiendo que esto significa que la primera declaración no está correctamente terminado ... ¿Hay algo que debería poner entre las declaraciones para que funcione correctamente?

Respuesta

7

Sí, necesita una barra / en la línea después de cada end;.

16

Oracle puede tomar una instrucción SQL o un bloque anónimo PL/SQL a la vez. (A diferencia de SQL Server que puede exceptuar un lote a la vez.) Entonces, tiene un par de opciones.

  1. abrigo de los dos bloques anónimos dentro de otro bloque anónimo:

    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. Díselo la herramienta que está utilizando para enviar el PL/SQL para Oracle para enviar los dos bloques por separado. Cómo hacer esto será específico de la herramienta. En SQL * PLUS, un / en una línea por sí mismo va a lograr esto:

    -- 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

se puede lograr de dos maneras

1) se ejecutan los dos bloques por separado en el archivo de PL/SQL.

2) en el bloque principal se puede ejecutar dos SBU-bloques de esta manera:

begin // bloque principal comenzar ..... [pl/comandos SQL] ...... extremo comienzan
....... [pl/comandos SQL] ....... extremo finales // extremos principales

Cuestiones relacionadas