Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

Tipo no reconocido en SP

Estas en el tema de Tipo no reconocido en SP en el foro de Oracle en Foros del Web. Tengo in problema que no logro entender y resolver. Como contexto: Lo estoy trabajando con el Oracle 11g Express, y toda a documentación que encuentro ...
  #1 (permalink)  
Antiguo 31/05/2012, 08:23
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Tipo no reconocido en SP

Tengo in problema que no logro entender y resolver.
Como contexto: Lo estoy trabajando con el Oracle 11g Express, y toda a documentación que encuentro me dice que está bien escrito, sin embargo cuando intento compilarlo, declara un error diciendo que se encontró el símbolo "T_EMPLOY", donde espera := . % (.
Sin embargo la declaración de TYPE se toma correctamente.
¿Por qué no reconoce el tipo? ¿Qué hay que corregir?

Código SQL:
Ver original
  1. CREATE OR REPLACE PROCEDURE "IniciarTabla" IS
  2. BEGIN
  3.     TYPE t_employ IS TABLE OF EMPLOYEES%ROWTYPE;
  4.     t_row t_employ;
  5.     SELECT *
  6.     BULK COLLECT INTO t_row
  7.         FROM EMPLOYEES;
  8.  
  9.     FORALL i IN t_row.FIRST .. t_row.LAST
  10.     UPDATE EMPLOYEES SET BAJA = SYSDATE;
  11.  
  12.     FORALL i IN t_row.FIRST .. t_row.LAST
  13.     INSERT INTO EMPLOYEES(
  14.         EMPLOYEE_ID,
  15.         FIRST_NAME,
  16.         LAST_NAME,
  17.         EMAIL,
  18.         PHONE_NUMBER,
  19.         HIRE_DATE,
  20.         JOB_ID,
  21.         SALARY,
  22.         COMMISSION_PCT,
  23.         MANAGER_ID,
  24.         DEPARTMENT_ID)
  25.     VALUES(
  26.         EMPLOYEES_SEQ.NEXTVAL,
  27.         i.FIRST_NAME,
  28.         i.LAST_NAME,
  29.         i.EMAIL,
  30.         i.PHONE_NUMBER,
  31.         SYSDATE,
  32.         i.JOB_ID,
  33.         i.SALARY
  34.         i.COMMISSION_PCT,
  35.         i.MANAGER_ID,
  36.         i.DEPARTMENT_ID);
  37.     COMMIT;
  38. END;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #2 (permalink)  
Antiguo 31/05/2012, 09:02
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 16 años, 10 meses
Puntos: 43
Respuesta: Tipo no reconocido en SP

Pues lo mismo es porque no los has puesto en el declare.

CREATE OR REPLACE PROCEDURE "IniciarTabla" IS

TYPE t_employ IS TABLE OF EMPLOYEES%ROWTYPE;
t_row t_employ;

BEGIN

SELECT *
BULK COLLECT INTO t_row
FROM EMPLOYEES;
  #3 (permalink)  
Antiguo 31/05/2012, 09:14
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Tipo no reconocido en SP

Lo voy a intentar a nivel de consola, porque el OE te encierra todo entre BEGIN/END cuando usas el asistente. Luego te comento.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 31/05/2012, 10:30
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Tipo no reconocido en SP

Bueno, a nivel de consolta, anduvo.
Ahora surge este inconveniente: Siguiendo modelos de ejemplo en los foros de Oracle, necesito usar un FORALL para recorrer todo el resultado del BULK SELECT, pero al compilar, el sistema me dice que no puedo referenciar campos directamente en un FORALL.
Muestro:
Código SQL:
Ver original
  1. CREATE OR REPLACE PROCEDURE "IniciarTabla" IS
  2. TYPE t_employ IS TABLE OF EMPLOYEES%ROWTYPE;
  3. t_employ;
  4. BEGIN
  5.     SELECT
  6.         EMPLOYEE_ID,
  7.         FIRST_NAME,
  8.         LAST_NAME,
  9.         EMAIL,
  10.         PHONE_NUMBER,
  11.         HIRE_DATE,
  12.         JOB_ID,
  13.         SALARY,
  14.         COMMISSION_PCT,
  15.         MANAGER_ID,
  16.         DEPARTMENT_ID,
  17.         NULL
  18.     BULK COLLECT INTO t_row
  19.         FROM EMPLOYEES;
  20.  
  21.         // En este punto me dice que t_row(i).EMPLOYEE_ID no se puede usar....
  22.         FORALL i IN t_row.FIRST .. t_row.LAST
  23.     UPDATE EMPLOYEES SET BAJA = SYSDATE
  24.     WHERE EMPLOYEE_ID = t_row(i).EMPLOYEE_ID;
  25.  
  26.     FORALL i IN t_row.FIRST .. t_row.LAST
  27.     INSERT INTO EMPLOYEES(
  28.         EMPLOYEE_ID,
  29.         FIRST_NAME,
  30.         LAST_NAME,
  31.         EMAIL,
  32.         PHONE_NUMBER,
  33.         HIRE_DATE,
  34.         JOB_ID,
  35.         SALARY,
  36.         COMMISSION_PCT,
  37.         MANAGER_ID,
  38.         DEPARTMENT_ID,
  39.         BAJA)
  40.     VALUES(
  41.         EMPLOYEES_SEQ.NEXTVAL,
  42.         t_row(i).FIRST_NAME,
  43.         t_row(i).LAST_NAME,
  44.         t_row(i).EMAIL,
  45.         t_row(i).PHONE_NUMBER,
  46.         SYSDATE,
  47.         t_row(i).JOB_ID,
  48.         t_row(i).SALARY,
  49.         t_row(i).COMMISSION_PCT,
  50.         t_row(i).MANAGER_ID,
  51.         t_row(i).DEPARTMENT_ID,
  52.         NULL);
  53.     COMMIT;
  54. END;

¿Cómo sería la forma correcta para hacer lo que necesito?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 31/05/2012, 13:00
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Tipo no reconocido en SP

Hola gnzsoloyo.

No se si tenga que ver, pero no has declarado la variable t_row .

En el declare debe ir:
TYPE t_employ IS TABLE OF EMPLOYEES%ROWTYPE;
t_row t_employ;


En caso de no ser eso, puedes compartir el codigo de error que te genera?

Saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #6 (permalink)  
Antiguo 31/05/2012, 13:21
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Tipo no reconocido en SP

En realidad, si está declarada. eso es un error de Copy+Paste.
El código es:
Código SQL:
Ver original
  1. CREATE OR REPLACE PROCEDURE "IniciarTabla" IS
  2.     TYPE t_employ IS TABLE OF EMPLOYEES%ROWTYPE;
  3.     t_row t_employ;
  4. BEGIN
  5.     SELECT
  6.         EMPLOYEE_ID,
  7.         FIRST_NAME,
  8.         LAST_NAME,
  9.         EMAIL,
  10.         PHONE_NUMBER,
  11.         HIRE_DATE,
  12.         JOB_ID,
  13.         SALARY,
  14.         COMMISSION_PCT,
  15.         MANAGER_ID,
  16.         DEPARTMENT_ID,
  17.         SYSDATE
  18.     BULK COLLECT INTO t_row
  19.         FROM EMPLOYEES;
  20.  
  21.     FORALL i IN t_row.FIRST .. t_row.LAST
  22.     UPDATE EMPLOYEES SET BAJA = SYSDATE
  23.     WHERE EMPLOYEE_ID = t_row(i).EMPLOYEE_ID;
  24.          
  25.  
  26.     FORALL i IN t_row.FIRST .. t_row.LAST
  27.     INSERT INTO EMPLOYEES(
  28.         EMPLOYEE_ID,
  29.         FIRST_NAME,
  30.         LAST_NAME,
  31.         EMAIL,
  32.         PHONE_NUMBER,
  33.         HIRE_DATE,
  34.         JOB_ID,
  35.         SALARY,
  36.         COMMISSION_PCT,
  37.         MANAGER_ID,
  38.         DEPARTMENT_ID)
  39.     VALUES(
  40.         EMPLOYEES_SEQ.NEXTVAL,
  41.         t_row(i).FIRST_NAME,
  42.         t_row(i).LAST_NAME,
  43.         t_row(i).EMAIL,
  44.         t_row(i).PHONE_NUMBER,
  45.         SYSDATE,
  46.         t_row(i).JOB_ID,
  47.         t_row(i).SALARY,
  48.         t_row(i).COMMISSION_PCT,
  49.         t_row(i).MANAGER_ID,
  50.         t_row(i).DEPARTMENT_ID);
  51.     COMMIT;
  52. END;
y la respuesta:
Código SQL:
Ver original
  1. Line    POSITION    Text
  2. 23  22  PLS-00436: restricción de implementación: no se puede hacer referencia a campos de la tabla de registros BULK In-BIND
  3. 23  22  PLS-00382: el tipo de la expresión no es correcto
  4. 23  22  PL/SQL: ORA-22806: no es un objeto ni un elemento REF
  5. 22  2   PL/SQL: SQL Statement ignored
  6. 41  3   PLS-00436: restricción de implementación: no se puede hacer referencia a campos de la tabla de registros BULK In-BIND
  7. 41  3   PLS-00382: el tipo de la expresión no es correcto
  8. 42  3   PLS-00436: restricción de implementación: no se puede hacer referencia a campos de la tabla de registros BULK In-BIND
  9. 42  3   PLS-00382: el tipo de la expresión no es correcto
  10. 43  3   PLS-00436: restricción de implementación: no se puede hacer referencia a campos de la tabla de registros BULK In-BIND
  11. 43  3   PLS-00382: el tipo de la expresión no es correcto
  12. 44  3   PLS-00436: restricción de implementación: no se puede hacer referencia a campos de la tabla de registros BULK In-BIND
  13. 44  3   PLS-00382: el tipo de la expresión no es correcto
  14. 46  3   PLS-00436: restricción de implementación: no se puede hacer referencia a campos de la tabla de registros BULK In-BIND
  15. 46  3   PLS-00382: el tipo de la expresión no es correcto
  16. 47  3   PLS-00436: restricción de implementación: no se puede hacer referencia a campos de la tabla de registros BULK In-BIND
  17.         1 - 15

Yo entiendo lo que me responde, pero lo que me dice no se ajusta a ningún manual ni ejemplo de BULK COLLECT / FORALL que haya encontrado y que usé como base para esto.

Agradezco cualquier guía.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 02/06/2012, 16:39
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Tipo no reconocido en SP

Hola gnzsoloyo.

Traté de replicar tu error, pero me corrió de maravillas.

Repliqué en mi esquema HR tu procedimiento almacenado. Después de ajustar algunos detalles (quitar unique constraint del email y adicionar una columna baja) el procedure me corrió sin problemas.


Algo has de tener en tu esquema original (datos confidenciales), con tus datos originales en el que no hagas referencia correctamente a la tabla en memoria que creas. Posiblemente el resultado del bulk collect está vacío y al tratar de hacer referencia a estos objetos no encuentra nada.


Con esto te puedo decir que el error no parece estar donde crees que está.

Tienes forma de hacer un test al procedimiento? Usas plsql developer? Si lo puedes correr paso a paso, puedes mantener el control de todo lo que se asigna es ideal. S no lo tienes, te recomiendo realizar bloques anónimos internos para controlar el error e imprimir en la salida el estado de las variables.

Solo por curiosidad, que versión de oracle trabajas?

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #8 (permalink)  
Antiguo 28/08/2012, 07:33
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Tipo no reconocido en SP

Finalmente, el error, en el cuerpo del SP fina que probaba en el servidor Oracle era taaaan elemental que casi me pongo a darme la cabeza contra el escritorio cuando lo vi:
Faltaba un ";" al final de una sentencia...

Aaaaghhhh!

Una vez corregido, fue todo sobre rieles...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: select, tabla, tipo
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:45.