Основной вопрос Oracle
-
30-09-2019 - |
Вопрос
Я новичок в Oracle. Когда я создаю сохраненную процедуру с использованием:
CREATE OR REPLACE PROCEDURE PROCEDURE1
AS
BEGIN
SELECT FIRSTNAME,
LASTNAME
INTO FirstName,LastName
FROM EMPLOYEE;
END PROCEDURE1;
Я получаю следующие ошибки:
PL / SQL Заявление Игнорируемое идентификатор Имя должно быть объявлено ORA-00904 Неверный идентификатор
Решение
Я думаю, что «как» ключевое слово не будет работать. Если это не работает, то используйте «is».
Отдых в порядке и очень хорошие советы.
Если вам нужна помощь в отношении PL / SQL, то вы можете посмотреть на эту ссылку. Это очень просто и легко понять;
http://plsql-tutorial.com/
Это мое решение ошибки, которое вы получаете;
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;
Вы также можете использовать DBMS_OUTPUT.PUT_LINE(V_FIRSTNAME || ','|| V_LASTNAME)
, Внутри петли для отображения вывода. Но для того, чтобы сделать это, вам сначала нужно выполнить команду server output on
Другие советы
Вам нужно объявить переменные, прежде чем пытаться заполнить их:
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;
Обозначение типа% является сокращением для декларации типа данных, соответствующей типу данных столбца. Если этот тип данных когда-либо меняется, вам не нужно обновлять процедуру.
Вам нужно объявить переменные.
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;
В ответ на ваш комментарий, SQL-операторы в блоке PL / SQL могут получать только 1 запись. Если вам нужно сделать несколько записей, вам нужно будет хранить записи в курсоре и обработать их.
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;
Объяснить: EMP_CUR
Удерживает оператор SQL для выполнения. EMP_CUR_REC
Удерживает записи, которые будут выявлены оператором SQL. %ROWTYPE
Указывает, что запись будет одинаковым типом данных, что и строка, которая содержит данные
То FOR LOOP
будет получать каждую запись, и вы можете сделать любую обработку, которая должна быть сделана.
В ответ на ответ @ Sathya выше @kayak спросил "Могу ли я иметь что-то вроде выбора * из tableName или выберите первый случай, фамилия из таблицы, как у нас в SQL Server".
Да, вы можете сделать это, но вам либо нужно будет включать предложение там или использовать курсор. Если вы включите пункт откуда, который ограничивает ваши результаты в одну строку, вы можете написать что-то вроде
CREATE OR REPLACE PROCEDURE PROCEDURE1
IS
rowEmployees EMPLOYEE%ROWTYPE;
BEGIN
SELECT *
INTO rowEmployees
FROM EMPLOYEE
WHERE EMPLOYEE_ID = 12345;
END PROCEDURE1;
С другой стороны, если у вас тоже нет пункт, потому что вы хотите обработать все строки в таблице, или у вас есть пункт, который не ограничивает ваши результаты одному ряду, вы можете использовать курсор в следующим образом:
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;
Поделиться и наслаждайтесь.