Oracle - Llamar a secuencia Oracle desde PHP. (Dice que no existe)

 
Vista:
Imágen de perfil de Ernesto

Llamar a secuencia Oracle desde PHP. (Dice que no existe)

Publicado por Ernesto (2 intervenciones) el 01/10/2013 15:36:44
Muy buenas tardes a todos,

Escribo por aqui ya que llevo horas buscando en internet, en ingles y español y nada que doy que alguna solucion posible a este problema.

Resulta que estoy trabajando una aplicacion de nomina desde PHP, cuya base de datos esta en Oracle (desconozco la version). Por ser de nomina el DBA me creo una vista con los datos que necesito mostrar (solo lectura) y una tabla para poder hacer unas validaciones en mi aplicacion (en esa si puedo escribir).

Explicado esto mi problema esta en que necesito la columna ID en AU y para ello el DBA me creó una secuencia (llamada SEC_CONSTANCIAS, por ejemplo)... Desde el manejador que uso (NAVICAT) realizo un Insert y lo hace perfecto, con la columna ID y su valor autoincremental enviando en VALUES sec_constancias.nextval. Todo perfecto hasta aqui, ya he realizado un monton de pruebas. El detalle esta que cuando intento hacerlo desde PHP, activo el debug y me dice que la secuencia no existe lo raro es que copio la misma sentencia que el debug me responde y la pego en navicat y ejecuta el INSERT sin error alguno.

Alguno le ha pasado algo parecido? O alguno ve el error que yo no. Copio y pego lo que estoy haciendo...


Para comezar estoy usando ADOBD para la conexion con ORACLE

Este es el query de prueba que si se ejecuta en NAVICAT

1
INSERT INTO PERSONAL.CONTROL_CONSTANCIAS (ID,CEDULA,CODE_CONS,FECHA_ULTIMA) VALUES (sec_constancias.nextval, 17855837, 'ABC123', '03/Jan/2013')

En la tabla PERSONAL.CONTROL_CONSTANCIAS L hay 4 campos ID number, CEDULA number, CODE varchar y por ultima la fecha DATE.

mmm.. que me falta??

Ahhh... claro, lo que estoy ejecutando en el PHP.

1
2
$query_control = " INSERT INTO PERSONAL.CONTROL_CONSTANCIAS (ID,CEDULA,CODE_CONS,FECHA_ULTIMA) VALUES (sec_constancias.nextval, 17855837, 'ABC123', '03/Jan/2013') 	";
$db->Execute($query_control);

Finalmente.. me regresa esto el debug
ORA-02289: no existe la secuencia in bla/bla/bla/bla.php

No tengo permisos en la BD, por lo que editarla o parecido no podré, a menos que espere el dia que "el consultor" (DBA) venga de nuevo, y ese señor viene 1 dia a la semana. Algunos en otros lados me comentaron que era cuestion de los permisos en la BD para los objetos, el tema es que estoy usando el mismo usuario tanto en NAVICAT como en PHP.. Es decir, para efectos de Oracle es la misma persona que esta ejecutando la llamada de la secuencia solo que lo hace de distintos sitios... Estoy llegando a pensar que existe una forma de llamar la secuencia en PHP de otra forma que desconozco y no he conseguido.

Alguien la conoce?

Muchisimas gracias a cualquier que pueda ayudarme... Saludos
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

Llamar a secuencia Oracle desde PHP. (Dice que no existe)

Publicado por luis pablo (235 intervenciones) el 01/10/2013 17:19:29
Hola Ernesto,

Como dijo frankenstein "vamos por partes" ....

Si deseas saber la versión de tu BD oracle ejecuta la siguiente sentencia select :

SELECT * FROM v$VERSION;

Al parecer tienes problemas de acceso con el sequence oracle, para esto debes comprobar que el usuario que va a usar el sequence tiene acceso a este objeto, debes validarlo en los dos casos que mencionas tanto en VANICAT y PHP si son usuarios distintos favor de validarlo para ambos, estando conectado con cada usuario ejecuta:

SELECT * FROM ALL_OBJECTS
WHERE OBJECT_TYPE='SEQUENCE'
AND OBJECT_NAME='SEC_CONSTANCIAS';

