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

CREATE OR REPLACE PROCEDURE PROCEDURE1 
AS
BEGIN

  SELECT FIRSTNAME,
         LASTNAME
    INTO FirstName,LastName
    FROM EMPLOYEE;

END PROCEDURE1;

我得到以下错误:

PL/SQL语句忽略标识符的名称必须被声明为ORA-00904无效标识符

有帮助吗?

解决方案


我认为“ 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

其他提示

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

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;

在回复您的评论时,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 表示记录将与保存数据的行相同的数据类型

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

在回应 @sathya上面的@kayak的答案中,@kayak问:“我可以从tableName中选择 * select * select * select firstName,tableName中的lastname,就像我们在sql server中一样的东西”。

是的,您可以做到这一点,但是您要么需要包括一个子句或使用光标。如果您包含一个将结果限制在一行中的WERY子句,则可以写出类似的内容

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