3

我是甲骨文的新手。当我使用以下方法创建存储过程时:

CREATE OR REPLACE PROCEDURE PROCEDURE1 
AS
BEGIN

  SELECT FIRSTNAME,
         LASTNAME
    INTO FirstName,LastName
    FROM EMPLOYEE;

END PROCEDURE1;

我收到以下错误:

PL/SQL 语句忽略标识符 FIRSTNAME 必须声明 ORA-00904 标识符无效

4

4 回答 4

7

您需要在尝试填充变量之前声明变量:

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;

%TYPE 表示法是与列数据类型匹配的数据类型声明的简写。如果该数据类型发生变化,您无需更新该过程。

于 2010-12-02T17:33:09.627 回答
3

您需要声明变量。

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;

在回复您的评论时,PL/SQL 块中的 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表示 Record 将与保存数据的行具有相同的数据类型

FOR LOOP获取每条记录,您可以进行任何需要完成的处理。

于 2010-12-02T17:31:50.170 回答
2


我认为“AS”关键字不起作用。如果它不起作用,则使用“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

于 2010-12-02T17:45:09.557 回答
1

在回复@Sathya 在@kayak 上面的回答时,我问“我可以有类似 Select * from Tablename 或 select firstname,lastname from tablename 的东西,就像我们在 sql server 中一样”。

是的,您可以这样做,但您需要包含 WHERE 子句或使用游标。如果您包含将结果限制为单行的 WHERE 子句,您可以编写类似的内容

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

另一方面,如果您没有 WHERE 子句,因为您希望处理表中的所有行,或者您有一个 WHERE 子句不将结果限制为单行,则可以在以下方式:

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; 

分享和享受。

于 2010-12-03T12:17:22.457 回答