pregunta básica de Oracle
-
30-09-2019 - |
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
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.