Вопрос

Я новичок в 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; 

Поделиться и наслаждайтесь.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top