SQL - Error en procedimiento

 
Vista:
sin imagen de perfil

Error en procedimiento

Publicado por Maria (4 intervenciones) el 19/02/2017 23:45:24
Buenas,

Estoy creando un procedimiento, el cual debe crear una tabla, pero debe comprobar si existe, y en tal caso borrarla. Tengo echo esto:

CREATE OR REPLACE PROCEDURE CREAR (ID INT, NOMBRE VARCHAR2, PAIS VARCHAR2)
IS
VCOUNT NUMBER;
BEGIN

SELECT COUNT(*)INTO VCOUNT FROM DBA_TABLES WHERE TABLE_NAME='CLIENTE';
IF VCOUNT<=0 THEN
DROP TABLE CLIENTE;
END IF;
CREATE TABLE CLIENTE(
ID INT PRIMARY KEY,
NOMBRE VARCHAR2(150) NOT NULL,
PAIS VARCHAR2(50)
);
END;

Pero me da error..nose donde está el fallo. A ver si alguien me puede ayudar. Gracias.

ERROR -> Error que empieza en la línea: 12 del comando :
NOMBRE
Informe de error -
Comando desconocido

Y se me marca subrayada la palabra TABLE en la linea de DROP.
¿?¿?

Gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Error en procedimiento

Publicado por leonardo_josue (1173 intervenciones) el 20/02/2017 20:40:47
Hola María:

Primero que nada, ¿con qué motor de BD's estás trabajando? esta información es muy importante ya que todos los DBMS's tienen una sintaxis parecida pero distinta, por lo tanto, es complicado darte una respuesta puntual sin saber con qué se trabaja. Puedo suponer que se trata de Oracle, pero esto sólo Dios y tú lo saben.

Segundo, creo que tienes equivocada la lógica, al hacer un COUNT en la vista DBA_TABLES, te regresará un 1 si es que existe la tabla, por lo tanto estás haciendo la lógica inversa el IF debería ejecutar la sentencia siempre y cuando el COUNT sea igual a 1 o en su defecto que sea mayor a 0:

1
2
3
4
5
6
7
8
9
IF VCOUNT > 0 THEN
  --Código para eliminar la tabla
END IF;
 
o
 
IF VCOUNT = 1 THEN
  --Código para eliminar la tabla
END IF;

Tercero, hasta donde recuerdo, no puedes ejecutar sentencias tipo DROP o CREATE "directamente" en un procedimiento almacenado, checa esta liga:

1
http://stackoverflow.com/questions/1799128/oracle-if-table-exists

ahí está algo como lo que quieres hacer.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Error en procedimiento

Publicado por Maria (4 intervenciones) el 20/02/2017 23:40:45
Hola, estoy trabajando con Oracle SQL Developer. Lo primero de todo, muchisimas gracias por tu ayuda. He cambiado todo el procedimiento, me compila pero con errores y ahora si que nose donde está el fallo.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE OR REPLACE PROCEDURE CREA_TABLAS
IS
VCOUNT number :=0;
BEGIN
SELECT COUNT(*) INTO VCOUNT FROM DBA_TABLES WHERE TABLE_NAME='CLIENTE';
IF VCOUNT > 0 THEN
  EXECUTE IMMEDIATE  'DROP TABLE CLIENTE;';
END IF;
  EXECUTE IMMEDIATE 'CREATE TABLE CLIENTE(
  ID INT PRIMARY KEY,
  NOMBRE VARCHAR2(150) NOT NULL,
  PAIS VARCHAR2(50)
  );';
END;

Error(5,1): PL/SQL: SQL Statement ignored
Error(5,34): PL/SQL: ORA-00942: la tabla o vista no existe

La tabla no la tengo creada, por lo que el SELECT devolvería 0, no entraría en el IF y directamente tendría que ejecutar el Create...pero me da esos errores y no veo el fallo.
Gracias x todo.

Saludos
Maria.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Error en procedimiento

Publicado por leonardo_josue (1173 intervenciones) el 21/02/2017 16:47:24
Hola de nuevo María:

Primero una alcaración, Oracle SQL Developer NO ES UN MOTOR DE BASE DE DATOS, es un una herramienta gráfica para trabajar, el motor de BD's es simplemente ORACLE, (10g, 11i, etc) ojo con eso.

Ahora bien, con respecto a tu procedimiento, te comento que tienes varios errores.

1. es posible que el usuario con el que estás trabajando NO TENGA ACCESO A LA TABLA DBA_TABLES,

Si ejecutas esta consulta

1
SELECT COUNT(*) FROM DBA_TABLES WHERE TABLE_NAME='CLIENTE';

seguramente obtendrás el error que te dice que la tabla no existe:

Es mejor utilizar ALL_TABLES para hacer la búsqueda de los objetos:

1
SELECT COUNT(*) FROM ALL_TABLES WHERE TABLE_NAME='CLIENTE';

2. en las sentencias CREATE y DROP, no tienes que colocar el separador punto y coma (;) basta con que coloques la sentencia simple:

1
EXECUTE IMMEDIATE 'DROP TABLE CLIENTE';

3. Es recomendable que pongas toda la cadena en una sola línea no en varias, o en su defecto utilices concatenación, para el caso del CREATE TABLE:

1
EXECUTE IMMEDIATE 'CREATE TABLE CLIENTE(ID INT PRIMARY KEY, NOMBRE VARCHAR2(150) NOT NULL, PAIS VARCHAR2(50))';

4. Te hace falta un END para cerrar el BEGIN del PROCEDIMIENTO, al final de la sentencia,ya que sólo estás colocando el END del IF.

De tal suerte que creo que así quedaría el SP

1
2
3
4
5
6
7
8
9
10
CREATE OR REPLACE PROCEDURE CREA_TABLAS
IS
VCOUNT number :=0;
BEGIN
  SELECT COUNT(*) INTO VCOUNT FROM ALL_TABLES WHERE TABLE_NAME='CLIENTE';
  IF VCOUNT > 0 THEN
    EXECUTE IMMEDIATE 'DROP TABLE CLIENTE';
  END IF;
    EXECUTE IMMEDIATE 'CREATE TABLE CLIENTE(ID INT PRIMARY KEY, NOMBRE VARCHAR2(150) NOT NULL, PAIS VARCHAR2(50))';
END;

haz la prueba y nos comentas.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Error en procedimiento

Publicado por Maria (4 intervenciones) el 21/02/2017 19:43:05
Yeah!! --> Procedure CREA_TABLAS compilado y sin errores.
Muchisimas gracias por tu ayuda :)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar