2008-10-10 13 views
7

Estoy clasificando una serie de scripts SQL para mi compañía escritos en Oracle PL/SQL. Encontré una secuencia de comandos esencial con una barra extrañamente colocada cerca de la parte inferior. Se registra en CVS de esta manera. ¿Es este un error de sintaxis pura o tiene alguna función de la que no estoy enterado? El guión poco ofuscado:¿Es este un carácter de barra en una secuencia de comandos Oracle PL/SQL un error?

set serveroutput on size 2000; 
--PL/SQL block to link ISSN in serial base on a company's ISSN text file 

declare 
    cursor ItemCursor is 
     select issn is2 from web.obfuscated1 where issn is not null 
      union 
     select eissn is2 from web.obfuscated1 where eissn is not null; 

    cursor ItemCursor1(aIS varchar2) is 
     select obfuscated1_uid from web.obfuscated1 where group_num is null and issn in (
      select distinct issn from web.obfuscated1 where issn = aIS or eissn = aIS 
       union 
      select distinct eissn from web.obfuscated1 where issn = aIS or eissn = aIS 
     ) 
      union 
     select obfuscated1_uid from web.obfuscated1 where eissn in (
      select distinct issn from web.obfuscated1 where issn = aIS or eissn = aIS 
       union 
      select distinct eissn from web.obfuscated1 where issn = aIS or eissn = aIS 
     ); 

    cursor ItemCursor2(aIS9 varchar2) is 
     select obfuscated1_uid from web.obfuscated1 where issn in (
      select distinct issn from web.obfuscated1 where issn = aIS9 or eissn = aIS9 
       union 
      select distinct eissn from web.obfuscated1 where issn = aIS9 or eissn = aIS9 
     ) and group_num is null; 

    agroup  number(8); 
    processCount number(8); 

    ------------------------------------------------------ 
    -- MAIN BLOCK ----------------------------------- 
    ------------------------------------------------- 
begin 
    processCount := 0; 

    agroup := null; 
    for itemRec in ItemCursor loop 
     agroup := null; 
     begin 
      select group_num into agroup from web.obfuscated1 where issn in (
       select distinct issn from web.obfuscated1 where issn = itemRec.is2 or eissn = itemRec.is2 
        union 
       select distinct eissn from web.obfuscated1 where issn = itemRec.is2 or eissn = itemRec.is2 
      ) and group_num is not null and issn is not null and eissn is not null and rownum <= 1; 

     exception 
      when no_data_found then 
       agroup := null; 
      when others then 
       agroup := null; 
     end; 

     if agroup is not null then 
      for itemRec2 in ItemCursor2(itemRec.is2) loop 
       update web.obfuscated1 set group_num = agroup where obfuscated1_uid = itemRec2.obfuscated1_uid; 
       commit; 
      end loop; 
     else 
      processCount := processCount + 1; 
      for itemRec1 in ItemCursor1(itemRec.is2) loop 
       update web.obfuscated1 set group_num = processCount where obfuscated1_uid = itemRec1.obfuscated1_uid; 
       commit; 
      end loop; 
      commit; 
     end if; 
    end loop; 

    dbms_output.put_line('Total record read: ' || processCount); 
exception 
    when others then 
     dbms_output.put_line('ORA' || sqlcode); 
     dbms_output.put_line(substr(sqlerrm, 1, 255)); 
     dbms_output.put_line('ORA- Error during processing '); 
    end; 
/
exit; 

Respuesta

21

la barra tiene a meaning:

ejecuta el comando ejecutada más recientemente SQL o bloque PL/SQL que es almacenada en el buffer de SQL. Puede ingresar una barra inclinada (/) en el comando o en el indicador de número de línea de un comando de varias líneas . El comando de barra funciona de manera similar a RUN, pero no muestra el comando.

5

del/al final es decirle al intérprete para ejecutar el script cargado

, básicamente, que escribe cosas a continuación, escriba "/" y lo que acaba de escribir ejecutará

1

No es un error. Ejecuta el script

Resulta útil cuando concatena varias secuencias de comandos juntas en un archivo y desea que cada tarea independiente se ejecute antes que la siguiente.

es decir, la función Crear / Crear procedimiento almacenado que utiliza la función

sin la barra del procedimiento almacenado puede quedar creada con errores o no se crean.

3

Tanto la barra oblicua como la "salida" me hacen sospechar que se supone que debe ejecutar esta secuencia de comandos desde SQLPLUS. Puede obtener un error si intenta enviarlo a Oracle de alguna otra manera. En ese caso, solo deshazte de ambos.

6

Al usar Oracle, "mezcla" tres gramáticas diferentes.

  • SQL
  • PL/SQL
  • (cliente de línea de comandos)
  • sqlplus

puede ejecutar sqlplus/SQL de proceso y declaraciones PL/SQL enviándolos a servidor de base de datos. Mientras que los comandos sqlplus son interpretados por sqlplus.

El punto y coma ";" no es parte de la gramática SQL y sqlplus lo reconoce como el final de la declaración SQL. Mientras que para PL/SQL es parte de la gramática y debe decir explícitamente a sqlplus que la instrucción termina aquí y debe ejecutarse con barra.

Los otros comandos de sqlplus son "EXIT", "DEFINIR" "VARIABLE" "IMPRIMIR" "SET <algo>" (excepto SET ROLE).

Por otro lado, el Toad por ejemplo reconoce el final del bloque PL/SQL cuando ve una línea vacía.

Cuestiones relacionadas