Pregunta

Soy nuevo en el oráculo. Cuando se crea un procedimiento almacenado mediante:

CREATE OR REPLACE PROCEDURE PROCEDURE1 
AS
BEGIN

  SELECT FIRSTNAME,
         LASTNAME
    INTO FirstName,LastName
    FROM EMPLOYEE;

END PROCEDURE1;

Me sale el siguiente error:

  

PL / SQL Declaración Ignorado    NOMBRE identificador debe ser declarada    ORA-00904 identificador no válido

¿Fue útil?

Solución


Creo que la palabra clave "AS" no va a funcionar. Si esto no funciona, a continuación, utilizar "ES".
Resto son bien y muy buenos consejos.

Si necesita ayuda con respecto a PL / SQL, entonces usted puede echar un vistazo a este enlace. Es muy simple y fácil de entender;
http://plsql-tutorial.com/

Esta es mi solución al error que está recibiendo;

CREATE OR REPLACE PROCEDURE PROCEDURE1 IS
  v_FIRSTNAME EMPLOYEE.FIRSTNAME%TYPE;
  v_LASTNAME EMPLOYEE.LASTNAME%TYPE;
  CURSOR EMPCURSOR IS
  SELECT FIRSTNAME, LASTNAME FROM EMPLOYEE;      
  BEGIN   
     IF NOT EMPCURSOR%ISOPEN THEN
         OPEN EMPCURSOR;
     END IF;
     LOOP
        FETCH EMPCURSOR INTO V_FIRSTNAME,V_LASTNAME;
        EXIT WHEN EMPCURSOR%NOTFOUND;
     END LOOP;
     IF EMPCURSOR%ISOPEN THEN
        CLOSE EMPCURSOR;
     END;
  END PROCEDURE1;

También puede utilizar DBMS_OUTPUT.PUT_LINE(V_FIRSTNAME || ','|| V_LASTNAME), dentro del bucle para mostrar la salida. pero con el fin de hacer eso, primero tiene que ejecutar el comando server output on

Otros consejos

Es necesario declarar las variables antes de intentar rellenarlas:

CREATE OR REPLACE PROCEDURE PROCEDURE1 
AS

 FirstName EMPLOYEE.FIRSTNAME%TYPE;
 LastName EMPLOYEE.LASTNAME%TYPE;

BEGIN

  SELECT FIRSTNAME,
         LASTNAME
    INTO FirstName,LastName
    FROM EMPLOYEE;

END PROCEDURE1;

La notación% TIPO es la abreviatura de declaración de tipo de datos que coincide con el tipo de datos de columna. Si ese tipo de datos cambia nunca, no es necesario actualizar el procedimiento.

Es necesario declarar las variables.

CREATE OR REPLACE
PROCEDURE PROCEDURE1 AS
 V_FIRSTNAME VARCHAR2(60);
 V_LASTNAME  VARCHAR2(60);
BEGIN
        SELECT FIRSTNAME,LASTNAME
         INTO V_FIRSTNAME ,V_LASTNAME  
         FROM EMPLOYEE;
END PROCEDURE1;

En respuesta a su comentario, las sentencias SQL en el bloque PL / SQL pueden alcanzar solamente 1 registro. Si necesita a buscar múltiples registros, que tendrá que guardar los registros en un cursor y procesarlos.

CREATE OR REPLACE
    PROCEDURE PROCEDURE1 AS

     CURSOR EMP_CUR IS
         SELECT FIRSTNAME,LASTNAME
         FROM EMPLOYEE;
    EMP_CUR_REC EMP_CUR%ROWTYPE;

    BEGIN
     FOR EMP_CUR_REC IN EMP_CUR LOOP
         -- do your processing
         DBMS_OUTPUT.PUT_LINE('Employee first name is ' || EMP_CUR_REC.FIRSTNAME);
         DBMS_OUTPUT.PUT_LINE('Employee last name is ' || EMP_CUR_REC.LASTNAME);
    END LOOP;
    END PROCEDURE1;

Para explicar:    EMP_CUR sostiene la declaración SQL para su ejecución.    EMP_CUR_REC mantiene los registros que se obtengan por la instrucción SQL.     %ROWTYPE indica que el registro será del mismo tipo de datos como la fila que contiene los datos

El FOR LOOP buscará cada registro, y se puede hacer lo que el procesamiento que se necesita hacer.

En respuesta a la respuesta de @ Sathya anterior @kayak preguntó "¿Puedo tener algo como Select * from Tablename o seleccione nombre, apellido del nombre de tabla, como el que tenemos en SQL Server".

Sí, se puede hacer eso, pero que se tendrá que incluir una cláusula WHERE o utilizar un cursor. Si incluye una cláusula WHERE que limita sus resultados a una sola fila se podría escribir algo así como

CREATE OR REPLACE PROCEDURE PROCEDURE1
IS
  rowEmployees EMPLOYEE%ROWTYPE;
BEGIN
  SELECT *
    INTO rowEmployees
    FROM EMPLOYEE
    WHERE EMPLOYEE_ID = 12345;
END PROCEDURE1; 

Por otro lado, si bien no tiene una cláusula WHERE, porque desea procesar todas las filas en la tabla, o si tiene una cláusula WHERE que no limita sus resultados a una sola fila se puede utilizar una cursor de la siguiente manera:

CREATE OR REPLACE PROCEDURE PROCEDURE1 IS
BEGIN
  FOR rowEmployees IN (SELECT *
                         FROM EMPLOYEE
                         WHERE EMPLOYEE_ID IN (12345, 67890, 111213, 141516))
  LOOP
    <do something with rowEmployees here>
  END LOOP;
END PROCEDURE1; 

Compartir y disfrutar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top