Para determinar todos los objetos que tiene acceso tu usuario con el que estas conectado, en este caso los tipos de objeto SEQUENCE.

Ahora...hay varias maneras de realizar un insert en una tabla :

-Una puede ser ejecutando directamente la sentencia insert desde la aplicación para esto el usuario de la aplicación debe tener privilegios directos con el objeto sequence.

-Otra es que se puede ejecutar un procedimiento de BD oracle donde dentro se encuentre la sentencia insert, para esto solo basta que al usuario de la aplicacion se le conceda privilegio de ejecucion al procedimiento de BD y no directamente al sequence. Por ejemplo el usuario USER1 crea un procedimiento de BD el cual usa el sequence, entonces USER1 es el propietario del proc de BD, luego otro usuario USERAPP quiere usar el procecedimiento de USER1 para utilizar el sequence, para esto solo basta otorgarle privilegios de ejecucion del proc creado por USER1 a USERAPP, al final cuando USERAPP ejecute el proc internamente se estará usando el sequence con los privilegios de USER que es el propietario del proc de BD, en este caso no es necesario otorgar los privilegios de acceso al sequence a USERAPP, solo basta con que ejecute el proc de BD.

Favor de validar estas situaciones, para descartar que se problemas de privilegio, ejecuta primero las senetencias select que te muestro lineas arriba en ambos ambientes de trabajo VANICAT y PHP .

Espero haberte orientado, me comentas que tal te fue.

Saludos

Luis Pablo.
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

Llamar a secuencia Oracle desde PHP. (Dice que no existe)

Publicado por Alixandro (63 intervenciones) el 10/10/2013 18:22:30
Ernesto, segun tus comentarios, dices que para ambos acceso utiliza el mismo usuario y clave, siendo asi, debes verificar la forma en cada aplicacion entrega los procesos faraneo. pero de todos modo, puede probar dejando el incremento de la secuencia del lado oracle, me explico, en ves de enviar la sentencia sec_constancias.nextval como parte del insert, crea un trigger sobre la tabla donde se va a hacer el insert. ejemplo:

create trigger sec_constancia
before insert on PERSONAL.CONTROL_CONSTANCIAS
for each row
declare
error_pk exception;
error_no integer := -000001;
error_ms varchar2(200) := 'Clave primaria duplicada';
begin
if :new.id is null then
Select sec_constancias.nextval into :new.id From dual;
end if;
exception when error_pk then
raise_application_error(error_no,error_ms);
end;
/

nota: debe asegurar que inicialmente la tabla CONTROL_CONSTANCIAS esta vacía, de lo contrario se presentara el error ora-0000001, si no puedes vaciar la tabla por circunstancias obvia, entonces debes recrear la sec_constancias iniciando a partir del último ID registrada en la tabla CONTROL_CONSTANCIAS.

Espero verte ayudado. Nos comenta.
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
Imágen de perfil de Ernesto

Llamar a secuencia Oracle desde PHP. (Dice que no existe)

Publicado por Ernesto (2 intervenciones) el 10/10/2013 18:29:12
Uy buenisimo!!... Aunque tuve que hacerme de una tabla en MySQL (aparte) para poder hacer persistencia ya que querian la aplicacion para ayer, esto me va a servir para arreglarlo ahora que ya esta en produccion.

Muchisimas gracias por las respuestas, voy a intentar las dos opciones y les comento que tal me fue!!! hehe agradecido de verdad por las respuestas
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

Llamar a secuencia Oracle desde PHP. (Dice que no existe)

Publicado por Jose (1 intervención) el 25/11/2013 19:35:39
buenas tarde; estoy haciendo un sistema pero tengo problemas con las Base de Datos: el problema es le siguiente,

el sistema que cree esta echo en php Dreamweaver CS6 , y estoy administrando la Base de dato con phpmyadmin 3.4.5, pero la empresa me exige que envie datos de oracle hacia phpmyadmin.

yo ya logro hacer una consulta de php hacia oracle, y puedo consultar las tablas de oracle, ahora no encuentro como hacer esa conexion entre las base de datos y que esa base de datos en phpmyadmin se actualice cada ves que se actualice la de oracle agradeceria su 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