Para mi aplicación que utiliza Oracle 8 DB, me estoy dando una secuencia de comandos SQL para configurar cosas como triggers, secuencias, etc., que puede ser copiado y pegado en SQL*Plus. Me gustaría que la secuencia de comandos no se detiene con un error si una secuencia que estoy tratando de crear ya existe. De un Disparador esto se puede hacer fácilmente mediante «crear o reemplazar el gatillo …», pero para una secuencia que esto no funciona. También probé «»si no existe misecuencia, a continuación, crear la secuencia de …» pero no demasiado. ¿Hay alguna alternativa?

Alternativamente, si esto no es posible, hay una manera de hacer una «secuencia de misecuencia» sin SQL*Plus abortar la secuencia de comandos si misecuencia no existe?

  • ¿Cómo sería la presencia de un incremento automático de la función de Oracle ayudan a resolver lo que es claramente una fuente de control/gestión de la configuración de tema?
  • Lo siento, no lo entiendo. Puede usted explicar esto con más detalle? Lo que quiero decir es: todo lo necesario para una tabla es un campo autoincrement. Por ejemplo, en SQL Server acabo de definir la columna a ser un autoinc campo, y estoy hecho. En Oracle necesito crear una columna numérica, a continuación, una secuencia, un disparador para el uso de la secuencia para llenar mi columna. Esto no parece muy straigforward a mí.
  • Mi punto es, si usted tuvo una adecuada administración de esquema en el lugar que usted no necesita para manejar la previa existencia de una secuencia, ya que sólo se ejecuta una instrucción CREATE SEQUENCE en contra de las bases de datos donde se sabía que la secuencia no existe.
  • Bien, necesito que la secuencia de comandos para diferentes clientes con diferentes versiones de la base de datos, así como para nuevos clientes. Ciertamente podría averiguar que el cliente tiene con qué esquema y selectivamente crear scripts de actualización para ellos, y también tienen una secuencia de comandos independiente para la configuración inicial, pero por simplicidad prefiero tener una sola secuencia de comandos que puede utilizar para todo el mundo. Hace las cosas más fáciles para mis colegas del departamento de apoyo a las y los técnicos que realizan la instalación sin ningún tipo de conocimiento acerca de Oracle, y para mi, ya que no es necesario ordenar la ayuda de las llamadas porque alguien usó el mal de secuencia de comandos 🙂
InformationsquelleAutor Timo | 2010-04-11

5 Comentarios

  1. 8

    Si está seguro de que el script se ejecute siempre en SQL*Plus, puedes soporte al CREAR la SECUENCIA de instrucciones con una directriz a seguir en caso de error:

    WHENEVER SQLERROR CONTINUE
    -- create sequences here, ignoring errors
    WHENEVER SQLERROR EXIT SQL.SQLCODE

    Ser consciente de si hay otros errores (permiso de problemas, errores de sintaxis, etc.) en el crear la secuencia de instrucciones que serán ignorados

    • Bueno, yo no sabía acerca de dicha directiva. Gracias!
  2. 15
    DECLARE
      v_dummy NUMBER;
    BEGIN
      -- try to find sequence in data dictionary
      SELECT 1
      INTO v_dummy
      FROM user_sequences
      WHERE sequence_name = 'MY_SEQUENCE_NAME';
    
      -- if sequence found, do nothing
    EXCEPTION
      WHEN no_data_found THEN
        -- sequence not found, create it
        EXECUTE IMMEDIATE 'create sequence my_sequence_name';
    END;
    • He modificado el nombre de la tabla a ser ‘user_sequences’
  3. 4

    Me gusta:

    DECLARE
      C NUMBER;
    BEGIN
      SELECT COUNT(*) INTO C
      FROM ALL_TRIGGERS
      WHERE OWNER = 'YOUROWNER'
      AND TRIGGER_NAME = 'YOURTRIGGER';
    
      IF (C = 0) THEN
        EXECUTE IMMEDIATE '
          CREATE TRIGGER "YOUROWNER"."YOURTRIGGER"
            blah blah blah your trigger blah blah
        ';
      END IF;
    END;
    /
    • Mucho más fácil de usar CREAR O REEMPLAZAR el GATILLO MyTriggerName ANTES de la INSERCIÓN EN MyTable…..
  4. 1

    Puede comprobar user_sequence tabla para ver si la secuencia que se creó existe ya o no.

    Similar a davek‘s solución:
    La idea es que, antes de crear cualquier secuencia, la caída de la secuencia y crear, todo en SQL dinámico, crear una función, y dicen que cuando usted necesita para crear 10 secuencia, vamos a la función de cuidar…

    function crt_seq(p_seq_name varchar2)
    return boolean
    begin
       for i in (select 1 from user_sequence where sequence_name = upper(p_seq_name))
       loop
       ---- Already exists. You can drop and recreate or return false to error out
       execute immediate 'drop sequence '||p_seq_name;
       execute immediate 'create sequence '||p_seq_name||' start with 1 increment
                        by 1 nocache';
       end loop;
       return true;
    exception
    when others then
       return false;
    end;

    Puede parametrizar todas las demás opciones y tener una elaborada función para crear la secuencia para usted.

    • Debo admitir que soy un novato en Oracle, yo no sé ni donde para definir esa función y cómo llamar desde mi secuencia de comandos SQL, pero mis libros en Oracle ya están en mi escritorio, por lo que su respuesta probablemente me ayudan cuando tengo más conocimientos 🙂 Gracias.
    • Advertencia : Si usted tiene código (por ejemplo, paquetes) utilizando la secuencia, se invalidarán ellos. Usted también puede tener problemas de bloqueo de si los paquetes están en uso cuando se ejecuta este código. Ah, y si la secuencia ya existía y que había sido utilizado, obtendrá los valores duplicados.
    • fyi: user_sequenceS
  5. 1
    DECLARE
      lsSeqName VARCHAR2(32 CHAR) := UPPER('MY_SEQUENCE_NAME');
      lnSeqCount NUMBER;
    BEGIN
      -- try to find sequence in data dictionary
      SELECT count(1)
        INTO lnSeqCount
        FROM user_sequences
        WHERE UPPER(sequence_name) = lsSeqName;
      -- if sequence not found, create it
      IF lnSeqCount = 0 THEN
        EXECUTE IMMEDIATE 'CREATE SEQUENCE ' || lsSeqName || ' START WITH 1 MINVALUE 1 MAXVALUE 1000000000000000 INCREMENT BY 1 NOCYCLE CACHE 20 NOORDER';
      END IF;
    END;
    /

    O

    -- helper method
    PROCEDURE createSeqIfNotExists (
      isSeqName VARCHAR2
    ) IS
      lnSeqCount NUMBER;
    BEGIN
      -- try to find sequence in data dictionary
      SELECT count(1)
        INTO lnSeqCount
        FROM user_sequences
        WHERE UPPER(sequence_name) = UPPER(isSeqName);
      -- if sequence not found, create it
      IF lnSeqCount = 0 THEN
        EXECUTE IMMEDIATE 'CREATE SEQUENCE ' || UPPER(isSeqName) || ' START WITH 1 MINVALUE 1 MAXVALUE 1000000000000000 INCREMENT BY 1 NOCYCLE CACHE 20 NOORDER';
      END IF;
    END createSeqIfNotExists;
    
    -- call method
    BEGIN
      createSeqIfNotExists('MY_SEQUENCE_NAME');
    END;
    /

Dejar respuesta

Please enter your comment!
Please enter your name here